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

Asked
Viewd503

3

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

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

Так какая реализация пассивного просмотра лучше?

  • ActionScript 3.0, но это не имеет значения

    subb26 мая 2009, 17:48

3 ответов

4

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

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

 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;
    }
 

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

1

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

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

1

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

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

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


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

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

  • Кроме того, я пытаюсь понять шаблон пассивного представления. Я сейчас ни для чего не использую. Я отредактировал вопрос, чтобы было понятнее.

    subb26 мая 2009, 18:34
  • Насчет второго вы правы. Я тоже этим не пользуюсь. Кроме того, насколько я понимаю пассивное представление, представление не должно быть связано с моделью. Роль докладчика - извлекать данные из модели и передавать их в представление. http://www.martinfowler.com/eaaDev/PassiveScreen.html

    subb26 мая 2009, 17:45