170 похожих чатов

Я добрался до компа, теперь нормально сформулирую свои мысли. show лучше,

чем 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.

1 ответов

13 просмотров

Человек говорит охраннику "проверь мой пропуск"? :)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта