Каким твердым принципам следует / нарушает паттерн наблюдателя? - PullRequest
0 голосов
/ 04 июня 2018

Я готовлюсь к экзамену и сейчас читаю о схеме наблюдателя.Тогда мне было интересно, по каким ТВЕРДЫМ принципам следует или нарушает паттерн наблюдателя?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Шаблоны проектирования - как следует из их названия - только шаблоны.Их фактическая реализация может сильно различаться в разных приложениях.

В общем, наиболее важным принципом SOLID, связанным с Observer, является принцип открытия / закрытия: после того, как вы написали код наблюдаемого объекта, вам не нужно менятькод, если вы хотите, чтобы дополнительные наблюдатели знали об этом, но добавить таких наблюдателей легко - это именно то, что означает «закрыто для изменений, открыто для расширений».

Это также можно рассматривать как применение зависимостиПринцип инверсии: наблюдаемый субъект применяет известный API, в котором тот, кто хочет его наблюдать, должен следовать некоторым правилам, и, в частности, наблюдаемый субъект будет вызывать свою функцию update() вместо вызова определенных функций наблюдателей.Таким образом, если наблюдатели должны быть изменены, наблюдаемый класс не имеет ничего общего (сравните это с возможностью вызова конкретной функции наблюдателя).

В базовой классической реализации (т. Е. ИзGoF), могут быть нарушения SRP и ISP.

В этой реализации изменяемый объект отвечает за обновление наблюдателей.Это еще одна ответственность, которую несет класс, в дополнение к его основной ответственности.Таким образом, существует более одной «причины» для обновления класса в будущем - если необходимо изменить механизм обновления (например, использовать другой контейнер, использовать механизм, ориентированный на многопотоковое исполнение и т. Д.), - изменение произойдеттот же класс, который несет совершенно другую основную ответственность.Конечно, это может быть решено путем отделения механизма «Наблюдатель» от другого класса.

Другое возможное нарушение SOLID упрощенной реализацией состоит в том, что в соответствии с этой реализацией GoF каждый обновленный наблюдатель должен затем проверять состояниенаблюдаемого субъекта, чтобы обнаружить изменение.Это может означать, что не существует сегрегации интерфейса, поскольку любой наблюдатель должен подвергаться воздействию всего, что находится в наблюдаемом объекте.Однако он не должен работать таким образом, и очень легко предоставить немного более сложные реализации, которые используют разные интерфейсы для разных наблюдателей.

Шаблон не имеет большого отношения к принципу подстановки Лискова -до тех пор, пока наследование (например, наследование наблюдателя и наблюдаемых типов по конкретным типам) не будет делать то, что они не должны делать, этот принцип будет соблюдаться.

0 голосов
/ 04 июня 2018

Мои собственные мысли:

Я думаю, что это следует за OCP, потому что вы можете расширить код новыми наблюдателями в будущем, вместо того, чтобы модифицировать существующий код, чтобы эти новые наблюдатели соответствовали. Это также следует ISP, потому чтоИнтерфейс субъекта и наблюдателя является точным и небольшим для конкретной работы, которую должен выполнять наблюдатель / субъект.

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

...