ВВЕДЕНИЕ
Я работаю над своей магистерской диссертацией о проблемах наследования и разрабатываю некоторые индикаторы, которые показывают, что проблема наследования существует.
Как в следующем примере:
ПРИМЕР
public static String getAnimalNoise(Animal animal) {
if (animal instanceof Dog)
return "Woof";
if (animal instanceof Cat)
return "Miau";
return "";
}
Метод возвращает String "Woof"
, если данный экземпляр Animal является Dog
и "Miau"
, если это Cat
. Пустая строка, потому что некоторые животные вообще не издают звуков.
Поэтому правильным решением для этого должно быть использование полиморфизма с getNoise
методом в классе Animal.
Я проанализировал различные индикаторы проблем наследования и хочу сказать, нарушают ли некоторые из них SOLID принцип < / а>.
Я думал, что приведенный выше пример нарушает:
- Принцип единой ответственности (SRP)
- Принцип открытости / закрытости (OCP)
- Принцип замещения Лискова (LSP)
- Принцип инверсии зависимостей (DIP)
Но я не совсем уверен, верно ли это для всех.
Я думал:
ПРИНЦИПНЫЕ НАРУШЕНИЯ
Нарушение SRP
Потому что условные операторы вообще нарушают SRP, потому что, как оператор switch case или несколько операторов if-else, считаются более чем одной обязанностью.
Существует два случая, поэтому есть несколько причин для изменения метода.
Нарушение OCP
Потому что, если добавляется новое животное, к методу должен быть добавлен новый случай, поэтому метод не будет закрыт для модификаций.
НАРУШЕНИЕ LSP
Каждая ветвь выполняет разные действия в зависимости от подтипа животных. Что, по моему мнению, нарушает LSP ?! Я знаю пример прямоугольника, квадрата и getArea, но этот пример, как я думал, также подходит для нарушения.
НАРУШЕНИЕ ПОГРУЖЕНИЯ
Условные операторы принимают зависимость, что означает, что операторы зависят от деталей, а не от абстракций, которые нарушают DIP.
ВОПРОС:
Итак, для данного примера вопрос заключается в том, действительно ли нарушаются данные принципы и верны ли рассуждения?