Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В MVC контроллер, как правило, что-то императивное: то есть шаг за шагом что-то «делающее». А в MOVE взаимодействие описывается декларативным образом
Чтобы операцию авторизации применили не только к юзеру, а к заказу, например.
s/authorization/validation/g. a = current_object(); # got a user, an order, the whatever
if Magestic.valid?
puts Magestic.output(a)
else
Magestic.error
end
Magestic может быть, например, интерпретатором lua. Дело не в языке.RSS-потоков, и вы из каждого хотите вытянуть HTML и показать пользователю. При этом каждый сайт показывает свой HTML, один шаблон не прикрутить. Тогда вы храните DOM-пути к тексту и Magestic вытаскивает из каждой страницы по этому пути — текст. Основной код при этом вообще не знает ничего о посторонних страницах, чтобы распарсить новый источник — необходимо просто указать путь к диву с контентом.a = current_object();
if Magestic.valid?
puts Magestic.output(a)
else
Magestic.error
end
Magestic GetMagestic()
{
if (Magestic.Valid)
{
return Magestic;
}
throw new Exception("Magestic is not valid");
}
//.... Где-то в методе
puts GetMagestic().output(a)
Начинающие программисты (особенно в веб-программировании, где аббревиатура MVC стала популярна) очень часто трактуют архитектурную модель MVC как пассивную модель MVC. В этом случае модель выступает исключительно совокупностью функций для доступа к данным, а контроллер содержит бизнес-логику. В результате код моделей по факту является средством получения данных из СУБД, а контроллер представляет собой типичный модуль, наполненный бизнес-логикой, или скрипт в терминологии веб-программирования. В результате такого понимания MVC разработчики стали писать код, который Pádraic Brady, известный в кругах сообщества Zend Framework, охарактеризовал как ТТУК — «Толстые тупые уродливые контроллеры» (Fat Stupid Ugly Controllers)
ТТУК — «Толстые тупые уродливые контроллеры» (Fat Stupid Ugly Controllers)Хулительное наименование можно придумать для чего угодно, при наличии хотя бы минимального интеллекта.
MVC — это концепция без конкретики реализации
MVC — это концепция без конкретики реализации
Конце́пция — генеральный замысел, руководящая идея. Концепция определяет стратегию действий.
Модель — Модель предоставляет знания: данные и методы работы с этими данными, реагирует на запросы, изменяя своё состояние. Не содержит информации, как эти знания можно визуализировать.
Представление — Отвечает за отображение информации (визуализацию). Часто в качестве представления выступает форма (окно) с графическими элементами.
Контроллер — Обеспечивает связь между пользователем и системой: контролирует ввод данных пользователем и использует модель и представление для реализации необходимой реакции.
Бизнес-логика — в разработке информационных систем — совокупность правил, принципов, зависимостей поведения объектов предметной области (области человеческой деятельности, которую система поддерживает).
Соответствено бизнес-логика находится в модели.Зачем тогда контроллер? Мапить события от вида на методы модели?
Контроллер —… и представление для реализации необходимой реакции.
function createNewUser($userName, ...)
{
if (userExists($userName))
return false;
//проверка валидности имени и прочих параметров
appendUser(...)
}
Нет знаю, данные можно считывать, записывать и хранить. Подсистема бизнес-логики использует интерфейс высокого уровня подсистемы логики работы с данными, и может описывать свою логику не опираясь на хранилище.
class User {
protected $name;
public function getName() {
return $this->name;
}
public function setName($value) {
$this->name = $value;
}
}
/* DM */
$builder = new UserBuilder();
$user $builder->buildNewUser();
/* AR */
$user = User::buildNewUser();
//AR
class User {
public function checkUserPass($login, $pass)
{
return count(query("select count(*) from users where login=$login and pass=$pass;").result()) > 0;
}
}
//DM
class DtUser {
public function loginExists($...) {}
public function getPassByLogin($..) {}
}
class User {
public function checkUserPass($login, $pass)
{
if (!DtUser::loginExists($login))
return false;
return DtUser::getPassByLogin($login) == $pass;
}
}
class User {
public function checkPass($pass) {
return $this->pass === $pass;
}
}
$success = 1 == $repo->countByLoginAndPass($login, $pass);/*
* AR
* Важный момент в AR то, что вы получаете экземпляр, прежде чем с ним работать.
* Прямые запросы в статике - как раз и есть тот плохой подход, который вы ругаете
*/
class User {
public function getPassword() { ... }
public static function findUserByLogin($dbProvider, $login) { ... }
public function checkUserPass($pass)
{
return $this->getPassword() === $pass;
}
}
class Controller
{
protected $dbProvider;
public function action($login, $pass) {
$user = User::findUserByLogin($this->dbProvider, $login);
$result = $user->checkUserPass($pass);
...
}
}
/*
* DM
*/
class DtUser {
public function getPassword() { ... }
}
class UserService {
public function checkUserPass(DtUser $user, $pass)
{
return $user->getPassword() == $pass;
}
}
class Controller
{
protected $dbProvider;
public function action($login, $pass) {
$user = $this->dbProvider->getDtUser($login);
$bissnessLogic = new UserService();
$result = $bissnessLogic->checkUserPass($user, $pass);
...
}
}
А для контроллера больше ничего и не нужно. Ну вот зачем ему знать, какие операции можно проводить с данными? Ему только нужно знать, что вообще он может делать с моделью.
public function action()
{
$specificUser = User::<все подскажет autocomplete IDE>;
}
Граница четкая между Views и Model, если ею является Controller как связующий элементЭто называется Model–view–adapter. В классическом MVC они вляют друг на друга по кругу.
Всегда думал, что вся логика приложения должна находится в моделях.
То что модели != данным в БД проецированным на экземпляры классов.
Всегда думал, что много кода в контроллерах == не понимание паттерна MVC
var vehicles = Using<GetVehicleListForUser>().Execute(CurrentUserId);
Вроде бы проблема решается DDD, не?
MVC умер, пришло время MOVE