Programmers make architectural decisions everyday with each new feature, a tiny fix or an overhauling refactoring. Unfortunately, a fashionable pattern-of-the-day or a cutting edge technology is often given undue emphasis, whereas a comprehensive quality picture is overlooked. We will discuss the symptoms of a rotting design and how to avoid them by applying the SOLID architecture design principles.
Andrey is a full-stack software developer with more than 10 years of experience with C#, .NET, SQL, Java and the web. Currently he is programming mostly in Java and JavaScript for the mobile web.
21. class Printer {
void backspace();
int getPosition();
}
21
void test(Printer p) {
int pos = p.getPosition();
p.backspace();
assert p.getPosition() == pos – 1;
}
class ForwardOnlyPrinter extends Printer {
// backspace() теперь ничего не делает!
}
22. Принцип Подстановки Барбары Лисков
The Liskov Substitution Principle
Наследники должны быть совместимы с
базовыми классами.
Везде, где можно использовать базовый класс,
должно быть можно использовать и
наследника.
Подразумеваемый контракт
Дилемма «Круг или Эллипс?»
22
24. Принцип Инверсии Зависимости
The Dependency Inversion Principle
Зависеть от абстракций, а не от реализаций.
Реализации постоянно меняются, тогда как
абстракции меняются намного реже.
Абстракции – шарнирные точки, места для
подключения расширений без модификации.
Исключения: непеременчивые модули с единой
реализацией, например: String. Осторожно!
24
25. @Autowired
private DeviceFactory devices;
void helloWorld() {
Printer p = devices.connectPrinter();
p.write(“Hello World..”);
p.backspace(2);
p.write(“!”);
devices.disconnect(p); // в try/finally, конечно
}
25
26. Принцип Разделения Интерфейсов
The Interface Segregation Principle
Много специфичных интерфейсов – лучше, чем один
универсальный.
Один метод на интерфейс, иногда – совершенно
верное решение, но не переборщите с этим!
26
36. Принцип Стабильных Зависимостей
Зависьте от пакетов с I меньше
вашего.
A – количество классов вне
пакета, зависящих от классов в
пакете
E – количество классов вне пакета,
от которых зависят классы внутри
пакета
I - нестабильность
36
I =
E
A + E
37. Принцип Стабильных Абстракций
Стабильность против гибкости?
Вспоминаем Открытый/Закрытый принцип.
Стабильные пакеты должны быть абстрагированными
пакетами.
37
38. Перед вставкой очередной строчки
кода, спросите:
Она подходит сюда?
Где она должна быть?
Отражает ли имя этой сущности её назначение?
Как она должна называться?
Она останется здесь навсегда?
Что может измениться?
38