Solid

Что это

Solid - основные принципы объектно-ориентированного программирования и проектирования.

Single responsibility(Принцип единственной ответственности)

Single responsibility - на каждый объект должна быть возложена одна единственная обязанность. Если сканер-принтер - нужно разделить.

Open–closed(Принцип открытости/закрытости)

Open–closed - программные сущности должны быть открыты для расширения, но закрыты для модификации. Интерфейс Shape с методом calculateArea(). Создаем реализации его (Circle, Rectangle) и описываем метод. А не в Shape описываем все возможные calculateArea().

Liskov substitution(Принцип подстановки Барбары Лисков)

Наследник не должен ломать поведение родителя.

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.
        

Как применять в Java

Interface segregation(Принцип разделения интерфейса)

Interface segregation - много специальных интерфейсов лучше, чем один общий интерфейс. Убирает необходимость реализации тех методов которые мы не будем использовать.

Dependency inversion(Принцип инверсии зависимостей)

Описание

SOLID

  1. Принцип инверсии зависимостей(dependency inversion) - зависимость на Абстракциях. Модули верхних уровней не должны зависеть от модулей нижних уровней. Всё должно зависеть от абстракции. Хороший пример: реализации мест хранения информации(БД).