Антипаттерны и запахи

Все паттерны, которые так или иначе теснее связывают сущности между собой, можно назвать антипаттернами.

Связывание через конкретные классы

Проблемы связывания через конкретные классы мы рассмотрели в примере из раздела «В идеальном мире». Класс AreaCalculator изначально зависел от конкретного класса Rectangle, из-за чего при изменении требований, приходилось обновлять код этого класса.

Когда мы ввели прослойку в виде интерфейса Shape, класс AreaCalculator начинал зависеть от интерфейса, а не от конкретных классов, изменение в требованиях перестало затрагивать код класса AreaCalculator.

Синглтон

Синглтон — это паттерн, при котором в приложении существует только один экземпляр какого-то класса. Существующий синглтон гарантирует, что все новые созданные объекты будут ссылаться на него.

Если синглтон содержит в себе общее состояние или глобальные переменные, либо сам является глобальной сущностью, то связывание объектов с ним чрезмерно высокое.

Это может приводить к ситуациям, когда при изменении требований приходится менять и сам синглтон, и все объекты, которые с ним связаны.

Синглтон можно использовать и без высокого сцепления модулей (применяя, например, абстрактные интерфейсы), но это значительно усложняет структуру проекта.

Легковес

Легковес — шаблон, который уменьшает расход памяти, держа общее состояние объектов внутри себя, вместо хранения одинаковых данных в каждом объекте.

Его проблема с точки зрения OCP в том же высоком связывании модулей. Если сущность выступает в роли общего контекста для нескольких объектов, при изменении требований придётся менять код каждого модуля.

Как и в случае с синглтоном, с легковесом можно работать без высокого сцепления, но это также будет увеличивать сложность.

Материалы к разделу

Вопросы