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 ответов

6 просмотров

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

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
База данных не поможет. Шифрование не поможет. Какие там ещё варианты? Накидывайте.
КТ315
20
А табстоп это сообщение от окна или от элемента управления?
The Bird of Hermes
18
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
26
Открыл свой двухкилобайтный экзешник в x32dbg, а тут какая-то хрень. Смущает кнопка "выполнить до пользовательского кода", а что ещё может быть в файле помимо него ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
11
Мне были интересны дишные хаки и я нашёл любопытный способ на форуме через __traits, что-то вроде int delegate(int) fac = (int n) => n == 0 ? 1 : n * __traits(parent, {})(n - ...
Constantin F.
1
Вопрос тем кто смотрит видео и слушает подкасты - как вы потом ищете нужную вам информацию? Вот статью я прочитал, потом могу искать нужную мне часть банальным поиском. Пропус...
Aleksandr Druzhinin
4
Всем привет, подскажите/посоветуйте пожалуйста. Фаердак компоненты, имею одно место где бизнес хочет видеть при открытии формы список всех клиентов, это порядка 30к. Мои дово...
Sasha Sch
14
Ребят, если кто в курсе - скажите, а в загранке такое же засилье маркетплейсов? или там простые сермяжные интернет-магазины живут попроще?
Андрей [aharito] Харитонов
14
Коллеги, доброе утро. Запустил на удаленном хосте приложение (ручками зашел туда по ssh и запустил, не командой удаленно). Создал потом ssh-туннель, и с моей машины приложение...
Δημήτηρ
9
Карта сайта