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