Статьи

MVC против ООП

Model-View-Controller (MVC) — это архитектурный паттерн, который мы все хорошо знаем. Это де-факто стандарт практически для всех UI и веб-фреймворков . Это удобно и просто в использовании. Это просто и эффективно. Это отличная концепция … для процедурного программиста. Если ваше программное обеспечение является объектно-ориентированным, вы должны любить MVC так же, как и я. Вот почему.

Горячие выстрелы! (1991) Джим Абрахамс

Вот как выглядит архитектура 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 .