Антипаттерны и запахи
Все паттерны, которые так или иначе теснее связывают сущности между собой, можно назвать антипаттернами.
Связывание через конкретные классы
Проблемы связывания через конкретные классы мы рассмотрели в примере из раздела «В идеальном мире». Класс AreaCalculator
изначально зависел от конкретного класса Rectangle
, из-за чего при изменении требований, приходилось обновлять код этого класса.
Когда мы ввели прослойку в виде интерфейса Shape
, класс AreaCalculator
начинал зависеть от интерфейса, а не от конкретных классов, изменение в требованиях перестало затрагивать код класса AreaCalculator
.
Синглтон
Синглтон — это паттерн, при котором в приложении существует только один экземпляр какого-то класса. Существующий синглтон гарантирует, что все новые созданные объекты будут ссылаться на него.
Если синглтон содержит в себе общее состояние или глобальные переменные, либо сам является глобальной сущностью, то зацепление объектов с ним чрезмерно высокое.
Это может приводить к ситуациям, когда при изменении требований приходится менять и сам синглтон, и все объекты, которые с ним связаны.
Синглтон можно использовать и без высокого зацепления модулей (применяя, например, абстрактные интерфейсы), но это значительно усложняет структуру проекта.
Легковес
Легковес — шаблон, который уменьшает расход памяти, держа общее состояние объектов внутри себя, вместо хранения одинаковых данных в каждом объекте.
Его проблема с точки зрения OCP в том же высоком связывании модулей. Если сущность выступает в роли общего контекста для нескольких объектов, при изменении требований придётся менять код каждого модуля.
Как и в случае с синглтоном, с легковесом можно работать без высокого зацепления, но это также будет увеличивать сложность.