Объектно-ориентированный анализ и программирование. План лекций

Литература

Bertrand Meyer. Object-Oriented Software Construction (2nd edition), 1997.

Booch et al. Object-Oriented Analysis and Design with Applications (3rd Edition), 2007.

Gamma et al. Design Patterns: Elements of Reusable Object-Oriented Software, 1994.

ООП

Симула, абстракция данных.

Определение Кэя (2003): «Для меня ООП означает только обмен сообщениями, сохранение, защита и скрытие состояния-процесса, и экстремально позднее связывание всего. Так можно сделать в Смолтоке и в Лиспе. Возможно, есть и другие системы, которые позволяют это, но я о них не знаю.»

Взаимодействующие вычислительные узлы, управление состоянием.

Классы, объекты. Идентификация, состояние, поведение. Инкапсуляция, полиморфизм, наследование.

История

Парадигмы ЯП. Императивное → структурное → ООП.

Lisp, сборка мусора (1959). 1960-е. Структурное и процедурное программирование (ALGOL).

ООП. Кри́стен Ню́горд и Оле-Йохан Даль. Simula (1967)

PARC. Alan Kay. Smalltalk (1969, 1972, 1980), влияние Лиспа. Передача сообщений, «утиная» типизация.

Smalltalk → Self, Objective-C, Python, Ruby.

Simula → Ada → C++ (1983), Eiffel (1986), Java (1991).

ООП на основе прототипов: Self (1987) → JavaScript (1995).

ООП с множественной диспетчеризацией (CLOS).

Абстрактные типы данных

Пример со стэком.

  • ADT. Типы. Универсализация (обобщение).
  • Функции. Аппликативное против императивного. Запросы, команды, конструкторы.
  • Аксиомы.
  • Частичные функции, предусловия.
TYPES
  • STACK [G]
FUNCTIONS
  • put: STACK [G] × G → STACK [G]
  • remove: STACK [G] /→ STACK [G]
  • item: STACK [G] /→ G
  • empty: STACK [G] → BOOLEAN
  • new: STACK [G]
AXIOMS
  For any x: G, s: STACK [G]
  A1 • item (put (s, x)) = x
  A2 • remove (put (s, x)) = s
  A3 • empty (new)
  A4 • not empty (put (s, x))
PRECONDITIONS
  • remove (s: STACK [G]) require not empty (s)
  • item (s: STACK [G]) require not empty (s)

Пример выражения:

item (remove (put (remove (put (put (
     remove (put (put (put (new, x1), x2), x3)),
     item (remove (put (put (new, x4), x5)))), x6)), x7)))

Класс — это абстрактный тип данных, снабженный некоторой (возможно частичной) реализацией.

Отложенные (абстрактные) и эффективные классы.

Классы

  • имя — обычно существительное (возможно, полученное в результате номинализации).
  • экземпляры — объекты,
  • поля — состояние,
  • методы — поведение,
  • инварианты.

Класс определяет тип объектов. Тип: возможные значения, операции, представление в памяти. Абстрактные типы. Интерфейс и реализация. Инкапсуляция. Позднее связывание и полиморфизм: ситуативный (ad-hoc), параметрический (обобщенное программирование), полиморфизм подтипов.

Методы. Модификаторы доступа. Команды и запросы. Доступ к атрибутам, UAP.

Отношения: композиционные и иерархические (наследование). Метаклассы (класс является объектом).

Отношения классов в UML.

Наследование

  • наследуемые элементы языка
  • наследование и подтипы
  • принцип подстановки
  • переопределение и повторное использование
  • наследование интерфейсов
  • дифференциальное наследование
  • множественное наследование и проблема ромба
  • статичность и единственность
  • composition over inheritance
  • примеси и типажи
  • Проблема круг-эллипс. Решения путем изменения модели:
    • успех/неудача или возврат нового значения;
    • ослабить требования к Эллипсу;
    • смена типа;
    • предусловие Ellipse.stretchable;
    • абстрактный класс RoundObject;
    • убрать наследование, Circle.toEllipse();
    • объединить классы;
    • обратное наследование;
    • неизменяемость;
    • MutableEllipse.

Объекты, объектный граф

Тип. Идентичность и состояние. Изменяемость. Объекты-значения (value objects) и объекты-ссылки (reference objects).

