Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

Preview:

Citation preview

5. ПроектированиеПрограммирование на Java

Федор ЛаврентьевМФТИ, 2016

Компоновка приложения

Проблемы длительной разработки• Число сущностей растет• Число связей растет на порядок быстрее• На каком-то этапе наступает коллапс разработки

Логическая компонента• Компонента – автономная логическая единица кода• Компонента предоставляет наружу контракт (см. далее)• Компоненты взаимодействуют друг с другом• Компонента – понятие рекуррентное (или фрактальное?..)

Связность (cohesion) и сцепление (coupling)• Связность – мера силы взаимосвязанности элементов

внутри компоненты; способ и степень связанности между задачами, выполняемыми компонентой• Сцепление – мера, способ и степень взаимозависимости между

различными компонентами

Основная идея проектирования• Меньше сцепление – больше связность

Модульность• Принцип модульности – код разделяется на отдельные

функционально законченные модули• Контракт - формальное соглашение о способе использовании

модуля• API (Application Programming Interface) – интерфейс

взаимодействия с модулем• SPI (Service Provider Interface) – точки расширения модуля• Часто интерфейс и реализацию разносят в раздельные модули

Архитектура системы

Этапы каскадной разработки

• Анализ требований• Проектирование• Реализация• Тестирование• Внедрение

Этап проектирования системы• Исходные данные – требования от заказчика• Из требований следуют внешние свойства системы• Задача проектирования – придумать внутреннее устройство

системы, обеспечивающее заданные внешние свойства• Алгоритмы решения задач и требуемые структуры данных• Архитектура системы – логические компоненты и связи между ними• Механизмы хранения и передачи состояния

Многослойная (layered) архитектураСистема разбивается на несколько слоёв:

• Слой представления (View Layer)• Управляющий слой (Controller Layer)• Сервисный слой (Service Layer)• Слой модели предметной области (Domain Model Layer)• Слой источников данных (Data Sources Layer)

Слой источников данных• Делает запросы к базам данных или другим внешним сервисам• Например, к базе данных с банковскими счетами

• Формирует запросы и разбирает ответы• Предоставляет интерфейс (API)• CRUD операции (Create, Read, Update, Delete) над таблицами• Часто используемые запросы• Конструктор запросов

• Абстрагирует верхние слои от реалий конкретной базы данных

Слой модели предметной области• Содержит в себе логику предметной области• Например, управляет объектами «счёт в банке»

• Отвечает за целостность представления данных• Например, что нельзя снять со счета больше денег, чем там есть

• Предоставляет интерфейс (API)• CRUD операции над объектами предметной области• Типовые модификации (перевод денег между счетами)• Метаинформация (число открытых счётов)

• Абстрагирует верхние слои от управления состоянием предметной области

Сервисный слой • Отвечает за взаимодействие между компонентами предметной

области• Например, за взаимодействие счетов и покупок

• Управляет выполнением запросов от пользователя• Предоставляет бизнес-ориентированный интерфейс (API)• Сделать покупку• Перевести со счета на счет• Ввести деньги на счет• Создать нового пользователя

Управляющий слой (контроллер)• Отвечает за приемку управляющих команд от пользователя или

других сервисов• Аргументы командной строки• REST или SOAP интерфейс• TCP или Unix socket

• Перенаправляет управляющие команды в сервисный слой• При необходимости использует данные от слоя модели• Сообщает пользователю результат выполнения команды

Слой представления• Взаимодействует с человеком• Предоставляет человекочитаемый интерфейс• Web-приложение с HTML-выдачей• Графическое оконное приложение (WinAPI, QT, ...)• Утилита командной строки

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

Пример многослойной архитектуры• Представление – Web-сервис управления банковским счетом

• http://coolbank.ru/

• Контроллер – HTTP-контроллер• http://coolbank.ru/register – открыть новый счет• http://coolbank.ru/account - информация о счете• http://coolbank.ru/transfer – сделать перевод

• Сервисный слой – класс AccountService• accountService.newAccount(String name);• accountService.getAccount(String name);• accountService.transfer(String source, String dest, double amount);

• Слой модели – класс BalanceManager• balanceService.getBalance(int accountId);• balanceService.add(int accountId, double amount);

• Слой источников данных – класс BalanceDAO• balanceDao.getBalance(int accountId);• balanceDao.updateBalance(int accountId, double newAmount);

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

Шаблон проектирования• Многослойная архитектура (Multilayered architecture) – это

пример архитектурного шаблона проектирования• Шаблон проектирования – повторимая архитектурная

конструкция, решающая конкретную частую проблему проектирования• Другие архитектурные шаблоны проектирования:• MVC (Model-View-Controller)• Client-Server• Multitier application• Broker• ...

Разновидности шаблонов проектирования• Порождающие – создание новых объектов• Структурные – организация интерфейсов между объектами• Поведенческие – взаимодействие между объектами и деление

ответственности

• Архитектурные, фундаментальные, конкурентные, корпоративные, ...

Порождающие шаблоны• Одиночка (Singleton)• Абстрактная фабрика (Abstract Factory)• Фабричный метод (Factory Method)• Строитель (Builder)• Объектный пул (Object pool)• Отложенная инициализация (Lazy Initialization)• ...

Одиночка (Singleton)

https://habrahabr.ru/post/210288/

Абстрактная фабрика (Abstract Factory)

https://habrahabr.ru/post/210288/

Фабричный метод (Factory Method)

https://habrahabr.ru/post/210288/

Строитель (Builder)

https://habrahabr.ru/post/210288/

Объектный пул (Object Pool)

http://wiki3.cosc.canterbury.ac.nz/index.php/Object_pool

Отложенная инициализация (Lazy Init)

http://design-pattern.ru/patterns/lazy-load.html

Структурные шаблоны• Декоратор (Decorator)• Обёртка (Wrapper, Adapter)• Заместитель (Proxy)• Компоновщик (Composite)• Фасад (Facade)• ...

Декоратор (Decorator)

https://habrahabr.ru/post/210288/

Обертка (Wrapper, Adapter)

https://habrahabr.ru/post/210288/

Заместитель (Proxy)

https://habrahabr.ru/post/210288/

Компоновщик (Composite)

https://habrahabr.ru/post/210288/

Фасад (Facade)

https://habrahabr.ru/post/210288/

Поведенческие шаблоны• Стратегия (Strategy)• Состояние (State)• Итератор (Iterator, Cursor)• Наблюдатель (Observer, Publish/Subscribe)• Цепочка обязанностей (Chain of Responsibility)• ...

Стратегия (Strategy)

https://habrahabr.ru/post/210288/

Состояние (State)

https://habrahabr.ru/post/210288/

Итератор (Iterator, Cursor)

https://habrahabr.ru/post/210288/

Наблюдатель (Observer)

https://habrahabr.ru/post/210288/

Цепочка обязанностей (Chain of responsibility)

https://habrahabr.ru/post/210288/