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

Тема 3

Проектирование программных систем — это деятельность, результат которой состоит из двух составных частей:

Уровень Описание
Архитектурный дизайн (макро уровень) Описание высокоуровневой структуры и организации крупных компонентов системы. Концептуальное или эскизное проектирование.
Детализированная архитектура (мини уровень) Описание каждого компонента в объеме, необходимом для реализации.

1. Элементы проектирования

**──────────── Архитектура ────────────
Подсистема
    │
Компонент
    │
──────────── Граница проектирования ────────────────
Модуль
    │
Класс
    │
Метод
──────────── Реализация ─────────────
**

Компонент — основная единица архитектурного проектирования , а модуль — основная единица детального проектирования

PlantUML diagram

Инженерная задача

Дана архитектура системы. Для каждого компонента:

  1. определить его внутреннюю структуру;
  2. выделить модули;
  3. определить классы;
  4. определить интерфейсы;
  5. определить взаимодействия.

Артефакт

Design Model

Component
    ↓
Module
    ↓
Class
    ↓
Method

2. Декомпозиция структуры ПО

Декомпозиция — это не разбиение кода на файлы, а распределение ответственности между независимыми частями системы.

SD_decomp.png

Модуль — это логически обособленная часть программного кода (файл, класс, пакет), выполняющая определенную функцию и предоставляющая четкий интерфейс для взаимодействия. Модульность оценивается двумя фундаментальными метриками:

Зацепление\связанность (Cohesion) показывает, насколько элементы внутри одного модуля сфокусированы на выполнении единой задачи.

Связность\сцепление (Coupling) показывает степень взаимозависимости модулей. Изменение в одном модуле не должно ломать другой.

        ВНУТРИ                         МЕЖДУ

       COHESION                      COUPLING
          ↑                              ↓
     высокая лучше                  низкая лучше

Инкапсуляция реализации

внутренние классы могут изменяться без изменения внешних клиентов

Инженерная задача

Разделите заданную систему на модули так, чтобы изменение одного модуля минимально затрагивало остальные.

Артефакт

Диаграмма декомпозиции модулей

3. Принципы SOLID

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

Принцип Вопрос проектировщика
SRP Сколько причин для изменения у класса?
OCP Нужно ли изменять существующий код при добавлении поведения?
LSP Можно ли заменить реализацию без нарушения контракта?
ISP Не заставляем ли клиента зависеть от ненужных методов?
DIP Зависит ли код от абстракции или конкретной реализации?

Инженерная задача

Дан «плохой» класс:

OrderManager
 ├── calculatePrice()
 ├── saveToDatabase()
 ├── sendEmail()
 ├── generatePDF()
 └── validateUser()

Разделить его на несколько классов.

Артефакт

UML диаграмма классов

Принципы GRASP (Шаблоны распределения обязанностей)

  • Information Expert (Информационный эксперт): Обязанность по выполнению действия должна принадлежать тому классу, у которого есть вся необходимая информация для этого.
  • Creator (Создатель): Определяет, какой класс должен создавать экземпляры другого класса.
  • Controller (Контроллер): Не визуальный компонент, который отвечает за обработку системных событий от пользователя.
  • Low Coupling & High Cohesion: Фундаментальные метрики (слабая связанность модулей и высокая сфокусированность задач внутри одного класса).

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

Шаблон это описание хорошо проверенной, обобщенной схемы решения некоторой часто повторяющейся проблемы (задачи) разработки ПО, которая возникает в некоторых специфических условиях (контексте).

Категория Назначение Классические примеры
Порождающие (Creational) Изолируют систему от процесса создания объектов, делая его гибким. Singleton (Одиночка), Factory Method (Фабричный метод), Builder (Строитель).
Структурные (Structural) Отвечают за компоновку классов и объектов в более крупные и гибкие структуры. Adapter (Адаптер), Facade (Фасад), Decorator (Декоратор).
Поведенческие (Behavioral) Алгоритмы и распределение обязанностей между взаимодействующими объектами. Observer (Наблюдатель), Strategy (Стратегия), Command (Команда).

Инженерная задача

Дана проблема:

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

  1. определить проектную проблему;
  2. найти несколько вариантов решения;
  3. выбрать паттерн;
  4. построить диаграмму;
  5. объяснить последствия.

Артефакт

Проект, основанный на паттерне

Например:

Context
   ↓
Problem
   ↓
Alternative solutions
   ↓
Pattern
   ↓
Design

5. Семейства программ и фреймворки

Повторное использование кода (Software Reuse) — один из главных способов снижения стоимости и времени разработки ПО. Семейства программ и фреймворки представляют собой системные инженерные подходы к реализации массового повторного использования на макро- и микро-уровнях.

Семейство программ (или линейка продуктов) — это набор программных систем, которые разделяют общее управляемое множество архитектурных свойств, создаются из единой базы базовых активов (Core Assets) и предназначены для удовлетворения потребностей конкретной рыночной ниши или миссии.

Инженерия семейств программ строится на жестком разделении системы на две части:

  • Стабильное архитектурное ядро, общее для всех программ в линейке (например, ядро операционной системы, базовые функции СУБД).
  • Точки варьирования, в которых продукты семейства адаптируются под конкретного клиента или задачу (например, поддержка разных языков интерфейса, специфические драйверы, разные алгоритмы шифрования).

Двухуровневый процесс инженерии в SPL:

  1. Инженерия предметной области (Domain Engineering): Разработка многократно используемых компонентов, платформы, инструментов и общей архитектуры семейства («взгляд внутрь»).
  2. Инженерия приложений (Application Engineering): Сборка конкретного конечного продукта для заказчика на основе платформы, созданной на первом этапе, путем настройки точек изменчивости («взгляд наружу»).

Фреймворк — это полуфабрикат программной системы, представляющий собой расширяемую архитектурную основу (каркас), которую разработчик дополняет собственным кодом для создания конкретного приложения.

SD_lib_frime.png

Инженерная задача

Дана задача:

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

Обосновать выбор.

📝 Стандартные задачи