Логическое и физическое состояние объекта

Идентичность объекта.

Эквивалентность и хэш код.

Реализация

  • позднее связывание
  • виртуальные методы
  • ненаследуемые классы и непереопределяемые методы

ОО анализ и проектирование

Объектно-ориентированный подход. OOAD, анализ, проектирование.

  • OOA: требования → модель.
  • ООD: модель → архитектура.

Процесс

  • Meyer, B. Object-Oriented Software Construction. Prentice Hall, 1997.
  • Booch, G., Maksimchuk, R. A., Engel, M. W., Young, B. J., Conallen, J. and Houston, K. A. Object-Oriented Analysis and Design with Applications (3rd Edition). Addison-Wesley Professional, Hardcover, 2007.

Нет готовых рецептов. Жизненный цикл разработки. Макропроцесс.

Стили макропроцесса. Итеративный и поступательный. Водопадный.

Требования → Анализ и проектирование → Реализация → Тестирование → Развертывание → (следующая итерация)

Гибкий метод (agile, ускоренный) и следование плану (планомерный).

Анализ и проектирование (микропроцесс).

(требования) → Анализ → (начальное решение) → Проектирование → спецификация, допускающая эффективную реализацию.

Анализ — создание описания задачи

Модель поведения. Что делает система, а не как. (Буч)

  • «В центре внимания анализа находится поведение, а не форма.» (Буч)
  • На этапе анализа достаточно описать все основные аспекты поведения.

Или с чем она это делает?

  • «Ask not first what the system does: ask what it does it to!» (Мейер)

Сравнение ОО подхода и разработки сверху-вниз (Мейер).

  • Декомпозиция
  • Комбинируемость
  • Понятность
  • Непрерывность

Непрерывность архитектуры. Повторное использование.

Архитектура и компоненты. Уровни абстракции

Идентификация элементов, определение взаимодействия, определение отношений, определение семантики.

Хорошая архитектура:

  • многоуровневая система абстракций,
  • четкая граница между интерфейсом и реализацией на каждом уровне абстракции,
  • простота: общее поведение достигается общими абстракциями и механизмами.

Проектирование

Основные принципы:

  • программирование на основе интерфейса, а не реализации,
  • повторное использование функциональности,
    • внутреннее, инструментарий, каркас,
  • композиция объектов предпочтительнее наследования,
    • делегирование, как альтернатива наследованию,
  • предполагать изменения.

Факторы, ограничивающие гибкость архитектуры и приводящие к перепроектированию:

  • явное указание класса при создании объекта,
  • зависимость от аппаратной или программной платформы,
  • зависимость от представлений и реализаций объектов,
  • зависимость от конкретных алгоритмов,
  • сильная зависимость между объектами (tight coupling),
  • использование наследования вместо композиции,
  • невозможность изменить внешние классы.

Инверсия управления и внедрение зависимости.

Шаблоны проектирования.

Gamma et al. Design Patterns: Elements of Reusable Object-Oriented Software, 1994.

GoF: Эрих Гамма (Erich Gamma), Ричард Хелм (Richard Helm), Ральф Джонсон (Ralph Johnson), Джон Влиссидс (John Vlissides)

Шаблоны проектирования — описания взаимодействующих объектов и классов, нацеленные на решение общих проблем проектирования в определенном контексте.

Польза шаблонов:

  • обобщение опыта,
  • унификация словаря решений проектирования.
  • в GoF:
    • выявление неочевидных абстракций и объектов,
    • определение детальности разбиения на объекты,
    • определение интерфейсов.

Критика:

  • шаблоны — недостающие возможности ЯП,
    • зависимость шаблонов от языка,
  • повтор решений вместо реализации один раз,
  • чрезмерное усложнение (overengineering).

Элементы шаблона: имя, задача, решение, последствия.

Описание шаблона:

  • имя и классификация,
  • назначение,
  • альтернативные названия,
  • мотивация,
  • применимость,
  • структура,
  • участники,
  • взаимодействие,
  • последствия,
  • особенности реализации,
  • пример кода,
  • примеры использования,
  • связанные шаблоны.

Категории:

  • порождающие, структурные, поведенческие;
  • дополнительно (не в GoF): шаблоны параллельного программирования.

Emacs 24.3.1 (Org mode 8.2.10)

Validate