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

Тема 3

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

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

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

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

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

PlantUML diagram

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

SD_decomp.png

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

Зацепление\связанность (Cohesion) — внутри модуля

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

Связность\сцепление (Coupling) — между модулями

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

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

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

3. Принципы SOLID

На микро-уровне

Принципы SOLID

  • S (Single Responsibility): Каждый класс/модуль должен иметь ровно одну причину для изменения (одну бизнес-функцию).
  • O (Open/Closed): Программные сущности должны быть открыты для расширения, но закрыты для модификации.
  • L (Liskov Substitution): Объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности работы программы.
  • I (Interface Segregation): Много специализированных интерфейсов лучше, чем один универсальный. Клиенты не должны зависеть от методов, которые они не используют.
  • D (Dependency Inversion): Зависимости должны строиться на абстракциях (интерфейсах), а не на конкретных реализациях.

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

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

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

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

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

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

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

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

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

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

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

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

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

SD_lib_frime.png

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