Объектно-ориентированная архитектура
Это парадигма проектирования, основанная на разделении ответственностей приложения или системы на самостоятельные пригодные для повторногоиспользования объекты, каждому из которых соответствуют данныеи поведение (методы), относящиеся к этому объекту. При объектно-ориентированном проектировании система рассматривается не какнабор подпрограмм и процедурных команд, а как наборы взаимодействующих объектов. Объекты обособлены, независимы и слабосвязаны. Обмен данными между ними происходит через интерфейсыпутем вызова методов (свойств) других объектов и отправки (приемасообщений).
Основными принципами объектно-ориентированного архитектурного стиля являются абстракция, композиция, наследование, инкапсуляция, полиморфизм, отделение.
Абстракция. Преобразование сложной операции в некое обобщение (класс), сохраняющее основные ее характеристики. Например, абстрактный интерфейс может быть широко известным описанием, поддерживающим операции доступа к данным через использованиепростых методов, таких, например, как Get (Получить) и Update(Обновить). Другая форма абстракции – метаданные, используемыедля обеспечения сопоставления двух форматов структурированныхданных.
Композиция. Объекты могут быть образованы другими объектамии по желанию могут скрывать эти внутренние объекты от другихклассов или предоставлять их как простые интерфейсы.
Наследование. Объекты могут наследовать свойства других объектов и использовать функциональность базового объекта или переопределять ее для реализации нового поведения. Наследованиеупрощает обслуживание и обновление, поскольку изменения, вносимые в базовый объект, автоматически распространяются по всейвертикали наследования.
Инкапсуляция. Объекты предоставляют свою функциональностьтолько через методы, свойства, события и скрывают внутренниедетали, такие как состояние и переменные, от других объектов. Этоупрощает обновление (замену) объектов и позволяет выполнять этиоперации без влияния на другие объекты, требуется лишь обеспечитьсовместимость интерфейсов.
Полиморфизм. Позволяет для конкретных объектов переопределять поведение базового типа (поддерживающее основные операциив приложении) путем реализации в них новых взаимозаменяемыхтипов.
Отделение. Объекты могут быть отделены от потребителя путемопределения абстрактного интерфейса, реализуемого объектом ипонятного потребителю. Это позволяет обеспечивать альтернативныереализации без влияния на потребителей интерфейса.
Объектно-ориентированный стиль используется для моделей, поддерживающих сложные научные или финансовые операции, либоописания объектов, представляющих реальные артефакты достаточно сложной предметной области. Хотя в последнем случае чащеприменяется более специализированный стиль проектирования наоснове предметной области, который, в свою очередь, используетпреимущества принципов объектно-ориентированной архитектуры.
Обычно объектная модель представляется в виде диаграммы классов. На рисунок 11.9 приведен упрощенный пример такой диаграммы, гдеизображены три класса, причем классы «Teacher» и «Student» наследуют свое поведение и данные от класса «Persona».
Рисунок 11.9. Пример диаграммы классов.
Кпреимуществам данного архитектурного стиля относятся:
- понятность– обеспечивается более близкое соответствие приложения реальным объектам, что и делает его более понятным
- возможностьповторного использования – реализуется черезполиморфизм и абстракцию
- тестируемость – улучшение тестируемости обеспечивается черезинкапсуляцию
- расширяемость – инкапсуляция, полиморфизм и абстракциягарантируют, что изменения в представлении данных не повлияютна интерфейсы, предоставляемые объектами, что могло бы ограничить возможности связи и взаимодействия с другими объектами
- высокаясвязность – размещая в объекте функционально близкие методы (функции) и используя для разных наборов функцийразные объекты, можно достичь высокого уровня связности.
Кнедостаткам объектного подхода можно отнести: высокуюстоимость ошибок проектирования классов: при неправильно спроектированных классах необходимо делать это повторно, что можетпотребовать переписывания значительной части кода программы.