Нарушает ли Пассивный взгляд Закон Деметры?

StackOverflow https://stackoverflow.com/questions/911817

  •  06-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь понять, как правильно использовать пассивный просмотр.Мне кажется, что каждый пример, который я рассматриваю с Пассивной точки зрения, нарушает Закон Деметры :

//In the presenter code
myview.mytextfield.text = "whatever";

Итак, какова лучшая реализация Passive View?

Это было полезно?

Решение

Во-первых, Закон Деметры, как и большинство правил программирования, является скорее принципом или ориентиром, и бывают случаи, когда принцип неприменим.При этом, как говорится, Закон Деметры на самом деле не применим к Пассивный Вид потому что причина для закона в данном случае не является проблемой.

Закон Деметры пытается предотвратить цепочку зависимостей, таких как:

objectA.objectB.objectC.DoSomething();

Очевидно, что если реализация ObjectB изменится на использование objectD вместо этого, то это нарушит зависимость ObjectA и вызовет ошибку компиляции.Доведенный до крайности, вы в конечном итоге прибегаете к операции с дробовиком каждый раз, когда цепочка нарушается изменением реализации.

В случае Пассивный Вид

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

Таким образом, приведенный вами пример обычно был бы реализован:

//from presenter
view.MeaningfulName = "data";

В то время как вид был бы чем-то вроде:

//from view
public string MeaninfulName
{
    get
    {
        return someControl.text;
    }
    set
    {
        someControl.text = value;
    }

Надеюсь, это немного прояснит ситуацию.

Другие советы

Лучшей реализацией было бы наличие API между презентером и представлением.Докладчик будет передавать данные в свое представление с помощью одного метода (определенного в интерфейсе представления).Представление будет управлять новым вводом в соответствии с некоторой внутренней логикой.

Следовательно, Ведущему не обязательно ничего знать о Представлении, и Закон Деметры безопасен.

Ладно, ну, да, это делает нарушите Закон Деметры, который в основном гласит, что интерфейс к объекту не должен раскрывать реализацию объекта.Но с другой стороны, второй тоже дает чертовски много подсказок по реализации.

Я думаю, пришло время спросить, правильный ли у вас интерфейс в целом.Что являются эти текстовые поля?Кто устанавливает их в поле зрения?Разве представление не должно запрашивать у Модели данные, а не наоборот?

Возможно, вам нужен шаблон Observer - модель ведет список заинтересованных сторон и уведомляет их при изменении своего внутреннего состояния.


Ах, это Пассивный взгляд.Давненько я на это не смотрел.По сути, я вижу две части:один из них заключается в том, что, заставляя контроллер (а не модель) управлять всеми обновлениями, для (я полагаю) эффективности он предоставляет конкретные методы полей для обновления этих полей.Это действительно нарушает Закон Деметры, который, в конце концов, всего лишь "закон" в некотором метафорическом смысле, как Закон Мерфи.Хотя обычно это хорошая идея.В этом случае я бы переделал представление и использовал его как фасад для переноса обновлений в отдельное поле.

Однако вам не нужен шаблон Observer, потому что теперь у вас есть Контроллер, который выполняет все обновления.Это добавляет некоторую сложность и подверженность ошибкам ко всему коду, потому что теперь вам нужно написать контроллер для выполнения параллельных обновлений.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top