Рубрики
Без рубрики

Принцип замены Лискова за 3 минуты

Принцип подстановки Лискова является связующим звеном между объектно-ориентированным дизайном, и, несмотря на наличие одного из… Помеченный как java, ооп.

Принцип подстановки Лискова заключается в 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”