Лекция №11Парадигмы программирования (часть 2)
Парадигма объектно-ориентированного программирования породила несколько парадигм, ее расширяющих:
- компонентно-ориентированное программирование;
- аспектное программирование;
- сервисное программирование.
Эти парадигмы призваны решить проблемы, возникающие при разработке в чистом ООП-стиле.
Несмотря на все положительные качества ООП, у этой парадигмы программирования есть недостатки:
- Поскольку классы в ООП соответствуют отдельным понятиям предметной области, различные классы тесно связаны друг с другом. Это затрудняет модификацию системы для повторного использования в других условиях.
- Сильная связь между классами также препятствует выделению независимых или хотя бы слабо связанных между собой модулей. Модули упрощают не только повторное использование кода, но и его тестирование и сопровождение.
- Связанность отдельных классов системы нарушает базовое правило программирования — принцип разделения ответственности (separation of concerns). Это приводит к дублированию кода и возможным плохо отслеживаемым ошибкам.
Аналогами объектов и классов в компонентном программировании являются компоненты — самостоятельные программные продукты, которые реализуют логически замкнутый набор функций системы (например, хранение данных). Интерфейс и реализация компонентов всегда разграничены, что упрощает многоязыковую и мультиплатформенную разработку. Интерфейс указывает, какие функции предоставляет компонент; кроме того, в нем указываются внешние компоненты, необходимые для его работы.
Аспектное программирование решает возникающую в ООП проблему реализации сквозной функциональности, то есть требований к программной системе, которые невозможно четко выделить в отдельные классы или методы (примеры: ведение лога, обработка исключительных ситуаций, синхронизация, кэширование). Код, касающийся сквозной функциональности, разбросан по многим классам, что затрудняет его модификацию и тестирование. Для решения этой проблемы используются аспекты — модули, которые сосредотачивают код сквозной функциональности и задают правила, при каких условиях этот код выполняется.
Сервисное программирование — развитие идеи компонентного программирования для распределенных приложений. В отличие от компонентов, которые, как правило, являются составными частями системы (например, в виде библиотек), сервисы расположены вне системы. Общение между системой и сервисом происходит при помощи высокоуровневых сетевых протоколов на основе HTTP. Большинство современных архитектур, поддерживающих компоненты, представляют их именно в виде сервисов.