Разделение проблем; MVC; Зачем?

В настоящее время я читаю OO, прежде чем приступить к следующему крупному проекту. Чтобы дать вам краткую справку, я разработчик PHP, работающий над веб-приложениями.

Одна область, которая меня особенно интересует, - это пользовательский интерфейс; в частности, как построить это и связать с моей "моделью" OO.

Я кое-что читал в этой области. Одно из моих любимых: Создание пользовательских интерфейсов для объекта -ориентированные системы

«Все объекты должны иметь собственный интерфейс»

Думая о моей проблеме, я вижу, что это хорошо работает. Я создаю свой «пользовательский» объект, например, для представления кого-то, кто вошел на мой веб-сайт. Тогда один из моих методов - "display_yourself" или аналогичный. Я могу использовать это во всем своем коде. Возможно, для начала это будет просто их имя. Позже, если мне нужно будет настроить отображение их имени и маленького аватара, я могу просто обновить этот метод, и привет, мое приложение обновится. Или, если мне нужно сделать их имя ссылкой на их профиль, эй-престо, я могу легко обновить снова из одного места.

С точки зрения ОО системы; Я считаю, что этот подход работает хорошо. Просматривая другие темы StackOverflow, я нашел это в разделе «Разделение проблем»: Soc

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

На мой взгляд, я этого добился. Мой пользовательский объект скрывает всю свою информацию. В моем коде нет мест, где я бы сказал $ user-> get_user_name () перед тем, как отобразить его.

Однако это, похоже, идет вразрез с тем, что другие люди считают «лучшей практикой».

Процитируем «выбранный» (зеленый) ответ на тот же вопрос:

«Разделение задач заключается в том, что код для каждой из этих проблем сохраняется отдельно. Изменение интерфейса не должно требовать изменения кода бизнес-логики, и наоборот. Шаблон проектирования модель-представление-контроллер (MVC) является отличным примером разделения этих проблем. для лучшей ремонтопригодности программного обеспечения ".

Почему это улучшает ремонтопригодность программного обеспечения? Конечно, с MVC мой View должен очень много знать о модели? Прочтите статью JavaWorld для подробного обсуждения этого вопроса: Создание пользовательских интерфейсов для объектно-ориентированных систем

В любом случае ... наконец-то перейдем к сути!

1. Кто-нибудь может порекомендовать книги, в которых это подробно обсуждается? Мне не нужна книга MVC; Меня не интересует MVC. Мне нужна книга, в которой обсуждаются OO / UI, потенциальные проблемы, потенциальные решения и т. Д. (Возможно, включая MVC) Артура Риеля Эвристика объектно-ориентированного проектирования

затрагивает его (и это отличная книга!), но я хочу кое-что более подробно.

2. Может ли кто-нибудь выдвинуть аргумент, который так же хорошо объяснен, как статья Аллена Холуба о JavaWorld, объясняющая, почему MVC - хорошая идея?

Большое спасибо всем, кто может помочь мне прийти к выводу по этому поводу.


person Dave    schedule 12.03.2009    source источник
comment
Отличный вопрос, основанный на представленных материалах, заставляющий людей думать и объяснять.   -  person dkretz    schedule 13.03.2009
comment
посмотрим, поможет ли этот анаглой: zenofcoding.com/2009 / 01/06 / another-way-to-think-about-mvc ... я бы сказал, что mvc не является обязательным, но, безусловно, это отличный способ подумать о разделении вашей логики. у вас всегда есть часть, которая взаимодействует с БД M, и часть, которая взаимодействует с пользователем, V. Итак, чтобы склеить их вместе, вам обычно нужен какой-то C-контроллер. Многое из того, что я прочитал по этой теме, имеет тенденцию к чрезмерному усложнению.   -  person vladko    schedule 16.02.2016


Ответы (8)


Это провал в том, как часто преподают ООП, используя такие примеры, как rectangle.draw () и dinosaur.show (), которые не имеют абсолютно никакого смысла.

Вы почти отвечаете на свой вопрос, когда говорите о отображении класса пользователя.

«Позже, если мне нужно будет настроить отображение их имени и маленького аватара, я могу просто обновить этот метод, и привет, мое приложение обновится».

