Принцип подстановки Лискова заключается в L в SOLID объектно-ориентированном дизайне, и, несмотря на то, что у него одно из наиболее устрашающе звучащих названий из 5 принципов , на самом деле это довольно легко обдумать.
На самом деле это так просто, что вы поймете это примерно через 3 минуты.
LSP, проще говоря, гласит, что объекты одного и того же суперкласса должны иметь возможность меняться местами друг с другом, ничего не нарушая.
Если у нас есть класс Cat
и класс Dog
, производный от класса Animal
, любые функции, использующие класс Animal
, должны иметь возможность использовать Кошка
или Собака
и ведут себя нормально.
Даже это определение не совсем хорошо объясняет это, так что давайте применим его на практике. Все станет ясно с кодом.
В истинном стиле ООП давайте создадим суперкласс Animal
и Dog |/и
Кошка подкласс и захватите их любимые виды пищи.
public static class Animal { public String favoriteFood; public Animal(String favoriteFood) { this.favoriteFood = favoriteFood; } } public static class Dog extends Animal { public Dog(String favoriteFood) { super(favoriteFood); } } public static class Cat extends Animal { public Cat(String favoriteFood) { super(favoriteFood); } }
Теперь мы хотим создать метод, который позволит нам дать этим милашкам немного удовольствия. Я не хочу помещать этот метод в классы Animal
, потому что это me кормление животных, а не поведение, присущее животным. Что-то вроде Dog.feed
мог бы донести суть, но я думаю, что feed (Dog)
лучше, не так ли?
Давайте создадим этот метод и вызовем его Дайте Угощение
:
public static void GiveTreatTo(Animal animal) { String msg = "You fed the " + animal.getClass().getSimpleName() + " some " + animal.favoriteFood; System.out.println(msg); }
Смотрите здесь, что Дать Угощение
берет любое Animal
в качестве параметра. Поскольку наши конструкторы Animal
назначают любимую пищу животного, мы можем в значительной степени рассчитывать на то, что эти данные всегда будут там.
Это означает, что нам не нужно создавать метод для каждого животного, т.Е. Дать Лакомство собаке
и GiveTreatToCat
. Поскольку мы внедрили LSP, у нас есть один метод. Давайте посмотрим на это в действии:
public static void main(String[] args) { Dog rover = new Dog("bacon"); Cat bingo = new Cat("fish"); GiveTreatTo(rover); GiveTreatTo(bingo); }
Теперь, если мы правильно внедрили LSP, эта программа должна работать просто отлично. Давайте проверим результат:
You gave the Dog some bacon You gave the Cat some fish
Удивительный. Еще одним преимуществом этого принципа является то, что мы можем добавлять все больше и больше подклассов Animal
, а затем Give Treat To
методу не нужно будет ничего переделывать.
Довольно не пугающе, не так ли? Как и во многих вещах в программировании и информатике, название противоречит его простоте. Теперь идите туда и сделайте свои подклассы взаимозаменяемыми, и поблагодарите доктора Барбару Лисков за такой полезный принцип.
Оригинал: “https://dev.to/erikwhiting88/liskov-substitution-principle-in-3-minutes-2dc6”