39
5. Проектирование Программирование на Java Федор Лаврентьев МФТИ, 2016

Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

Embed Size (px)

Citation preview

Page 1: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 2: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

Page 3: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

Page 4: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

Page 5: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

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

Page 6: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

Page 7: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

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

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

Page 8: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

Page 9: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 10: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 11: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 12: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

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

Page 13: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

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

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

Page 14: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

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

Page 15: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

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

Page 16: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 17: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

Пример многослойной архитектуры• Представление – 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

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

Page 19: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

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

Page 20: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

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

Page 21: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

Page 22: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

Одиночка (Singleton)

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

Page 23: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 24: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 25: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 26: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 27: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 28: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

Page 29: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 30: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 31: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 32: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 33: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

Фасад (Facade)

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

Page 34: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

Page 35: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 36: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 37: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 38: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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

Page 39: Programming Java - Lection 05 - Software Design - Lavrentyev Fedor

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

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