воскресенье, 11 октября 2015 г.

Что такое MVC (Nodel-View-Controller) моими глазами. Тут только теория и много пьяных букв.

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

Второе, о чем хотелось бы сказать - я не являюсь теоретиком, а на 80% все познаю в практике, из-за чего могу быть неправ или не совсем прав. Так же из меня ужасный учитель и "объяснятель", так что если Вы все еще хотите читать дальше... вобщм, я предупредил.

Третье, но уже по теме: MVC является паттерном, то есть шаблоном программирования, который перерос в религию "тру-программистов". Шаблоны, если говорить на чистом и любимом русском - варианты решения типичной ситуации. И поэтому всегда, слышите? Всегда прежде чем использовать тот или иной шаблон трижды (если такой же как я, то все 5 раз) подумайте, а подходит ли данный шаблон под вашу ситуацию или нет, если нет, то не надо использовать что-то притянутое за уши. Пожалейте всех тех, кому сопровождать ваш код, ну или себя, если это будете Вы.

Что же, кто выдержал эти три первых абзаца разминки, дерзайте, я начинаю...

MVC он же Model - View - Controller (Модель - вид - Контроллер(управление, по-русски)) шаблон(алгоритм) программирования, в том числе используется PHP (на котором я иногда говногодю). В последнее время, данный принцип можно встретить в 99,99% серьезных проектов(сайтов), начиная от известных фреймворков типа симфонии yii, заканчивая моим тетрисом - mwce.

Принцип работы

Идея MVC, примерно, в следующем: ваш сайт делится на 3 логические части, которые вы описываете в 3 классах для каждой страницы сайта:

  • модель
  • контроллер
  • вид

Модель отвечает за данные. Вид отвечает за внешний вид страницы, то есть это интерфес. И контроллер, понятно из названия, управляет результатом, что предоставляет ему модель, чтобы потом некоторые из них появились у вас на экране через Вид.
Так же важно учесть, что модель - это не просто прослойка между базой данных и контроллером. По сути, модель работает с данными: перебирает, запрашивает у базы, может проверять, посылать, сортировать, в общем, вся работа с даннами проходит именно в ней...
Если не совсем понятно, то  представьте, что контроллер - начальник, который получает задачи от клиента, и в зависимости от его[клиента] хотелок требует и раздает поручения: модели получить и отсортировать определенные данные, а виду их отобразить на экран, вот оно и будет. Да, и не забывайте, что у начальника может быть много подчиненных (В том числе, из соседнего отдела Васи, который одолжит оных за определенный ништяк), то есть 1 контроллер может запрашивать данные с разных моделей, если это действительно нужно.

Для чего это надо и чем полезно

Во-первых, MVC почти всегда реализовывают на ООП (ни разу не видел этого в функциональном виде, хотя, думаю, при желании можно). А что такое объектно-ориентированное программирование? Правильно, это классы с инкапсуляцией, наследованием и полиморфизмом. Если не понятно о чем я говорю, то прежде чем пережевывать написанное тут, очень рекомендую поплотнее познакомится с ООП и с его плюсами и минусами.

Во-вторых, мы получаем некоторую степень абстракции, что позволяет нам не меняя архитектуры и принципов создавать и достаточно быстро создавать, новые страницы с совершенно разной логикой (что на 80% зависит от модели, на 15% от контроллера и на 5% от вида).

Как правило, все контроллеры и модели являются потомками родителя - контроллера и родителя - модели. ( с видом обстоит по-разному, все зависит от того, как реализован класс). Для чего? А все просто: в родителях описывается обязательное поведение для потомков: входная точка для контроллера, например. Подключение к базе данных и подключение ряда нужных данных(чтение файлов, разбор конфигов) для модели.

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

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

Комментариев нет:

Отправить комментарий