чем get, если принять принцип tell, don't ask.
Говоря родным языком, если сущность А хочет что-то от сущности B, то она A должна сказать "B, сделай", а не "B, дай, я сама сделаю".
Возвращаясь к примеру с охранником.
Пусть есть Person и Guard и нужно проверить пропуск и, если он валиден, пройти.
Императив (ask, programmer tells how):
Card card = person.getCard();
if (guard.validate(card)) {
person.pass();
} else {
person.turnBack();
}
ООП (tell, programmer tells what):
person.tryPass(guard);
boolean tryPass(guard) {
if (guard.validate(this.card)) {
this.pass();
} else {
this.turnBack();
}
}
То есть весь смысл в том, что ты говоришь:
человеку -- попытайся пройти
человек охраннику -- проверь мой пропуск
человек сам себе -- идти вперед или назад
Поэтому, если есть геттеры явные, то это уже не ООП.
Но вот такие выверты приводят к inverion of control, когда вместо того, чтобы вызвать метод у объекта, ты передаешь этот объект внутрь метода другого объекта, который этот метод уже вызывает. Это все круто, красиво, декларативно, конечно, но уследить даже за таким простым примером сложно (имхо). ООП ради ООП -- это совершенно глупая идея, карго культ какой-то. У всего есть недостатки, так давайте от них отказываться.
В этом примере я бы не стал так наворачивать, пусть будет императивно, но зато не запутано. В другом месте я буду придерживаться принципов ООП, потому что там они помогают.
Если так хочется декларативности, то можно передать просто функцию-валидатор, так код внутри Person не завяжется на Guard, и вызов валидатора будет явно виден, без захода в Person:
person.tryPass(card -> guard.validate(card));
На вопрос чем show лучше get ответ простой: гетеров должно быть мало, если все называть get, то привыкнешь и перестанешь обращать внимание, допустишь много гетеров, свалишься в императив, это первое. Второе это то, что get очень абстрактно, а для каждой конкретной ситуации можно подобрать более правильное слово.
Ты же не называешь у билдера метод build -- getBuiltObject()? Потому что лучше в контексте подходит build.
Человек говорит охраннику "проверь мой пропуск"? :)
Обсуждают сегодня