Сибирские интеграционные системы
AngularSIS #1.18 - https://www.youtube.com/playlist?list=PLmEQRj1_Mt5fkeBYOw1o8k_o8-7POFZJN JavaSIS #2.19 - https://www.youtube.com/playlist?list=PLmEQRj1_Mt5f5MlXGlf5kzldb9Rl8Pwuo
(ЧАСТЬ 2)
Романенко Константин
Тетерятников Алексей
Характерная задача проектирования [классов] и эффективный способ ее решения.
Имя - Задача - Решение - Результаты
У вас есть проблема ?
Да
Нет
Тогда не волнуйтесь!
Можете ли вы ее решить?
Нет
Да
Действуйте!
классификация шаблонов GRASP
принципы: high cohesion / low coupling
Cohesion - Сцепленность
the act or state of sticking together tightly
Coupling - Связывание
the act of bringing ... together
"... система должна состоять из слабо связанных классов, которые должны содержать связанную бизнес — логику."
Low Coupling
принцип GRASP: low coupling
Для конкретного класса: как добиться возможности повторного использования и незначительного влияния изменений ?
Минимизировать количество данных о других элементах!
принцип GRASP: low coupling
A
B
public class A {
private B b;
public A() {
this.b = new B(this);
}
}
public class B {
private A a;
public B(A a) {
this.a = a;
}
}
принцип GRASP: low coupling
Катавасия
кличка: String
ночноеЗрение: NightVision
принцип GRASP: low coupling
Катавасия
void питаться()
void спать()
Мышь найтиМышь()
...
принцип GRASP: low coupling
Катавасия
void питаться()
void спать()
...
принцип GRASP: low coupling
High Cohesion
принцип GRASP: high cohesion
Как обеспечить сфокусированность ответственности класса, управляемость и ясность?
Класс должны содержать сцепленную бизнес — логику!
принцип GRASP: high cohesion
Data
- temperature: int
- time: int;
...
- calcTemperature(): int
- calcTime(): int;
принцип GRASP: high cohesion
TemperatureData
- temperature: int
...
- calcTemperature(): int
TimeData
- time: int
...
- calcTime(): int
принцип GRASP: high cohesion
Сцепленный класс
Менее сцепленный класс
приватное свойство или метод
публичное свойство или метод
принципы GRASP: high cohesion / low coupling
Максимизируйте сфокусированность
Минимизируйте зависимости
приватное свойство или метод
публичное свойство или метод
принципы GRASP и SOLID
High Cohesion
GRASP
SOLID
Высокая сцепленность
Единственная ответственность
Single Responsibility
Низкое связывание
Разделение интерфейсов
Low Coupling
Interface Segregation
принцип GRASP: protected variations
Protected Variations
Как спроектировать систему классов, чтобы изменение в одном классе не оказывало нежелательного влияния на другие классы?
Распределите ответственности, чтобы обеспечить устойчивый интерфейс!
принцип GRASP: protected variations
Точка эволюции - предполагаемая точка ветвления, которая может возникнуть в будущем
Точка вариации - точка ветвления в существующей на данный момент системе
принцип GRASP: polymorphism
Как обрабатывать альтернативные варианты поведения на основе типа?
Для однотипных классов используйте полиморфные операции!
принципы protected variations & polymorhpism
class PasswordReminder {
// соединение с абстрактной СУБД
private DBConnectionInterface dbConnection;
PasswordReminder(DBConnectionInterface dbConnection) {
this.dbConnection = dbConnection;
}
}
принципы GRASP и SOLID
Dependency inversion principle
SOLID
GRASP
Устойчивость к изменениям
Protected Variations
Открытость/закрытость
Open/closed principle
Инверсия зависимостей
Полиморфизм
Принцип подстановки Барбары Лисков
классификация шаблонов в докладе
шаблон-роль GRASP: information expert
Каков базовый принцип распределения ответственностей ?
Информация должна обрабатываться там, где она содержится!
шаблон-роль GRASP: information expert
шаблон-роль GRASP: information expert
AreaCalculator
шаблон-роль GRASP: information expert
interface ShapeInterface {
public double area();
}
class Circle implements ShapeInterface {
public double area() {
return pi() * pow(shape->radius, 2)
}
}
шаблон-роль GRASP: information expert
Какой класс должен отвечать за создание нового экземпляра некоторого класса?
Смотрим дальше!
шаблон-роль GRASP: creator
Например, при разработке набора настольных игр, объект класса Board включает в себя 0..n
объектов класса Square
шаблон-роль GRASP: creator
шаблон-роль GRASP: creator
Какой класс должен отвечать координацию выполнения системных операций, поступающих
на уровне UI?
Отдельный класс Controller!
шаблон-роль GRASP: controller
шаблон-роль GRASP:controller
роль в GRASP: indirection
Как перераспределить обязанности, чтобы избавиться от прямого связывания классов?
Присвойте обязанности промежуточному объекту, который перенаправляет связи!
Используйте интерфейс!
РассчитатьНалог(позиция)
<<Интерфейс АдаптерРасчетаНалога>>
шаблон-роль GRASP: indirection
РассчитатьНалог(позиция)
<<АдаптерСистемы1>>
РассчитатьНалог(позиция)
<<АдаптерСистемы2>>
шаблон-роль GRASP: indirection
ГлавныйНалоговыйАдаптер
...
Продажа
ПолучитьВеличинуНалогов(Продажа)
РассчитатьНалог(позиция)
sum =итого()
роль в GRASP: pure fabrication
Какой класс должен обеспечить реализацию high cohesion/low coupling, если шаблон expert не подходит ?
Присвойте обязанности искусственному классу, не представляющему конкретного понятия предметной области!
Цель программной инженерии - построения ПО высокого качества.
Внешние факторы понятны пользователям (корректность, простота использования, эффективность, своевременность и др.)
Для разработчика так же важны внутренние факторы качества, которые делают ПО простым для понимания, модификации, документирования, поддержки и рефакторинга.
1. Крэг Ларман. Применение UML 2.0 и шаблонов проектирования (ozon.ru)
3. GRASP на youtube
3-b Сергей Немчинский
https://www.youtube.com/watch?v=jw3f8OrjYT0
https://www.youtube.com/watch?v=UxXsCS6fbJ0
2. GRASP на Хабр
1. Крэг Ларман. Применение UML 2.0 и шаблонов проектирования (ozon.ru)
By Сибирские интеграционные системы