Solid - основные принципы объектно-ориентированного программирования и проектирования.
Single responsibility - на каждый объект должна быть возложена одна единственная обязанность. Если сканер-принтер - нужно разделить.
Open–closed - программные сущности должны быть открыты для расширения, но закрыты для модификации. Интерфейс Shape с методом calculateArea(). Создаем реализации его (Circle, Rectangle) и описываем метод. А не в Shape описываем все возможные calculateArea().
Наследник не должен ломать поведение родителя.
Liskov substitution - объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения программы или наследующий класс должен дополнять, а не замещать поведение базового класса. Мы должны всегда иметь возможно заменить в любом месте программы родительский класс на дочерний, без влияния на выполнение программы. Чтобы когда мы указываем родителя как тип переменной мы должны быть уверенны что каждый наследник который будет помещен будет выполнять его методы как мы ожидаем.
class Rectangle {
protected int width;
protected int height;
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public int getArea() {
return width * height;
}
}
class Square extends Rectangle {
@Override
public void setWidth(int width) {
this.width = width;
this.height = width; // ломаем ожидания
}
@Override
public void setHeight(int height) {
this.width = height;
this.height = height;
}
}
public void resize(Rectangle r) {
r.setWidth(5);
r.setHeight(10);
System.out.println(r.getArea());
}
//Ожидаем: 5 * 10 = 50
//Но если передать Square, получится 100.
Interface segregation - много специальных интерфейсов лучше, чем один общий интерфейс. Убирает необходимость реализации тех методов которые мы не будем использовать.