2009-08-05 2 views
0

В последнее время я пытался улучшить/отойти от стандартной установки MVC для веб-разработки, и я подумал, что пришло время бросить мои идеи в StackOverflow.Отказ от MVC

Общий поток тот же, что и загрузочный загрузчик создает исходные объекты. Разница в том, что они сохраняются в ServiceManager.

Затем вместо диспетчеризации контроллер загружает представление.

Затем отображает команды и запросы. Команды представляют функциональность, которая обычно связана с формами (обычно обновляет строки базы данных), а запросы - это то, что обычно было бы ModelPeers. Когда они создаются (через ServiceManager), они передают ServiceManager, что избавляет от необходимости много потенциально сложной инъекции зависимостей.

Модели сами будут просто создавать/обновлять/удалять по одной строке.

Так вид будет выглядеть так:

ListUsers.php

<?php $users = $this->ServiceManager->get('Query\User')->getNewestUsers(10); ?> 

<?php foreach($users as $user): ?> 
.... 
<?php endforeach; ?> 

UpdateUser.php

<?php $this->ServiceManager->get('Command\User')->update(); ?> 

<form>...</form> 

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

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

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

+0

Я выйду на несколько часов, но как только вернусь, я получу новые ответы. – whichdan

ответ

3

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

+0

Команды/Запросы уже разделены. Единственное, что в представлении - это призывы к ним. – whichdan

+1

@whichdan Возможно, у вас есть так называемый «пассивный вид» MVC, если ваш предыдущий комментарий был любым признаком: http://martinfowler.com/eaaDev/PassiveScreen.html – Nolte

0

Как вы настроите представление для размещения в разных форматах? Например, HTML ответ, JSON ответ и т.д.

+0

Я мог просто распечатать JSON или XML и установить заголовок Тип содержимого. – whichdan

+0

Должен быть объект, который принимает запрос и решает с помощью «просмотра»/ответа, который вы будете отправлять. – koen

+0

Маршрутизатор может позаботиться об этом. – whichdan

3

Если вам не нравится MVC, вы можете посмотреть на своих братьев и сестер MVP (Model-View-Presenter), PM (Presentation Model) и MVVM (Model-View-ViewModel).

Фактически, то, что вы описываете, может быть PM, я не уверен.

+0

M-V-PM действительно звучит очень близко к тому, что я делаю. Я обеспокоен тем, что у меня слишком много занятий, потому что, особенно с небольшими веб-приложениями, вам может понадобиться изменить 3-4 файла для чего-то относительно простого. – whichdan

+0

Дэн, вы ожидаете, что это общий подход, или это единственный сайт, о котором вы думаете? –

+0

Общий подход. Я собираюсь применить это к нескольким веб-приложениям с разным размером/объемом. – whichdan

1

Один хороший старт здесь: создание многоразового/модульного кода, который будет называться от контроллером, а не монолитным контроллером giganto.

Мое мнение: возможно, проблема заключается не столько в «MVC», сколько в текущей догме о «V» (view). Текущая догма кажется, что вид должен быть быть шаблоном (HTML), в котором код должен быть соткан в «объект d». Можно утверждать, что для многих приложений это просто работа.

Возможно, нам нужно лучше/альтернативный «вид» технология: при настройке CRUD редактирования задачи, в отличии от маркетинга киоска (который должен быть произведением искусства), мы сделать API для создания форм и других Элементы пользовательского интерфейса, использующие модель DOM, например javascript в браузере (или, например, java AWT)? Просто мысль.


В ответ на комментарий:

«... Я хочу, чтобы избежать класс, который просто передает материал на вид ...»

Во-первых, это должно быть выполнимо сделайте это минимальным количеством кода, когда это минимальный объем работы. Например, мне нравится, как «Rails» автоматически направляет запросы в определенном «регионе» приложения в класс, сопоставляя запросы с отдельными функциями/обработчиками. Я эмулировал это поведение в Java-коде, чтобы сохранить ответы более краткими.

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

+0

Я думал об использовании команд/запросов внутри контроллера, но опять же, я хочу, чтобы у меня не было класса, который просто передает материал в представление, что неизбежно заканчивается во многих случаях. Генерация кода может работать, но, похоже, много накладных расходов, когда в целом HTML/JSON/XML действительно не так уж сложно. – whichdan

0

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

Я бы сказал, что большинство каркасов выбирают расслабленное разделение. Rails и его php-клоны обычно следуют этой стратегии. Лично я на самом деле не вижу смысла. Двухслойный (например, модель/презентация) дизайн может хорошо работать для большинства приложений.

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

Смежные вопросы