Начиная с разработкой программного обеспечения с помощью MVC, OO и [закрытых] Шаблонов разработки

Примечание: Этот вопрос был обновлен для обеспечения большего количества детали и понимания, чем ранее.

ОБНОВЛЕНИЕ: Я просто хочу сказать спасибо всем, кто ответил. Я все еще в значительной степени в темноте по поводу того, какой шаблон разработки работал бы лучше всего на Виджет. Возможно, один из шаблонов Фабрики или Разработчика?


Я просто начинаю на новом проекте и потребности использовать MVC, OO и шаблоны разработки.

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

Высокоуровневые требования

  • страница, которая отображает ряд (только HTML) виджеты.
  • данные виджета будут базироваться от запроса базы данных.
  • страница может использоваться для просмотра отдельных наборов данных, содержащих столь же размеченные данные. Например, единственная страница отобразит виджеты, которые сообщают относительно различных аспектов производительности единственного студента.
  • хочу видеть производительность другого студента, потянуть другую страницу. Отображение различных виджетов для различных студентов не нужно (хотя может быть хорошо иметь позже).
  • Могут быть многие студенты, но данные, содержавшиеся в базе данных, так же размечаются для всех студентов.
  • путем виджет отображен, может быть изменен легко (скажите что изменение виджета от отображения как круговая диаграмма для отображения как столбиковая диаграмма).
  • виджеты должны быть в состоянии быть созданными быстро.

Низкоуровневые требования

  • В настоящее время данные не изменяются так, виджеты не должны будут автоматически обновлять себя.
  • Виджеты могут представить отношение двух вещей (например, отношение проваленных тестов к успешным тестам как круговая диаграмма), серия точек или иногда единственное числовое значение.
  • Разработка новых виджетов должна быть бризом, существующий код не должен быть изменен.
  • Платформа, которая будет использоваться: Платформа Зенда, на основе MVC.

Существует (минимально) три вещи определить виджет: набор данных для создания отчетов относительно (в примере выше, студенческий идентификатор), запрос, который описывает метрику, о которой сообщают, и режим рендеринга (столбиковая диаграмма, timeseries и т.д.).

Вот передача при разрушении обязанностей каждого слоя MVC:

