Взгляды MVC: логика дисплея? - PullRequest
       6

Взгляды MVC: логика дисплея?

4 голосов
/ 16 сентября 2009

Я читал эту статью: Обеспечение строгого разделения представления модели в механизмах шаблонов (PDF).

Он утверждает, что вам нужно только четыре конструкции в представлениях:

  1. ссылка на атрибут
  2. условное включение шаблона на основе наличия / отсутствия атрибута
  3. рекурсивные ссылки на шаблоны
  4. шаблон приложения к многозначному атрибуту, похожему на лямбда-функции и оператор карты LISP

Никакая другая логика не допускается в представлении - например, if (attr < 5) не будет разрешено, только if (valueLessThanFive)

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

Для таблиц с полосками зебры в статье предлагается отобразить список шаблонов в список данных, например:

map(myList, [oddRowTemplate, evenRowTemplate])

Но что, если вы хотите сделать первый и последний ряд разными стилями? Что, если 3-й ряд должен быть фиолетовым по вторникам, потому что ваш графический дизайнер злится? Они зависят от вида (например, если бы я выводил те же данные, что и XML, я бы их не использовал), поэтому они не относятся к модели или контроллеру.

В итоге:

  • Вам нужна логика над четырьмя конструкциями, перечисленными выше в представлениях?
    • Если так, как вы ограничиваете проникновение бизнес-логики?
    • Если нет, то как бы вы покрасили 3-й ряд по вторникам?

Ответы [ 2 ]

2 голосов
/ 16 сентября 2009

Теренс Парр - очень умный парень, и его статья может похвалить его, но с практической точки зрения я обнаружил, что использование просто этих конструкций несколько ограничивает.

трудно предотвратить проникновение бизнес-логики, особенно если у вас есть возможность что-либо делать, как, например, ASP.NET и JSP дадут вам. Это сводится к тому, как вы проводите свое время:

  1. Разрешить ограниченную дополнительную функциональность (я не сторонник "все идет") и использовать механизмы проверки кода для обеспечения правильного использования, или
  2. Ограничивайтесь четырьмя конструкциями, приведенными выше, и тратьте больше времени на предоставление таких атрибутов, как valueLessThanFive (не забывая переименовывать его в valueLessThanSix при изменении бизнес-требований или добавляя valueMoreThanThree - в качестве примера это немного шутливо, но я думаю, вы поймете, к чему я клоню).

На практике я считаю, что использование условных и циклических конструкций полезно, так же как и разрешение свойств, таких как attr[index].value в шаблонных выражениях. Это позволяет эффективно управлять логикой представления, в то же время подвергаясь лишь небольшому риску неправильного использования.

Предоставление большей функциональности, такой как произвольные вызовы методов, становится все более «опасным» (с точки зрения облегчения неправильного использования). В некоторой степени это зависит от культуры развития, существующей в вашей среде, процессов разработки и уровня навыков и опыта в вашей команде.

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

0 голосов
/ 16 сентября 2009

Чтобы ответить на ваш вопрос о 3-й строке пурпурного по вторникам:

Исходный (или один из самых ранних) паттернов MVC имел «View» как представление данных, в паттерне не было концепции UI. Современные версии шаблона MVC чувствовали необходимость в этом представлении данных, поэтому у нас есть такие вещи, как MVVM, MVP, даже MV-poo . Как только вы сможете создать «представление» ваших данных, относящихся к представлению пользовательского интерфейса, вам будет легче решить многие проблемы.

В нашем случае наша «модель» получит дополнительные свойства, такие как Стиль или Цвет (стиль лучше, поскольку он позволяет представлению определять, как этот стиль представлен). Контроллер будет принимать необработанные элементы «модели» и представлять на просмотр пользовательские элементы «модели» с этим дополнительным стилем, предоставляя 3-й строке по вторникам стиль «MadDesignerSpecial», который используется для представления фиолетового цвета.

...