Подумайте только об этом маленьком кусочке на мгновение. Теперь взгляните на Stack Overflow и обратите внимание на все места, где появляется ваше имя пользователя. В каждом случае это выглядит одинаково? Нет, вверху у вас просто конверт рядом с вашим именем пользователя, за которым следуют ваша репутация и значки. В ветке вопросов у вас есть ваш аватар, за которым следует ваше имя пользователя с вашей репутацией и значками под ним. Как вы думаете, существует ли пользовательский объект с такими методами, как getUserNameWithAvatarInFrontOfItAndReputationAndBadgesUnderneath ()? Неа.

Объект связан с данными, которые он представляет, и с методами, которые работают с этими данными. Ваш пользовательский объект, вероятно, будет иметь члены firstName и lastName, а также необходимые геттеры для извлечения этих частей. У него также может быть удобный метод, такой как toString () (в терминах Java), который будет возвращать имя пользователя в общем формате, например, имя, за которым следует пробел, а затем фамилия. Кроме того, пользовательский объект больше не должен делать ничего. Клиент должен решить, что он хочет делать с объектом.

Возьмите пример, который вы дали нам с объектом пользователя, а затем подумайте, как бы вы сделали следующее, если бы встроили в него «UI»:

  1. Создайте экспорт CSV, показывающий всех пользователей, отсортированных по фамилии. Например. Фамилия Имя.
  2. Предоставьте как тяжелый графический интерфейс, так и веб-интерфейс для работы с пользовательским объектом.
  3. Показывать аватар рядом с именем пользователя в одном месте, но показывать только имя пользователя в другом.
  4. Предоставьте список пользователей RSS.
  5. Показывайте имя пользователя полужирным шрифтом в одном месте, курсивом в другом и гиперссылкой еще в одном месте.
  6. При необходимости покажите средний инициал пользователя.

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

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

person Boden    schedule 12.03.2009
comment
Хороший ответ. Я написал Аллену Холубу (автору статьи в Javaworld), и он предупредил, что есть разница между объектом, предоставляющим собственный интерфейс, и объектом, отвечающим за свой собственный интерфейс. Подобно тому, о чем вы говорите; Я думаю. - person Dave; 17.03.2009
comment
Одно из предложений из другой статьи Javaworld - использовать шаблон Builder для отделения пользовательского интерфейса от объекта, но при этом сконцентрироваться на слабосвязанной системе: Дополнительная литература: javaworld.com/javaworld/jw-01-2004/jw-0102-toolbox.html - person Dave; 17.03.2009

Вот подход, который я использую при создании веб-сайтов на PHP с использованием шаблона MVC / разделения проблем:

Фреймворк, который я использую, состоит из трех основных частей:

  • Модели - классы PHP. Я добавляю к ним методы для получения и сохранения данных. Каждая модель представляет отдельный тип сущности в системе: пользователи, страницы, сообщения в блогах.
  • Просмотры - шаблоны Smarty. Здесь живет HTML.
  • Контроллеры - классы PHP. Это мозги приложения. Обычно URL-адреса на сайте вызывают методы класса. example.com/user/show/1 вызовет метод $ user_controller-> show (1). Контроллер извлекает данные из модели и передает их представлению.

Каждая из этих частей имеет определенную работу или «заботу». Задача модели - обеспечить понятный интерфейс для данных. Обычно данные сайта хранятся в базе данных SQL. Я добавляю в модель методы для извлечения и сохранения данных.

Задача представления - отображать данные. Вся разметка HTML отображается в представлении. Логика для обработки "зебры" для таблицы данных идет в представление. Код для обработки формата, в котором должна отображаться дата, входит в представление. Мне нравится использовать шаблоны Smarty для представлений, потому что они предлагают несколько хороших функций для обработки подобных вещей.

Задача контроллера - действовать как посредник между пользователем, моделью и представлением.

Давайте посмотрим на примере того, как они сочетаются и в чем заключаются преимущества:

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

posts
id date_created title body hits

Теперь предположим, что вы хотите показать 5 самых популярных постов. Вот что вы можете увидеть в приложении, отличном от MVC:

$sql = "SELECT * FROM posts ORDER BY hits DESC LIMIT 5";
$result = mysql_query($sql);

