Объектно-ориентированный анализ и проектирование

Объектно-ориентированный анализ отвечает: какие понятия, состояния и правила есть в предметной области. Проектирование отвечает: как распределить эти обязанности между программными объектами.

Анализ

Начинаю не с классов, а со сценария:

Клиент подтверждает заказ.
Заказ проверяет допустимость перехода.
Платёж подтверждает исполнение обязательства.
Повтор команды не создаёт второй результат.

Из текста выделяются:

  • сущности с идентичностью;
  • значения без самостоятельной идентичности;
  • действия и доменные события;
  • инварианты;
  • границы транзакции;
  • внешние участники.

Семантику терминов фиксирует Представление системы семантической моделью.

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

Ответственность размещаю рядом с данными, инвариант которых она защищает:

final class Order {
    private OrderStatus status;
 
    void confirmPayment() {
        if (status != OrderStatus.NEW) {
            throw new IllegalStateException("Unexpected state: " + status);
        }
        status = OrderStatus.PAID;
    }
}

Это предпочтительнее объекта только с getters/setters, если переход является доменным правилом.

Отношения

  • ассоциация — один объект знает другой;
  • композиция — часть принадлежит целому и разделяет жизненный цикл;
  • агрегация — более слабое отношение целого и части;
  • наследование — отношение «является» с подстановкой;
  • зависимость — временное использование.

Композиция часто безопаснее наследования: она не связывает подкласс со внутренними решениями родителя.

Какие диаграммы полезны

  • диаграмма классов — структура и отношения;
  • sequence diagram — порядок взаимодействий;
  • state diagram — допустимые переходы;
  • component diagram — крупные зависимости.

Диаграмма нужна, если отвечает на вопрос; она не заменяет код и тесты.

Связано: Основы ООП, Формализованное описание элементов системы и взаимодействия между ними.

Самопроверка

  • Чем объект анализа отличается от Java-класса?
  • Где лучше держать инвариант перехода состояния?
  • Когда наследование нарушает подстановку?