Instanceof
: (почти) всегда вреден
Я посмотрел на все ответы на ваш пост и попытался понять, что вы делаете.И я пришел к выводу, что instanceof
- это в точности , что вы хотите, и ваш исходный пример кода был в порядке.
Вы уточнили, что:
Вы не нарушаете принцип подстановки Лискова, поскольку ни один из кодов Box не делает недействительным код Sprite.
Вы не , разветвляяськод с ответом на instanceof
.Вот почему люди говорят, что instanceof плох;потому что люди делают это:
if(shape instanceof Circle) {
area = Circle(shape).circleArea();
} else if(shape instanceof Square) {
area = Square(shape).squareArea();
} else if(shape instanceof Triangle) {
area = Triangle(shape).triangleArea();
}
Это причина, почему люди избегают instanceof.Но это не то, что вы делаете.
Существует один к одному отношение между Box
и победой в игре (другие спрайты не могут выигратьигра).Таким образом, вам не нужна дополнительная «победная» абстракция спрайта (потому что коробки == победители).
Вы просто проверяете доску, чтобы убедиться, чтокаждый верхний элемент - это Коробка.Это именно то, для чего предназначен instanceof
.
Ответ всех остальных (включая мой собственный) добавляет дополнительный механизм проверки, является ли спрайт боксом.Однако они не добавляют никакой надежности.Фактически вы берете функции, которые уже предоставлены языком, и переопределяете их в своем собственном коде.
Томас Наррос утверждает, что вы должны различать в своем коде между "семантическими типами" и "типами java".Я не согласен.Вы уже установили, что у вас есть тип Java, Box
, который подклассы Sprite
.Таким образом, у вас уже есть вся необходимая информация.
На мой взгляд, наличие второго независимого механизма, который также сообщает «Я - ящик», нарушает СУХОЙ (не повторяйте себя).Это означает отсутствие двух независимых источников для одной и той же информации.Теперь вам нужно поддерживать перечисление и структуру классов.
Так называемая «выгода» - это возможность пируэта вокруг ключевого слова, которое полностью соответствует цели и является вредным при использовании более вредными способами.
Золотое правило: Используй голову .Не подчиняйся правилам как неопровержимым фактам.Спросите их, узнайте, почему они там, и согните их, когда это уместно.