while ($row = mysql_fetch_assoc($result)) {
    echo "<a href="post.php?id=$row['id']">$row['title']</a><br />";
}

Этот фрагмент довольно прост и хорошо работает, если:

  1. Это единственное место, где вы хотите показывать самые популярные сообщения
  2. Вы никогда не хотите менять внешний вид
  3. Вы никогда не решите изменить то, что такое "популярный пост"

Представьте, что вы хотите показать 10 самых популярных постов на главной странице и 5 самых популярных на боковой панели на подстраницах. Теперь вам нужно либо продублировать приведенный выше код, либо поместить его во включаемый файл с логикой, чтобы проверить, где он отображается.

Что, если вы хотите обновить разметку для домашней страницы, чтобы добавить класс «новое сообщение» к сообщениям, которые были созданы сегодня?

Предположим, вы решили, что сообщение популярно, потому что в нем много комментариев, а не хитов. База данных изменится, чтобы отразить это. Теперь каждое место в вашем приложении, где отображаются популярные сообщения, должно быть обновлено, чтобы отразить новую логику.

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

Использование подхода MVC и принудительное разделение задач в вашем приложении может смягчить эти проблемы. В идеале мы хотим разделить его на три области:

  1. логика данных
  2. логика приложения
  3. и логика отображения

Посмотрим, как это сделать:

Начнем с модели. У нас будет класс $post_model, и мы дадим ему метод с именем get_popular(). Этот метод вернет массив сообщений. Кроме того, мы дадим ему параметр, чтобы указать количество возвращаемых сообщений:

post_model.php

class post_model {
    public function get_popular($number) {
        $sql = "SELECT * FROM posts ORDER BY hits DESC LIMIT $number";
        $result = mysql_query($sql);
        while($row = mysql_fetch_assoc($result)) {
            $array[] = $row;
        }
        return $array;
    } 
}

Теперь для домашней страницы у нас есть контроллер, мы назовем его «домашним». Представим, что у нас есть схема маршрутизации URL-адресов, которая вызывает наш контроллер при запросе домашней страницы. Его задача - получить популярные посты и привести их в правильное русло:

home_controller.php

class home_controller {
    $post_model = new post_model();
    $popular_posts = $post_model->get_popular(10);

    // This is the smarty syntax for assigning data and displaying
    // a template. The important concept is that we are handing over the 
    // array of popular posts to a template file which will use them 
    // to generate an html page
    $smarty->assign('posts', $popular_posts);
    $smarty->view('homepage.tpl');
}

Теперь посмотрим, как будет выглядеть представление:

homepage.tpl   

{include file="header.tpl"}

 // This loops through the posts we assigned in the controller
 {foreach from='posts' item='post'} 
    <a href="post.php?id={$post.id}">{$post.title}</a>
 {/foreach}

{include file="footer.tpl"}

Теперь у нас есть основные части нашего приложения, и мы можем видеть разделение проблем.

Модель занимается получением данных. Он знает о базе данных, он знает о SQL-запросах и операторах LIMIT. Он знает, что должен вернуть хороший массив.

Контроллер знает о запросе пользователя, что он просматривает домашнюю страницу. Он знает, что на главной странице должно отображаться 10 популярных сообщений. Он получает данные от модели и передает их представлению.

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

Также важно упомянуть то, что не знает каждая часть.

Модель не знает, что популярные сообщения отображаются на главной странице.

Контроллер и представление не знают, что сообщения хранятся в базе данных SQL.

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

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

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

  1. Показывать популярные сообщения на боковой панели на подстраницах
  2. Выделяйте новые сообщения с помощью дополнительного класса css
  3. Измените базовое определение "популярного сообщения"

Чтобы отображать популярные сообщения на боковой панели, мы добавим два файла на нашу подстраницу:

Контроллер подстраницы ...

subpage_controller.php

class subpage_controller {
    $post_model = new post_model();
    $popular_posts = $post_model->get_popular(5);

    $smarty->assign('posts', $popular_posts);
    $smarty->view('subpage.tpl');
}

... и шаблон подстраницы:

subpage.tpl

{include file="header.tpl"}

