Статьи

Твердые принципы: принцип замещения Лискова

Ранее мы погрузились в прочные принципы, включая единую ответственность и принцип открытого / закрытого типа .
Принцип подстановки Лискова (LSP) — это конкретное определение отношения подтипа, называемое (сильным) поведенческим подтипом,

Предположим, что объект S является подтипом объекта T, тогда объекты типа T могут быть заменены объектами типа S без изменения каких-либо желательных свойств T.

Предположим, у нас есть класс Employee.

01
02
03
04
05
06
07
08
09
10
package com.gkatzioura.solid.liskov;
 
public class Employee {
 
    public void work() {
 
        System.out.println("Employee is working");
    }
 
}

Также у нас есть другой класс, который наследует класс Employee.

1
2
3
4
5
6
7
8
9
package com.gkatzioura.solid.liskov;
 
public class EmployeeOnVacation extends Employee {
 
    @Override
    public void work() {
        throw new IllegalArgumentException("Employees on vacation should not work");
    }
}

Предположим, что у нас есть проект.

01
02
03
04
05
06
07
08
09
10
11
12
13
package com.gkatzioura.solid.liskov;
 
import java.util.List;
 
public class Project {
 
    public void start(List<Employee> employees) {
 
        for(Employee employee:employees) {
            employee.work();
        }
    }
}

И мы поручаем нашим сотрудникам начать работать над этим

1
2
3
4
5
6
List<Employee> employees = new ArrayList<>();
        employees.add(new EmployeeOnVacation());
        employees.add(new Employee());
 
        Project project = new Project();
        project.start(employees);

Результат будет исключением из-за работника, который находится в отпуске, и поэтому проект не будет завершен.
Чтобы не нарушать принцип, мы будем использовать другой подход и создадим два разных интерфейса для сотрудников.
Интерфейс WorkingEmployee.

1
2
3
4
5
6
package com.gkatzioura.solid.liskov;
 
public interface WorkingEmployee {
 
    public void work();
}

И интерфейс не работающего сотрудника.

1
2
3
4
5
6
package com.gkatzioura.solid.liskov;
 
public interface NonWorkingEmployee {
 
    void relax();
}

Таким образом, в проекте будут использоваться только те сотрудники, которые являются реализациями интерфейса WorkingEmployee.

1
2
3
4
List<WorkingEmployee> employees = new ArrayList<>();
        employees.add(new WorkingEmployeeImpl());
        Project project = new Project();
        project.start(employees);

Вы можете найти исходный код на github . Следующий принцип — принцип сегрегации интерфейса .

Также я составил шпаргалку, содержащую краткое изложение основных принципов.
Зарегистрируйтесь в ссылке, чтобы получить его.

Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG. Смотреть оригинальную статью здесь: Твердые принципы: принцип замещения Лискова

Мнения, высказанные участниками Java Code Geeks, являются их собственными.