Сибирские интеграционные системы
AngularSIS #1.18 - https://www.youtube.com/playlist?list=PLmEQRj1_Mt5fkeBYOw1o8k_o8-7POFZJN JavaSIS #2.19 - https://www.youtube.com/playlist?list=PLmEQRj1_Mt5f5MlXGlf5kzldb9Rl8Pwuo
Тетерятников Алексей
Романенко Константин
Подведение итогов
История появления принципов проектирования
S - (SRP) Принцип единственной ответственности
O - (OCP) Принцип открыт / закрыт
L - (LSP) Принцип подстановки Барбары Лисков
I - (ISP) Принцип разделения интерфейсов
D - (DIP) Принцип обращения зависимостей
Подведение итогов
История появления принципов проектирования
S - (SRP) Принцип единственной ответственности
O - (OCP) Принцип открыт / закрыт
L - (LSP) Принцип подстановки Барбары Лисков
I - (ISP) Принцип разделения интерфейсов
D - (DIP) Принцип обращения зависимостей
Время | Веха | Имена |
---|---|---|
середина 1980-х | шаблоны программирования | Кент Бек, Уорд Каннингем |
1988-1994 | шаблоны "Банды четырех" (GoF) | Эрих Гамма Ричард Хелм Ральф Джонсон Джон Влиссидес [ozon.ru] |
Время | Веха | Имена |
---|---|---|
1997 | принципы и шаблоны GRASP | Крэг Ларман [ozon.ru] |
2002 | принципы SOLID |
Роберт Мартин |
Разработчик APL, Lisp, Smalltalk
принципы GRASP
соавтор большого масштабируемого Scrum (Large-Scale Scrum)
1970-е
1997
2005
Консультант и автор в области разработки ПО
Автор известных книг:
Автор известных книг:
Принцип проектирования – это методологическое правило, которое выражает общий взгляд на разработку ПО.
Принцип проектирования – это методологическое правило, которое выражает общий взгляд на разработку ПО.
Хороший принцип является одновременно:
Абстрактным -
принцип должен описывать универсальное правило, а не конкретную практику.
Опровергаемым -
у разумного человека должна быть возможность не согласиться с принципом.
SRP
LSP
ISP
DIP
OCP
Задаемся вопросом:
"что делает класс?"
Уход за котом
SRP
LSP
ISP
DIP
OCP
1. Декомпозиция на ответственности
Описывается порядок ухода за котом -
ответственность одна?
2. Причина для изменений должна быть только одна
SRP
LSP
ISP
DIP
OCP
Уход за котом
Наполнить миску
Приготовить
Проверить запасы
{
Светить лазером
Бросать мяч
}
{
}
Погладь
3. Изменяемые вместе элементы должны быть рядом
Кормить
Развлекать
Уход за котом
Светить лазером
Бросать мяч
Наполнить миску
Приготовить
Проверить запасы
SRP
LSP
ISP
DIP
OCP
Погладь
Кормить
Наполнить миску
Приготовить
Проверить запасы
SRP
LSP
ISP
DIP
OCP
Изменения одного элемента обязательно приведет к изменению других
Нет причин изменять элемент отдельно
Класс имеет высокую связанность
1. Код разбивается на мелкие модули;
2. Четкое понимание, что делает модуль;
3. При совместной разработке упрощает процесс слияния кода;
SRP
LSP
ISP
DIP
OCP
4. Убирает лишние зависимости.
SRP
LSP
ISP
DIP
OCP
SRP
LSP
ISP
DIP
OCP
SRP
LSP
ISP
DIP
OCP
Тигр - тоже кот
SRP
LSP
ISP
DIP
OCP
Какой китикет?
Это ж Тигр!
switch(еда) {
case 'мясо':
case 'китикет':
сытость = 80%
Базовый Кот
сытость = 50%
}
Кормить(еда) {
}
SRP
LSP
ISP
DIP
OCP
switch(еда) {
case 'мясо':
case 'китикет':
сытость = 80%
Базовый Кот
сытость = 50%
}
Throw "Такое не ем!"
Кормить(еда) {
}
switch(еда) {
case 'мясо':
case 'китикет':
сытость = 80%
Тигр
}
Кормить(еда) {
}
Throw Exception!
SRP
LSP
ISP
DIP
OCP
Спи в коробке 50x50 см
Бегай за лазером
Китикет кушай
Мясо не кушай
SRP
LSP
ISP
DIP
OCP
Exception
Неожиданное поведение для клиентов
if (кот Сиамский)
...
elseif (кот Сфинкс)
...
Проверка типа в базовом классе
Невозможно установить правильность модели, рассматриваемой изолированно
SRP
LSP
ISP
DIP
OCP
Правильность модели можно выразить только в терминах ее клиентов
SRP
LSP
ISP
DIP
OCP
SRP
LSP
ISP
DIP
OCP
Кот:
Длина: <50 см;
Пушистый;
Вес: <20 кг.
Сытый Кот
(сытость > 50%)
Кот
Кормить()
Правило для производных классов:
SRP
LSP
ISP
DIP
OCP
1. Согласует поведение базового и производного класса;
2. Гарантирует корректность работы ПО при замене базового класса производным.
SRP
LSP
ISP
DIP
OCP
SRP
LSP
ISP
DIP
OCP
Клиенты не должны вынужденно зависеть от методов, которыми не пользуются
SRP
LSP
ISP
DIP
OCP
Интерфейс кота
Имя
Уход за котом
SRP
LSP
ISP
DIP
OCP
Выставка котов
Уход за котом
+
Интерфейс кота
Титул
Имя
Назначить титул (v)
SRP
LSP
ISP
DIP
OCP
Выставка котов
Ветеринарная клиника
Уход за котом
Интерфейс кота
История болезней
Титул
Имя
Назначить титул (v)
Внести болезнь (v)
+
+
SRP
LSP
ISP
DIP
OCP
Выставка котов
Ветеринарная клиника
Уход за котом
Интерфейс кота
Имя
Интерфейс болеющего
Имя
История болезней
Внести болезнь (v)
Интерфейс Конкурсанта
Имя
Титул
Назначить титул (v)
SRP
LSP
ISP
DIP
OCP
SRP
LSP
ISP
DIP
OCP
SRP
LSP
ISP
DIP
OCP
1. Код разбивается на мелкие модули;
2. уменьшает связанность между классом и его клиентом (low coupling).
SRP
LSP
ISP
DIP
OCP
SRP
LSP
ISP
DIP
OCP
SRP
LSP
ISP
DIP
OCP
SRP
LSP
ISP
DIP
OCP
SRP
LSP
ISP
DIP
OCP
SRP
LSP
ISP
DIP
OCP
Коробка
Постели подушку на дно
Подклей коробку (он её сгрыз)
Жди пока кот выспится
Кот
Спальня
Спать()
SRP
LSP
ISP
DIP
OCP
Коробка
Шкаф
Постели подушку на дно
Подклей коробку (он её сгрыз)
Жди пока кот выспится
Подними кота на шкаф
Подклей угол шкафа (он его сгрыз)
Жди пока кот выспится
Кот
Спальня
Спать()
SRP
LSP
ISP
DIP
OCP
Абстрактное спальное место
Шкаф
Домик для кота
Коробка
Подготовка
Восстановление
Жди пока кот выспится
Кот
Спальня
Спать()
SRP
LSP
ISP
DIP
OCP
1. Контроль над зависимостями в исходном коде;
2. Позволяет сделать модули автономными, переиспользуемыми;
SRP
LSP
ISP
DIP
OCP
SRP
LSP
ISP
DIP
OCP
Программные сущности должны быть:
SRP
LSP
ISP
DIP
OCP
SRP
LSP
ISP
DIP
OCP
Модуль называют открытым, если он еще доступен для расширения.
(имеется возможность расширить множество операций в нем или добавить поля к его структурам данных)
Модуль называют закрытым, если он доступен для использования другими модулями.
(Интерфейс модуля уже имеет строго определенное окончательное описание)
Разделять модули, которые изменяются по разным причинам
DIP
+
Выстраивать зависимости таким образом, чтобы не было зависимостей от наиболее изменяемых модулей
SRP
SRP
LSP
ISP
DIP
OCP
Абстрактное спальное место
Шкаф
Домик для кота
Коробка
Подготовка
Восстановление
Жди пока кот выспится
Кот
Спальня
Спать()
SRP
LSP
ISP
DIP
OCP
Новое поведение импорта / экспорта задается добавлением нового наследника ConfigItem
Реорганизация представлений
SRP
LSP
ISP
DIP
OCP
Механизм построения SQL запросов
SRP
LSP
ISP
DIP
OCP
Принципы нацелены на создание структур, которые:
By Сибирские интеграционные системы