<div id="sidebar">

 {foreach from='posts' item='post'}
    <a href="post.php?id={$post.id}">{$post.title}</a>
 {/foreach}

</div>

{include file="footer.tpl"}

Новая подстраница контроллер знает, что на подстранице должно отображаться только 5 популярных сообщений. Подстраница представление знает, что подстраницы должны помещать список сообщений в div боковой панели.

Теперь на главной странице мы хотим выделить новые сообщения. Этого можно добиться, изменив файл homepage.tpl.

{include file="header.tpl"}

 {foreach from='posts' item='post'}
    {if $post.date_created == $smarty.now}
        <a class="new-post" href="post.php?id={$post.id}">{$post.title}</a>
    {else}
        <a href="post.php?id={$post.id}">{$post.title}</a>
    {/if}
 {/foreach}

{include file="footer.tpl"}

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

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

post_model.php

class post_model {
    public function get_popular($number) {
        $sql = "SELECT * , COUNT(comments.id) as comment_count
                FROM posts 
                INNER JOIN comments ON comments.post_id = posts.id
                ORDER BY comment_count DESC 
                LIMIT $number";
        $result = mysql_query($sql);
        while($row = mysql_fetch_assoc($result)) {
            $array[] = $row;
        }
        return $array;
    } 
}

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

Надеюсь, это наглядный пример того, как разделение логики данных, логики приложения и логики отображения может упростить разработку вашего приложения. Изменения в одной области, как правило, меньше влияют на другие области.

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

Вы должны хорошо продумать, как вы строите свои модели. Какие интерфейсы они будут предоставлять (см. Ответ Грегори о контрактах)? С каким форматом данных предполагается работать с контроллером и представлением? Если подумать об этом заранее, в будущем все станет проще.

Кроме того, при запуске проекта могут возникнуть некоторые накладные расходы, чтобы все эти части хорошо работали вместе. Существует множество фреймворков, которые предоставляют строительные блоки для моделей, контроллеров, механизмов шаблонов, маршрутизации URL-адресов и многого другого. См. Множество других сообщений на SO для предложений по фреймворкам PHP MVC. Эти фреймворки помогут вам начать работу, но вы, как разработчик, отвечаете за управление сложностью и обеспечение разделения задач.

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

person GloryFish    schedule 12.03.2009
comment
Вы выигрываете на день. Я давно искал объяснение MVC на основе PHP. - person Scott; 19.03.2009
comment
В этом сообщении представлена ​​четкая картина MVC и разделения проблем: andywardley.com/computers/web /mvc.html - person GloryFish; 11.06.2009

Я не уверен, что смогу подвести вас к воде, которую вы хотите выпить, но думаю, что смогу ответить на некоторые из ваших вопросов.

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

В представлении у вас есть указатели на модель, которая придерживается этого контракта, но я могу использовать простой объект:

 public class User
 {
    public string FirstName;
    public string LastName;
 }

Да, я понимаю, что публичные поля - это плохо. :-) Я также могу использовать DataTable в качестве модели, если она предоставляет FirstName и LastName. Возможно, это не лучший пример, но дело в том, что модель не привязана к виду. Представление привязано к контракту, и конкретная модель придерживается этого контракта.

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

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

Что касается книг по пониманию ООП, мне больше нравятся книги по шаблонам, поскольку они представляют собой более практичные способы понимания концепций. Вы можете найти материалы для начинающих в Интернете. Если вам нужна книга шаблонов, не зависящая от языка, и вы думаете немного странно, книга «Банда четырех» - хорошее место для начала. Для более креативных типов я бы сказал «Шаблоны дизайна Heads Up».

person Gregory A Beamer    schedule 12.03.2009
comment
Интересные мысли. Я просмотрел несколько шаблонов (включая GOF). Мне всегда интересно, когда люди говорят о смене слоев / ярусов. По моему опыту, это редко те изменения, которые я хочу внести в систему. Скорее всего, я хочу добавить функциональность, например, пользователю. - person Dave; 12.03.2009
comment
@Dave tiers! = Слои, когда вы работаете с действительно большими приложениями, которые необходимо масштабировать, вы обычно получаете процессы, которые охватывают разные серверы - person eglasius; 12.03.2009

