Model-View-Controller (MVC) — это архитектурный паттерн, который мы все хорошо знаем. Это де-факто стандарт практически для всех UI и веб-фреймворков . Это удобно и просто в использовании. Это просто и эффективно. Это отличная концепция … для процедурного программиста. Если ваше программное обеспечение является объектно-ориентированным, вы должны любить MVC так же, как и я. Вот почему.
Вот как выглядит архитектура MVC:
Контроллер отвечает за обработку данных, полученных от Model, и внедрение их в View — и это как раз та проблема. Данные ускользают от Модели и становятся «голыми», что является большой проблемой, как мы договорились ранее. ООП — это все о инкапсуляции — сокрытии данных.
Архитектура MVC делает с точностью до наоборот, выставляя данные и скрывая поведение. Контроллер имеет дело с данными напрямую, принимая решения о его назначении и свойствах, в то время как объекты, которые должны знать все о данных и скрывать их, остаются анемичными . Это именно тот принцип, на котором построена любая процедурная архитектура; код отвечает за данные. Возьмите этот код C ++, например:
1
2
3
4
|
void print_speed() { // controller int s = load_from_engine(); // model printf( "The speed is %d mph" , s); // view } |
Функция print_speed()
является контроллером. Он получает данные из модели load_from_engine()
и отображает их через представление printf()
. Только контроллер знает, что данные в милях в час. Движок возвращает int
без каких-либо свойств. Контроллер просто предположил, что эти данные в милях в час. Если мы хотим создать аналогичный контроллер где-то еще, нам придется делать подобное допущение снова и снова. В этом и заключается проблема «голых данных», которая приводит к серьезным проблемам с обслуживаемостью.
Это объектно-ориентированная альтернатива приведенному выше коду (псевдо-C ++):
1
2
3
4
5
6
7
|
printf( new PrintedSpeed( // view new FormattedSpeed( // controller new SpeedFromEngine() // model ) ) ); |
Здесь SpeedFromEngine.speed()
возвращает скорость в милях в час в виде целого числа; FormattedSpeed.speed()
возвращает "%d mph"
; и, наконец, PrintedSpeed.to_str()
возвращает полный текст сообщения. Мы можем назвать их «моделью, видом и контроллером», но на самом деле это просто предметы, украшающие друг друга. Это все та же сущность — скорость. Но это становится более сложным и интеллектуальным, будучи украшенным.
Мы не разрываем понятие скорости на части. Скорость — это скорость, независимо от того, кто с ней работает и где она представлена. Это просто получает новое поведение от декораторов. Оно растет, но никогда не разваливается.
Подводя итог, можно сказать, что Controller — это чисто процедурный компонент в трио MVC, который превращает Model в пассивный держатель данных, а View — в пассивный рендерер данных. Контроллер, держатель, рендер … Это действительно ООП ?
Вы можете также найти эти связанные сообщения интересными: инкапсуляция покрывает голые данные ; Кто такой объект? ; ActiveRecord даже хуже, чем ORM ; Геттеры / сеттеры. Злой. Период. ; Вертикальное и горизонтальное разложение ответственности ;
JavaScript отключен в вашем браузере, поэтому вы не можете видеть комментарии под этим сообщением.
Ссылка: | MVC vs. OOP от нашего партнера JCG Егора Бугаенко в блоге About Programming . |