Принципы проектирования SOLID. Принцип подстановки Барбары Лисков.

Данный принцип проектирования выглядит следующим образом: «Использование в программе вместо базового типа одного из его подтипов не должно привести к нарушению правильности работы программы».

Данный термин имеет самое непосредственное отношение к наследованию. Вообще, наследование следует применять только тогда, когда один из подтипов некоторого базового типа действительно является его частным случаем. Иногда при проектировании возникают ошибки, когда проектировщику кажется, что да, данный тип действительно представляет тот самый частный случай, но на деле потом оказывается, что один или несколько методов в общем-то работают совсем не так, как ожидает клиентский код. Поясним на классическом примере прямоугольника и квадрата.

Как вам должно быть известно, с точки зрения математики, квадрат является прямоугольником(квадрат — это прямоугольник, у которого все углы прямые). Поэтому мы могли бы создать следующую иерархию:

solid_lsp

Теперь в простейшем виде реализация этих классов будет выглядеть следующим образом.

Файл Rectangle.java:

Данный класс очень просто и содержит только переменные для хранения длины и высоты прямоугольника, а также метод для вычисления его площади.

Файл Square.java:

И вроде бы с точки зрения математики все кажется предельно логичным и понятным. Но в квадрате, в отличие от прямоугольника, мы устанавливаем одинаковую ширину и высоту. А теперь представим, что где-то в коде у нас есть метод calculateArea(), который в качестве параметра принимает прямоугольники проверяет, правильно ли была вычислена его площадь:

В этом примере клиентский код не ожидал такого поведения от подкласса класса Rectangle, поэтому в программе возникла ошибка. И хотя данный пример может быть немного надуманным, подобного рода ошибки проектирования часто возникают в реальных программах. Неожиданно измененное поведение методов базового класса в реализации подклассов может в итоге оказаться причиной многочисленных изменений в программе, поэтому при использовании наследования к процессу проектирования нужно относиться еще внимательнее.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *