MVC - это просто :)

1.24K
.
AlkatraZ, очень кривая картинка. Глядя на неё, складывается впечатление, что модель формирует вьюху и наполняет её данными, хотя этим занимается контроллер.
.
AlkatraZ
╭∩╮ (`-`) ╭∩╮
EclairElephant (18.05.2013 / 22:42)
Так, а теперь возникает вопрос: - кому верить?
Можно узнать, откуда получена информация о том что это не патерн?
На многих форумах поднимали данный вопрос, но ответ дал сам автор этой архитектуры еще в 1978 году. Вот оригинал: http://heim.ifi.uio.no/~trygve ... .html
Путаница есть даже у автора, который в одной из ссылок пишет "MVC Pattern Language", но если качнете PDF по ссылке, то там он сам же предупреждает, что это концепция архитектуры.
Хотя автора понять можно, он писал эту архитектуру для языка Smalltalk, а в последствии эта концепция вышла за рамки того языка и превратилась в некую абстрактную модель.
---
Откроем книгу "большой четверки" по патернам проектирования.
Далее приведу цитату с форума phpclub.ru где тоже это обсуждали:
Первое, что Вам стоит посмотреть это список паттернов в этой книге.
У меня это главы 3, 4, 5 - стр. 89-332.
Попытайтесь найти там паттерн MVC.
Хочу сразу огорчить Вас... его там нет.
Почему нет? Потому что книжка называется "Приемы объектно-ориентированного проектирования"
И авторы этой книги достаточно компетентны, чтобы понимать, что MVC сам по себе таким (объектно-ориентированным) приемом (паттерном) не является.
.
╭∩╮ (`-`) ╭∩╮
L!MP (18.05.2013 / 23:02)
AlkatraZ, очень кривая картинка. Глядя на неё, складывается впечатление, что модель формирует вьюху и наполняет её данными, хотя этим занимается контроллер.
А во и нет.
Точнее ты описываешь "пассивную модель"
А есть еще и активная, в Википедии как раз про это хорошо написано:
В оригинальной концепции была описана сама идея и роль каждого из элементов: модели, представления и контроллера. Но связи между ними были описаны без конкретизации. Кроме того, различали две основные модификации:

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

Активная модель — модель оповещает представление о том, что в ней произошли изменения, а представления, которые заинтересованы в оповещении, подписываются на эти сообщения. Это позволяет сохранить независимость модели как от контроллера, так и от представления.

Классической реализацией концепции MVC принято считать версию именно с активной моделью.
.
╭∩╮ (`-`) ╭∩╮
Ну далее, а то мы отвлеклись
Итак, мы собирались сделать простейший и причем рабочий скрипт, который полностью отвечает архитектуре MVC
---
Далее вопрос, для этого обязательно использовать классы и изучать ООП?
Ну ООП то знать полезно, но MVC != ООП.
Объектный подход - это всего лишь один из методов реализации архитектуры MVC.
как например гастивуху можно написать чисто в столбик, процедурным методом, так и на ООП, и даже по модной архитектуре MVC.
.
L!MP
AlkatraZ, нужно же обращать внимание на контекст. MVC было придуманно не для веб-программирования (это да же исходя из дат, которые были уже написаны, понятно).

В веб-программинге активно используется именно пассивная модель. Т.е модель ничего не знает ни о контроллере, ни о вьюхе.
В этом и вся суть. Это делает модели свободно переносимыми и даёт возможность их повторного использования, что, в свою очередь, очень удобно, ибо модель - это вся бизнес логика приложения.
--
Йоп, когда в теме появится код?
.
AlkatraZ
╭∩╮ (`-`) ╭∩╮
L!MP (18.05.2013 / 23:28)
AlkatraZ, нужно же обращать внимание на контекст. MVC было придуманно не для веб-программирования (это да же исходя из дат, которые были уже написаны, понятно).

В веб-программинге активно использу
Я с тобой согласен, более того, потом я напишу свои соображения по этой теме.
Но насчет пассивной и активной модели, я щас приведу наглядные примеры обоих вариантов MVC в процедурном исполнении
Это конечно клоунада и смотреть будет смешно, но тем не менее, это полностью соответствует концепциям архитектуры MVC.
.
╭∩╮ (`-`) ╭∩╮
Итак, хорош теории, давайте перейдем к примерам.

Итак, для начала, на Денвере или Опенсервере создаем папку для наших экспериментов и назовем ее к примеру /mvc

В ней создадим 3 пустых файла:
index.php (это наш контроллер, но для удобства мы его назовем не controller.php а именно index.php чтоб легче было обращаться через браузер)
model.php
view.php
.
╭∩╮ (`-`) ╭∩╮
Далее, создадим нашу модель.
обычно модели работают с базами данных, но мы для простоты эксперимента поместим в нее простой массив.

Наш суперскрипт будет выдавать имена наших домашних животных. посему в файл model.php помещаем следующий код:
<?php

$data = array(
    'dog' => 'Цобако: Шарик',
    'cat' => 'Котейко: Барсик'
);

Надеюсь всем все понятно.
Это наши данные.
.
╭∩╮ (`-`) ╭∩╮
Теперь создадим наш View
Для этого в файл view.php добавляем следующий код:
<?php

echo (isset($content) ? $content : '');

Как вы знаете из концепции архитектуры MVC, представление умеет отдавать пользвателю те данные, что ему передадут.
В данном случае, если мы м View передадим переменную $content, она будет выдана в браузер.
.
╭∩╮ (`-`) ╭∩╮
Теперь займемся нашим контроллером.
как мы уже знаем, есть 2 концепции построения, с активной и с пассивной моделью.
давайте для начала сделаем контроллер с активной моделью. точно по картинке, что публиковаласть в теме выше и что есть в Википедии. то есть канонически.
---
Итак, прежде, чем писать контроллер, мы должны написать техзадание для нашего суперпроекта.
Техзадание таково:
1) По умолчанию, если зайдем на сайт, должно выводиться приветствие
2) Если я передам URL параметр act=cat должно быть показано имя моего кота
3) Если я передам URL параметр act=dog должно быть показано имя моей цобаки
Всего: 45