Архитектуры OOD (Object-Oriented-Design) и MVC (Model-View-Controller) стали основными продуктами современного дизайна программного обеспечения. Тем не менее, у меня недавно была интересная дискуссия о том, как архитектуры MVC используют (и, возможно, даже нарушают) принципы OOD. Эта возможность на самом деле довольно интригующая, поскольку как OOD, так и MVC предназначены для достижения многих из тех же целей: разделения проблем и повторного использования программного обеспечения. Но вопрос, который я задаю: Являются ли эти две стратегии проектирования в прямом противоречии друг с другом?. Как я уже использовал, на практике я начинаю думать: вполне возможно, да.
Я так говорю, потому что: Обеспечение строгого разделения между моделями, представлениями и контроллерами часто приводит к архитектуре, где модели реализованы как немые контейнеры, которые могут управляться только через внешние контроллеры. Я утверждаю, что это прямо противоречит одному из главных принципов объектно-ориентированного проектирования: где объекты содержат операции, которые выполняют необходимые операции и инкапсулируют их по мере необходимости. Например, в чистой объектно-ориентированной архитектуре гипотетический класс File
будет содержать такие методы, как open()
и save()
. MVC предполагает, что у нас есть два класса File
и FileManager
(такие, что позже содержит методы open()
и save()
). Для меня: дизайн MVC довольно грязный. Если нужно создать более специализированный тип File
(скажем, для обработки файлов, которые передаются по сети в open()
или save()
), нужно только подкласс File
с классом (пусть ): StreamedFile
. С MVC вам придется либо создать другой класс менеджера, либо усложнить дизайн исходного класса менеджера.
Из этого следует, что следует, что в более сложной системе MVC может иметь катастрофические последствия как для разделения проблем, так и для повторного использования кода. Или нет? Возможно, модели MVC могут быть реализованы без нарушения принципов OOD? Или MVC является изначально ошибочным подходом, который затрудняет внедрение программных систем с слабо связанными компонентами?