
Митко Соловец?
11.04.2017
10:04:21
короче, Андрей, учись свои мысли выражать, пожалуйста, сейчас ты совсем другое говоришь, чем до этого)
в итоге мы пришли к одному с небольшими отличиями

Valeriy
11.04.2017
10:40:27
Слушай, а почему гет - это не апи?
Дисклеймер: не надо только говорить, что я доебываюсь, это важно.
Геттеров не должно быть по принципу tell, don't ask.
Но вот, например, охранник хочет увидеть твой пропуск, ты должен показать. Кажется, что вот он гетер. Однако, вместо String getAccessCard(), лучше сделать String showAccessCard(), на худой конец просто accessCard().
Почему это важно? Такое мышление и именование помогает оставлять гетеры только там, где это действительно необходимо по смыслу.
А вообще это все эзотерика, конечно, никто от и до таких правил не придерживается, но, если стараться, то код получается меньше и читабильнее (не в смысле, как императивщики говорят, мол, вот я смотрю на портянку в 2к строк и мне все понятно, сразу все вижу, нахер ваш ооп, а в смысле того, что каждая сущность маленькая, у нее single responsibility, поэтому ей легко дать говорящее имя и при чтении легко понять, что она делает, а самое главное легко запомнить и понять архитектуру, когда все маленькое, ответственности не дублируются и у сущностей только по одной ответственности. Но, ещё раз, такого почти не бывает.
Мне нравится, например, код aeron в этом плане, рекомендую.

Кирилл
11.04.2017
11:02:31
Это как про количество уровней абстракции "пять плюс, минус два"
Или количество параметров в методе "не более трех"
Не канон, просто некоторые в религию превращают.

Valeriy
11.04.2017
11:39:42
я добрался до компа, теперь нормально сформулирую свои мысли.
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.
лонг рид в чате, я ужасен, сорян

Valeriy
11.04.2017
11:48:27
почему ты размышляешь в терминах пентестера?
person это не какой-то человек, который пытается куда-то проникнуть, это класс, который ты сам пишешь, объекты этого класса вполне валидно могут пройти, а могут не пройти проверку.