Посмотреть: Представления зенда являются шаблонами HTML с введенным PHP. Они будут содержать один из нескольких типов виджетов. Виджеты имеют различные формы включая: статические изображения JPEG (загруженный из удаленного сайта т.е.: <img src="http://widgetssite.com?x=2&y=3"/>, JSON основывал виджеты JavaScript или диаграммы различных видов (круговая диаграмма, столбиковая диаграмма и т.д.)

Контроллер: Создает виджеты, присваивает их представлению впоследствии. Набор виджетов, который должен быть отображен на странице, должен сохраняться где-нибудь. Так как я не могу думать о хорошем способе сделать это в представлении, я добавлю это к обязанностям по контроллерам на данный момент. Если существует лучшее место для этого, кричите. Контроллер должен будет также обработать любые другие входные параметры и передачу их к виджету. Например, data_set идентификатор, который может быть передан в строке URL как http:/.../report/?student_id=42

Модель: модель, в Платформе Зенда, ответственна за получение по запросу данных, и как таковой будет, скорее всего, содержать класс для каждого виджета для доступа к базе данных.

Некоторые точки:

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

  2. Существует дополнительный шаг обработки, который, скорее всего, будет необходим, прежде чем виджет сможет представить данные. Это - иждивенец, на которого будет использоваться рендерер. Иногда это может потребовать формирования URL из возвращенных данных. Другие времена, массив JSON. Другие времена, возможно, создающие некоторую разметку. Это может пойти или в модели или в контроллере или представлении. Если любой не может думать о серьезном основании переместить его в контроллер или представление, вероятно, лучше позволить этому жить в модели и сохранить представление и контроллер тонкими.

  3. Аналогично, виджет будет составлен из 3 вещей, его параметров, его данных и его рендерера.

    Одна большая часть вопроса: что хороший путь состоит в том, чтобы представить виджет в Объектно-ориентированном проектировании? Я уже спросил это однажды, не мог получить ответ. Существует ли шаблон разработки, который может быть применен к Виджетам, который имеет большую часть смысла для этого проекта?

    Вот первая передача в довольно простом классе для Виджета:

    class Widget{ 
      //method called by the view 
      render() {//output the markup based on the widget Type and interleaved the processed data} 
    
      //methods called by the controller: 
      public function __construct() {//recieve arguments for widget type (query and renderer), call create()}  
      public function create() {//tell the widget to build the query, execute it, and filter the data} 
      public function process_data() {//transform into JSON, an html entity etc} 
    
      //methods called by the model: 
      public function build_query() {...}; 
      public function execute_query() {...}; 
      public function filter_data() {...}; 
    } 
    

    Смотря на него, я могу уже видеть некоторые проблемы.

  4. Например, это просто для передачи виджета, который был создан в контроллере к Представлению для рендеринга.

    Но когда дело доходит до реализации модели это кажется не таким образом прямым. Шаблон Шлюза таблицы более прост реализовать, чем ORM. Но так как шаблон шлюза таблицы имеет один класс для каждой модели/таблицы, это, кажется, не отвечает всем требованиям. Я мог создать модель для конкретной таблицы, и затем в этом, инстанцировать любых других необходимых моделей. Но это, кажется, так не соответствует Шаблону Шлюза Таблицы, а скорее шаблону ORM. Шаблон Шлюза Таблицы может быть реализован с несколькими таблицами? Что альтернативы там? Это имеет смысл, что контроллер создает виджет, и виджет создает Модель?

  5. Другая проблема, которая возникает, - то, что этот дизайн не включает простоту создания виджета. т.е. Скажите, что я хотел создать PiechartWidget, сколько кода может быть снова использовано? Разве не имело бы большего количества смысла использовать некоторые идеи OO, такие как интерфейс или абстрактные классы/методы и наследование?

    Скажем, я абстрагирую класс Виджета поэтому, только общие методы определяются конкретно, и остальные объявляются как абстрактные методы. Пересмотр класса Виджета для создания этого абстрактным (вторая передача):

    abstract class Widget{
    
      private $_type;
      private $_renderer;
    
      //methods called by the controller:
      //receive arguments for widget type (query and renderer), 
      protected function __construct($type, $renderer) {
        $this->_type = $type;
        $this->_render = $renderer;
        $this->create();
       } 
    
      //tell the widget to build the query, execute it, and filter the data
      private function create() {
        $this->build_query();
        $this->execute_query();
        $this->filter_data();
      }
    
      //methods called by the model:
      abstract protected function build_query();
    
      protected function execute_query() {
        //common method
      }
    
      abstract protected function filter_data();
    
      //method called by controller to tranform data for view
      //transform into JSON, an html entity etc
      abstract protected function process_data();
    
      //method called by the view
      //output the markup based on the widget Type and interleave the processed data
      abstract protected function render(); 
    }
    

    Действительно ли это - хороший дизайн? Как это могло быть улучшено?

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

Я надеюсь, что любой мог обеспечить по крайней мере некоторую обратную связь на этом дизайне. Проверить его? Разорвите его. Назовите меня идиотом. Это прекрасно также. Я мог использовать, любой передает тягу.

Несколько конкретных вопросов:

Q1. Что лучший способ состоит в том, чтобы реализовать рендереры как часть класса Виджета или как отдельный класс? 1a. Если бы отдельный, как это взаимодействовало бы с классом (классами) виджета?

Q2. Как я мог улучшить этот дизайн для упрощения создания новых видов виджетов?

Q3. И наконец, я чувствую, что пропускаю что-то здесь относительно скрытия данных. Как скрытие данных касается требований и теряет значение в этом сценарии?

9
задан hinghoo 23 January 2010 в 21:09
поделиться

6 ответов

Цель всех этих идей - MVC, шаблонов и т. Д. - по сути то же самое: каждый класс должен сделать одно, и каждая четкая ответственность в вашем приложении должна быть разделена на Отличные слои. Ваши взгляды (страницы и виджеты) должны быть худыми и сделать несколько, если какие-либо решения, отличные от представления данных, собранных из моделей. Модели должны работать на слое данных агностически, что должно сказать, что они не должны знать, является ли источник их данных определенным видом источника данных. Контроллеры также должны быть тонкими, действующие в основном, в качестве слоя маршрутизации между видами и моделями. Контроллеры принимают вход от пользователей и выполняют соответствующие действия на моделях. Применение этой концепции варьируется в зависимости от вашей целевой среды - Web, богатого клиента и т. Д.

Одной в архитектуре модели не является тривиальной проблемой. У вас есть много шаблонов на выбор и многие рамки, и выбирая правильный - шаблон или рамки - будет полностью зависеть от особенностей вашего домена, который у нас слишком мало здесь, чтобы дать вам более конкретные рекомендации. Достаточно сказать, что рекомендуется, вы потратите некоторое время, чтобы узнать несколько объектов-реляционного сопоставления Frameworks для вашего конкретного стека технологий (будь то Java, .NET и т. Д.) И соответствующие шаблоны Они были построены.

Также делайте себя знакомым с разницей между MVP и MVC - Работа Martin Fowler имеет важное значение.

Что касается проектирования шаблонов, применение большинства стандартов GOF могла бы легко вступить в игру в некоторой или другой форме, и рекомендуется проводить время в Design Paills или один из многих вводных текстов на эту тему. Никто здесь не может дать конкретные ответы относительно того, как MVC относится к вашему домену - что можно ответить только опытными инженерами в сотрудничестве с владельцем продукта, который имеет право сделать решения рабочих процессов и UI, которые будут значительно повлиять на такие решения в своих особенностях Отказ

Короче говоря, сама природа вашего вопроса предполагает, что вам нужен опытный ооос-архитектор или старший разработчик, который сделал это раньше. В качестве альтернативы представляют себе много времени в интенсивном исследовании, прежде чем двигаться вперед. Сфера вашего проекта охватывает огромное количество изучения того, что многие кодеры занимают годы, чтобы полностью понять. Это не значит, что ваш проект обречен - на самом деле вы сможете довольно много выполнить, если вы выберете стек правильного технологического стека, рамки и т. Д., И при условии, что вы достаточно яркие и ориентированы на задачу под рукой. Но получение концепций так же широко как «MVC» или «oO», не то, что я думаю, можно сделать на первой попытки и в течение нескольких ограничений.

Редактировать: я просто поймал редактирование Re: Zend. Наличие на месте, это хорошо, что заботится о многих архитектурных решениях. Я не знаком с Zend, но я бы придерживался своих по умолчанию. Здесь гораздо больше зависит от вашей доставки UI UI - вы находитесь в среде RIA, например, Flash или Silverlight, или вы в строгой среде HTML / JavaScript? В любом случае контроллеры все равно должны быть тонкими и работать в качестве маршрутизаторов, принимающих пользовательские запросы от HTTP TARE и POST, и немедленно передаются на модели. Виды должны оставаться тонкой, а также сделать как можно меньше решений. Концепция MVC, применяемого в веб-среде, была довольно хорошо установлена ​​рельсами, а также выполненные рамки, и я предполагаю, что Zend аналогичен чему-то вроде CakePhp в этом отношении: сервер приложений имеет систему маршрутизации, которая отображает HTTP-вызовы на Действия контроллера, которые отвечают определенным видам. Цикл запроса / ответа в основном это:

  1. Запрос пользователя, опубликованный через URL
  2. Руки маршрутизатора, управляющий в классе контроллера
  3. контроллер позволяет вызововать модель с заданными параматами
  4. . Модель работает на данные,Сообщения обратно к контроллеру
  5. Рамка отображает готовые данные в представлении, с каким-током кодовым, который помещает результаты запроса в объем представления.
  6. Рамка создает HTML (или XML или что-то еще) и посты обратно обратно.
1
ответ дан 4 December 2019 в 21:49
поделиться

Для # 2, если вы используете WPF на Windows, или Silverlight в целом, рассмотрите возможность использования шаблона MVVM (модель ViewModel), вот пояснение с реализацией WPF: MVVM в MSDN

для № 1 (комментарии не отвечают): для точных реализаций (и незначительных вариаций) MVC, он действительно зависит от того, на каком языке вы используете язык.

Еще одна альтернатива MVC является MVP MVP модель просмотра

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

4
ответ дан 4 December 2019 в 21:49
поделиться

Высокие требования - Страница, которая отображает набор виджетов. Виджеты основаны на данных, содержащихся в нескольких отдельных таблицах в базе данных. - Данные виджета будут основаны на запросе базы данных. Виджет отображает свои данные определенным образом. - виджеты должны быть в состоянии создать быстро.

Низкие требования к низкому уровню - Изменения данных, несколько графиков необходимо изменить, нажмите модель (от данных в интерфейс) - Разработка новых виджетов должна быть ветер, существующий код не должен быть изменен

Советы от основных структур дизайна Основы - MVC поддерживает один со схемами уведомления, поэтому да, как только ваш виджет инициализируется, создан и подключен к веб-странице, он должен дождаться уведомлений из базы данных. - Стратегический узор, весь ваш код должен развиваться в интерфейс. Новые виджеты должны быть добавлены в параметризованный LinkedList (или какая-то другая структура данных). Таким образом, новые разработчики виджета просто реализуют интерфейс, и ваша каркас поднимает эти уведомления без изменения в существующий код.

Сиддхарт

2
ответ дан 4 December 2019 в 21:49
поделиться

Похоже, вы хотите использовать MVC и другие шаблоны, потому что они являются новыми модульными словами. Разделение вашего дизайна среди просмотра и контроллера модели должна сообщить вам, как распространить функциональность вашего приложения. Хотя я полностью согласен с тем, что использование MVC является правильным подходом, я предлагаю исследовать шаблон и посмотреть на какой-то исходный код, который реализует его. В качестве начала к вашему вопросу, хотя виджеты, которые будут отображаться, будут вашими взглядами, что многое должно быть очевидно. Вход от пользователя, например, изменение параметра какого-либо виджета или запрашивания другой информации, приступит к вашему приложению и должен обрабатываться контроллером. Бетонный пример этого - это на основе Java HttPServlet. Сервер контроллера получает запрос пользователя и запрашивает более низкие слои вашего приложения (услуги, настойчивость и т. Д.) для обновленного представления вашей модели. Модель включает в себя все ваши доменные объекты (я данных из ваших баз данных и т. Д.). Эти данные (обновленная модель) возвращается к контроллеру, что, в свою очередь, толкает новый вид для пользователя. Надеемся, что этого достаточно, чтобы вы начали разработать ваше приложение.

Как и дальше помощи, вы можете рассмотреть возможность использования структуры для оказания помощи в разработке вашего приложения. Мне очень нравится весна, и у него есть первый класс реализации MVC, который действительно помогает вам разработать правильное веб-приложение MVC.

1
ответ дан 4 December 2019 в 21:49
поделиться

Вы можете рассмотреть возможность использования Pubject Pattern наблюдателя

имеют ваш класс, названный DataReader в виде единого объекта. Ваши несколько виджетов будут действовать как наблюдатели. Как только ваш DataReader получает данные с сервера, он (субъект) будет информировать несколько виджетов (Observer).

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

Обновление

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

1
ответ дан 4 December 2019 в 21:49
поделиться

Примечание. Это мой новый ответ на основе нового обновленного вопроса.

Вот предлагаемая классная диаграмма. Я собираюсь работать на диаграмме последовательности. alt text

Мой старый ответ здесь:

На основании требований, которые вы описываете, ваша модель - ваша база данных или хранилище данных, и ваши представления - ваши круговые диаграммы, гистограммы и т. Д. Я не вижу необходимость контроллера Поскольку звучит так, будто у вас есть одна страница приборной панели с виджетами.
Вам нужно провести время на модели базы данных. Поскольку вы делаете все выбирать и никаких обновлений, перейдите на декорализованную модель данных, которая делает эти запросы эффективными. Вы должны поместить результаты этих запросов в объекте типа таблицы (например, 2-мерный массив) или 3-мерный массив на основе количества измерений. Вы ограничены 3 измерениями, если вы не используете анимацию.

0
ответ дан 4 December 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: