Архитектуры 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 является изначально ошибочным подходом, который затрудняет внедрение программных систем с слабо связанными компонентами?