Проблема с идеей, что все ваши объекты умеют отображать себя, заключается в том, что каждый объект может отображаться только одним способом. Что произойдет, если вы хотите предоставить подробное представление о пользователе и сводное представление. Что произойдет, если вы захотите отобразить представление, объединяющее несколько объектов (например, пользователей и связанных с ними адресов). Если вы отделяете свои бизнес-объекты (пользователей) от вещей, которые умеют их отображать, тогда у вас больше не будет кода для написания, вы просто разделите его по разным местам.

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

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

person Jack Ryan    schedule 12.03.2009
comment
Как подключить рендерер к объекту? Нужно ли рендереру вникать во внутренности объекта? - person Dave; 12.03.2009

Может ли кто-нибудь выдвинуть аргумент [...], объясняющий, почему MVC - хорошая идея?

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

person MrValdez    schedule 13.03.2009

  • Примите во внимание объем кода, который войдет в этот единственный класс, если вы хотите предоставить ту же информацию не только как Html в пользовательском интерфейсе, но и как часть RSS, JSON, службы отдыха с XML, [вставить что-нибудь еще] .
  • Это ненадежная абстракция, то есть она пытается дать вам ощущение, что это будет единственная часть, которая когда-либо узнает эти данные, но это не может быть полностью правдой. Допустим, вы хотите предоставить услугу, которая будет интегрирована с несколькими внешними третьими сторонами. Вам будет очень сложно заставить их использовать ваш конкретный язык для интеграции с вашим сервисом (поскольку это класс - единственная часть, которая может когда-либо использовать данные, которые он использует), или если, с другой стороны, вы раскрываете некоторые из его данных вы не скрываете данные от этих сторонних систем.

Обновление 1: я дал общий обзор всей статьи, и, поскольку это старая статья (99), на самом деле речь идет не о MVC в том виде, в каком мы знаем его сегодня, и об объектно-ориентированном подходе, и у меня нет аргументов, которые против СРП.

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

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

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

person eglasius    schedule 12.03.2009
comment
Почему у меня не могло быть двух методов; display_yourself и display_yourself_as_text или что-то подобное? Зачем мне нужно больше методов, чем это? Почему много кода? - person Dave; 12.03.2009
comment
@Dave, это сводится к требованиям, вам может потребоваться предоставить его как Xml, JSon, Rss и т. Д. - то есть в широком наборе разных форматов. - person eglasius; 12.03.2009
comment
@Dave Я обновил свой ответ после дальнейшего просмотра статьи ... Я бы сказал, что автор имеет другое мнение о том, как некоторые используют MVC сегодня - person eglasius; 12.03.2009

Я не знаю хороших книг по теме MVC, но по собственному опыту. Например, в веб-разработке вы часто работаете с дизайнерами, а иногда и с dbas. Отделение логики от презентации позволяет лучше работать с людьми с разными наборами навыков, потому что дизайнеру не нужно много писать о коде, и наоборот. Кроме того, с точки зрения концепции DRY, вы можете сделать свой код менее повторяющимся и более простым в сопровождении. Ваш код станет более пригодным для повторного использования и значительно упростит вашу работу. Это также сделает вас лучшим разработчиком, потому что вы станете более организованным и по-другому будете думать о программировании. Поэтому, даже если вам нужно работать над чем-то, что не является MVC, у вас может быть другой подход к архитектуре проекта, потому что вы понимаете концепции MVC.

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

person jimiyash    schedule 13.03.2009
comment
Я думаю, это очень хороший момент. Мой коллега предложил аналогичный ответ; позволяют людям с разными навыками работать над теми частями приложения, которые им нужны. - person Dave; 13.03.2009

Мой 2c ... еще одна вещь, которую вы могли бы сделать помимо того, что было сказано, - это использовать декораторы ваших объектов User. Таким образом, вы можете украсить пользователя по-разному в зависимости от контекста. Таким образом, вы получите WebUser.class, CVSUser.class, RSSUser.class и т. Д.

На самом деле я не делаю этого таким образом, и это может стать беспорядочным, но это помогает избежать того, чтобы код клиента вытаскивал много информации из вашего User. Это может быть что-то интересное ;-)

person Rafa    schedule 12.01.2011