![Page 1: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/1.jpg)
5. ПроектированиеПрограммирование на Java
Федор ЛаврентьевМФТИ, 2016
![Page 2: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/2.jpg)
Компоновка приложения
![Page 3: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/3.jpg)
Проблемы длительной разработки• Число сущностей растет• Число связей растет на порядок быстрее• На каком-то этапе наступает коллапс разработки
![Page 4: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/4.jpg)
Логическая компонента• Компонента – автономная логическая единица кода• Компонента предоставляет наружу контракт (см. далее)• Компоненты взаимодействуют друг с другом• Компонента – понятие рекуррентное (или фрактальное?..)
![Page 5: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/5.jpg)
Связность (cohesion) и сцепление (coupling)• Связность – мера силы взаимосвязанности элементов
внутри компоненты; способ и степень связанности между задачами, выполняемыми компонентой• Сцепление – мера, способ и степень взаимозависимости между
различными компонентами
![Page 6: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/6.jpg)
Основная идея проектирования• Меньше сцепление – больше связность
![Page 7: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/7.jpg)
Модульность• Принцип модульности – код разделяется на отдельные
функционально законченные модули• Контракт - формальное соглашение о способе использовании
модуля• API (Application Programming Interface) – интерфейс
взаимодействия с модулем• SPI (Service Provider Interface) – точки расширения модуля• Часто интерфейс и реализацию разносят в раздельные модули
![Page 8: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/8.jpg)
Архитектура системы
![Page 9: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/9.jpg)
Этапы каскадной разработки
• Анализ требований• Проектирование• Реализация• Тестирование• Внедрение
![Page 10: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/10.jpg)
Этап проектирования системы• Исходные данные – требования от заказчика• Из требований следуют внешние свойства системы• Задача проектирования – придумать внутреннее устройство
системы, обеспечивающее заданные внешние свойства• Алгоритмы решения задач и требуемые структуры данных• Архитектура системы – логические компоненты и связи между ними• Механизмы хранения и передачи состояния
![Page 11: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/11.jpg)
Многослойная (layered) архитектураСистема разбивается на несколько слоёв:
• Слой представления (View Layer)• Управляющий слой (Controller Layer)• Сервисный слой (Service Layer)• Слой модели предметной области (Domain Model Layer)• Слой источников данных (Data Sources Layer)
![Page 12: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/12.jpg)
Слой источников данных• Делает запросы к базам данных или другим внешним сервисам• Например, к базе данных с банковскими счетами
• Формирует запросы и разбирает ответы• Предоставляет интерфейс (API)• CRUD операции (Create, Read, Update, Delete) над таблицами• Часто используемые запросы• Конструктор запросов
• Абстрагирует верхние слои от реалий конкретной базы данных
![Page 13: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/13.jpg)
Слой модели предметной области• Содержит в себе логику предметной области• Например, управляет объектами «счёт в банке»
• Отвечает за целостность представления данных• Например, что нельзя снять со счета больше денег, чем там есть
• Предоставляет интерфейс (API)• CRUD операции над объектами предметной области• Типовые модификации (перевод денег между счетами)• Метаинформация (число открытых счётов)
• Абстрагирует верхние слои от управления состоянием предметной области
![Page 14: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/14.jpg)
Сервисный слой • Отвечает за взаимодействие между компонентами предметной
области• Например, за взаимодействие счетов и покупок
• Управляет выполнением запросов от пользователя• Предоставляет бизнес-ориентированный интерфейс (API)• Сделать покупку• Перевести со счета на счет• Ввести деньги на счет• Создать нового пользователя
![Page 15: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/15.jpg)
Управляющий слой (контроллер)• Отвечает за приемку управляющих команд от пользователя или
других сервисов• Аргументы командной строки• REST или SOAP интерфейс• TCP или Unix socket
• Перенаправляет управляющие команды в сервисный слой• При необходимости использует данные от слоя модели• Сообщает пользователю результат выполнения команды
![Page 16: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/16.jpg)
Слой представления• Взаимодействует с человеком• Предоставляет человекочитаемый интерфейс• Web-приложение с HTML-выдачей• Графическое оконное приложение (WinAPI, QT, ...)• Утилита командной строки
• Перенаправляет все запросы к контроллеру• Принимает ответы от контроллера
![Page 17: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/17.jpg)
Пример многослойной архитектуры• Представление – 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);
![Page 18: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/18.jpg)
Шаблоны проектирования
![Page 19: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/19.jpg)
Шаблон проектирования• Многослойная архитектура (Multilayered architecture) – это
пример архитектурного шаблона проектирования• Шаблон проектирования – повторимая архитектурная
конструкция, решающая конкретную частую проблему проектирования• Другие архитектурные шаблоны проектирования:• MVC (Model-View-Controller)• Client-Server• Multitier application• Broker• ...
![Page 20: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/20.jpg)
Разновидности шаблонов проектирования• Порождающие – создание новых объектов• Структурные – организация интерфейсов между объектами• Поведенческие – взаимодействие между объектами и деление
ответственности
• Архитектурные, фундаментальные, конкурентные, корпоративные, ...
![Page 21: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/21.jpg)
Порождающие шаблоны• Одиночка (Singleton)• Абстрактная фабрика (Abstract Factory)• Фабричный метод (Factory Method)• Строитель (Builder)• Объектный пул (Object pool)• Отложенная инициализация (Lazy Initialization)• ...
![Page 22: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/22.jpg)
Одиночка (Singleton)
https://habrahabr.ru/post/210288/
![Page 23: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/23.jpg)
Абстрактная фабрика (Abstract Factory)
https://habrahabr.ru/post/210288/
![Page 24: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/24.jpg)
Фабричный метод (Factory Method)
https://habrahabr.ru/post/210288/
![Page 25: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/25.jpg)
Строитель (Builder)
https://habrahabr.ru/post/210288/
![Page 26: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/26.jpg)
Объектный пул (Object Pool)
http://wiki3.cosc.canterbury.ac.nz/index.php/Object_pool
![Page 27: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/27.jpg)
Отложенная инициализация (Lazy Init)
http://design-pattern.ru/patterns/lazy-load.html
![Page 28: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/28.jpg)
Структурные шаблоны• Декоратор (Decorator)• Обёртка (Wrapper, Adapter)• Заместитель (Proxy)• Компоновщик (Composite)• Фасад (Facade)• ...
![Page 29: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/29.jpg)
Декоратор (Decorator)
https://habrahabr.ru/post/210288/
![Page 30: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/30.jpg)
Обертка (Wrapper, Adapter)
https://habrahabr.ru/post/210288/
![Page 31: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/31.jpg)
Заместитель (Proxy)
https://habrahabr.ru/post/210288/
![Page 32: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/32.jpg)
Компоновщик (Composite)
https://habrahabr.ru/post/210288/
![Page 33: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/33.jpg)
Фасад (Facade)
https://habrahabr.ru/post/210288/
![Page 34: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/34.jpg)
Поведенческие шаблоны• Стратегия (Strategy)• Состояние (State)• Итератор (Iterator, Cursor)• Наблюдатель (Observer, Publish/Subscribe)• Цепочка обязанностей (Chain of Responsibility)• ...
![Page 35: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/35.jpg)
Стратегия (Strategy)
https://habrahabr.ru/post/210288/
![Page 36: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/36.jpg)
Состояние (State)
https://habrahabr.ru/post/210288/
![Page 37: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/37.jpg)
Итератор (Iterator, Cursor)
https://habrahabr.ru/post/210288/
![Page 38: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/38.jpg)
Наблюдатель (Observer)
https://habrahabr.ru/post/210288/
![Page 39: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor](https://reader031.vdocuments.net/reader031/viewer/2022022202/587991f31a28ab95318b5c4b/html5/thumbnails/39.jpg)
Цепочка обязанностей (Chain of responsibility)
https://habrahabr.ru/post/210288/