На этом шаге рассмотрим абстрагирование.
Объектная модель состоит из следующих четырех главных элементов:
Термин главный элемент означает, что без любого из них модель не является объектно-ориентированной. Кроме главных, в этой модели существуют еще три дополнительных элемента:
Термин дополнительный элемент означает полезный, но не существенный компонент объектной модели.
Абстрагирование — один из основных методов, позволяющих справиться со сложностью. Абстрагирование проистекает из распознавания сходства между определенными объектами, ситуациями или процессами в реальном мире, и концентрирует внимание на общих свойствах и игнорирует различия. Абстракция - упрощенное описание, или спецификация системы, выделяющая одни свойства и затеняющая другие, а хорошая абстракция подчеркивает значимые детали и отбрасывает несущественные на данный момент.
Абстракция выделяет существенные характеристики некоторого объекта, отличающие его от всех других видов объектов и, таким образом, четко описывает его концептуальные границы с точки зрения наблюдателя.
Абстракция концентрирует внимание на внешнем представлении объекта и позволяет отделить существенные особенности поведения от их реализации - принцип минимальных обязательств, в соответствии с которым интерфейс объекта должен обеспечивать только существенные аспекты его поведения и ничего больше. Существует также дополнительный принцип наименьшего удивления, согласно которому абстракция должна полностью описывать поведение объекта, ни больше и ни меньше, и не порождать сюрпризы или побочные эффекты, выходящие за пределы абстракции.
Выбор правильной совокупности абстракций для заданной предметной области представляет собой главную задачу объектно-ориентированного проектирования.
Перечислим абстракции в порядке убывания их полезности:
Клиентом называется любой объект, использующий ресурсы другого объекта (называемого сервером). Поведение объекта характеризуется услугами, которые он оказывает другим объектам, и операциями, которые он может выполнять над другими объектами. Такой подход концентрирует внимание на внешних проявлениях объекта и приводит к идее контрактной модели программирования: внешнее проявление объекта определяет его контракт с другими объектами, подлежащий выполнению его внутренним устройством (часто во взаимодействии с другими объектами). Контракт фиксирует все предположения, которые объект-клиент может формулировать относительно поведения объекта-сервера. Иначе говоря, контракт определяет ответственность объекта, т.е. его обязательное поведение.
Каждая операция, предусмотренная этим контрактом, однозначно определяется ее уникальной сигнатурой, состоящей из формальных параметров и типа возвращаемого значения. Полная совокупность операций, которые клиент может осуществлять над другим объектом, вместе с установленным порядком их вызова образуют протокол (protocol). Протокол указывает все возможные способы, которыми объект может действовать или реагировать на воздействие, полностью определяя внешнее статическое и динамическое представление абстракции.
Главной идеей абстракции является концепция инварианта. Инвариант - это логическое условие (истинное или ложное), которое должно выполняться всегда. Для каждой операции, ассоциированной с объектом, можно задать предусловия (инварианты, предполагаемые операцией) и постусловия (инварианты, которым удовлетворяет операция). Нарушение инварианта противоречит контракту, связанному с абстракцией. Если нарушается предусловие, то это значит, что клиент не соблюдает свои обязательства и сервер не в состоянии надежно функционировать. Аналогично, если нарушается постусловие, то свои обязательства не выполняет сервер, так что клиент больше не может ему доверять. Признаком нарушения некоего инварианта является исключительная ситуация.
Все абстракции обладают как статическими, так и динамическими свойствами. Например, файл как объект требует определенного объема памяти на конкретном запоминающем устройстве. Кроме того, у него есть имя и содержание. Все эти атрибуты являются статическими свойствами. Конкретные значения каждого из этих свойств носят динамический характер и зависят от жизненного цикла объекта. Например, файл можно увеличить или уменьшить, а также изменить его имя и содержимое. Суть всех программ, написанных в процедурном стиле, составляют действия, изменяющие динамические характеристики объектов. В таких программах события происходят только в результате вызова подпрограмм и выполнения операторов. С другой стороны, в программах, написанных в стиле, ориентированном на правила, события происходят только тогда, когда определенные условия приводят в действие установленные правила, которые, в свою очередь, активизируют другие правила, и т.д. В программах, написанных в объектно-ориентированном стиле, события связаны с воздействием на объекты (т.е. с передачей объектам определенных сообщений). Выполнение операции над объектом вызывает у него определенную реакцию. Поведение объекта полностью определяется операциями, которые над ним можно выполнять, и его реакцией на внешние воздействия.
На следующем шаге рассмотрим примеры абстракций.