MVC vs. OOP

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

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

Вот как выглядит архитектура MVC:

[Контроллер] -вниз- [Модель] [Контроллер] -вниз- [Представление]

Контроллер отвечает, заботится о данных, полученных от Модели, и внедряет их в Представление — и вот в чем проблема. Данные покидают Модель и становятся “голыми”, что является большой проблемой, как мы ранее согласились. ООП основывается на инкапсуляции — скрытии данных.

Архитектура MVC делает точно противоположное, выставляя наружу данные и скрывая поведение. Контроллер работает с данными напрямую, принимая решения о цели и свойствах данных, в то время как объекты, которые должны знать все о данных и скрывать их, остаются анемичными. Именно на этом принципе построена любая процедурная архитектура; код управляет данными. Возьмите, к примеру, этот код на C++:

Функция print_speed() является контроллером. Она получает данные s из модели load_from_engine() и отображает их через представление printf(). Только контроллер знает, что данные представлены в милях в час. Двигатель возвращает целое число без каких-либо свойств. Контроллер просто предполагает, что данные представлены в милях в час. Если мы хотим создать аналогичный контроллер в другом месте, нам придется снова и снова делать подобное предположение. В этом и заключается проблема “голых данных”, и она приводит к серьезным проблемам с поддержкой.

Вот альтернатива объектно-ориентированному подходу к вышеуказанному коду (псевдо-C++):

Здесь SpeedFromEngine.speed() возвращает скорость в милях в час в виде целого числа; FormattedSpeed.speed() возвращает "%d mph"; и, наконец, PrintedSpeed.to_str() возвращает полный текст сообщения. Мы можем называть их “модель, представление и контроллер”, но на самом деле они просто объекты, которые декорируют друг друга. Это все еще одна и та же сущность - скорость. Но она становится более сложной и умной благодаря декораторам.

Мы не расчленяем понятие скорости. Скорость - это скорость, независимо от того, кто с ней работает и где она представлена. Она просто получает новое поведение от декораторов. Она растет, но никогда не разрушается.

В заключение, контроллер - это чистый процедурный компонент в тройке MVC, который превращает модель в пассивный хранитель данных, а представление - в пассивный отрисовщик данных. Контроллер, хранитель, отрисовщик … Это действительно ООП?

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-28 at 15:41

sixnines availability badge   GitHub stars