
Roman
19.06.2018
12:24:30

Maksim
19.06.2018
12:28:22

Artem
19.06.2018
13:20:44
Пытаюсь разобраться с валидацией
Стоит ли писать предусловия в сеттерах entity с выкидыванием эксепшенов, если до этого при попадании из контроллера в сервис данные валидируются по тем же самым правилам? Или наоборот, стоит писать только 1 раз предусловия и не дублировать их в валидации на входе в сервис?
С одной стороны вроде не рекомендуют использовать эксепшены для flow-control, а с другой программист-то может сетнуть что-то уже и после проверки в сервисе. А дублирование проверок выглядит подозрительно.

Sergey
19.06.2018
13:25:42

Google

Vitaly
19.06.2018
13:25:50

Artem
19.06.2018
13:33:05

Sergey
19.06.2018
13:35:26
или это ты придумал?

F01134H
19.06.2018
13:36:12

Artem
19.06.2018
13:36:43

Maksim
19.06.2018
13:36:54
норм бд)

Artem
19.06.2018
13:37:08

Sergey
19.06.2018
13:37:09

Vitaly
19.06.2018
13:38:12

Sergey
19.06.2018
13:38:37
не зафэйлятся

Google

Maksim
19.06.2018
13:38:50

Sergey
19.06.2018
13:38:55
но я все еще не понимаю откуда рождаются такие ограничения

Maksim
19.06.2018
13:38:59
тупым базам можно стрикт мод включить)

Sergey
19.06.2018
13:39:05

Tex
19.06.2018
13:39:19
а почему для бизнеса важно что бы длина юзернейма меньше 10-ти символов?
PO бесят выпендрежники с длинными никнеймами и он несет эту боль за собой в проект.
а вообще частенько бизнес любит включать сразу два проблемных синдрома
1) мы подглядели это где-нибудь и тоже теперь захотели вот так
а на попытку переубедить и объяснить что это никому не нужно, а "где-то там" это внедрено либо по такому же принципу, либо по техническим ограничениям очень старым и неактуальным. либо просто идиоты. и тут включается
2) я тут босс и мне виднее, не спорь

Maksim
19.06.2018
13:39:27
хотя, кто с этим запаривается - другой вопрос

Sergey
19.06.2018
13:40:17

Dmitry
19.06.2018
13:40:35
почему для бизнеса важна длина юзернейма? спроси это спам-ботов в телеграме посление месяцы ;)

Sergey
19.06.2018
13:40:58

Tex
19.06.2018
13:41:25

Sergey
19.06.2018
13:41:49
class Username(string $username) {
if (strlen($username) > 10) {
throw new InvalidArgumentException()
}
}

Dmitry
19.06.2018
13:41:58
м... почему я не могу сделать никнейм vasya.ru?

Sergey
19.06.2018
13:42:23

Vitaly
19.06.2018
13:42:23
v@sya.ru

Tex
19.06.2018
13:42:25

Dmitry
19.06.2018
13:42:43

Tex
19.06.2018
13:43:14
любая валидация кому-то навредит, потому что "блин, но я же так хочу сделать вот так, а мне нельзя", вопрос зачем это нужно и будет ли польза выше чем вред.

Sergey
19.06.2018
13:43:37
именно. Похожая тема с именем и фамилией
и когда ты араб
или прочие эдж кейсы

Google

Sergey
19.06.2018
13:43:55
или фамилии нет

Tex
19.06.2018
13:44:04

Dmitry
19.06.2018
13:44:48
должен быть баланс между "навредит одному" и "навредит всем"
ник в пол экрана чата, вестимо, будет раздражать многих...

Tex
19.06.2018
13:46:01

Dmitry
19.06.2018
13:47:07
в расслыках имя тоже вписывается в дизайн в какой-то мере
если я в 99% буду обрезать имя, то в чем профит давать его такой вводить?

Sergey
19.06.2018
13:48:31
если ошибок 3 - фэйлиться на первой или важно все 3 показать
p.s. сеттеры рак
а что до дублирования правил - есть правило трех
и оно спасает от такиз загонов

Tex
19.06.2018
13:50:16

Sergey
19.06.2018
13:50:44

Artem
19.06.2018
13:50:48

Sergey
19.06.2018
13:50:50

Tex
19.06.2018
13:51:20

Sergey
19.06.2018
13:52:42
https://en.wikipedia.org/wiki/Rule_of_three_(computer_programming)

Artem
19.06.2018
13:53:08

Sergey
19.06.2018
13:53:17
прикол в том что не все штуки которые похожи являются дублированием

Google

Sergey
19.06.2018
13:53:30
даже если ну вот совсем похожи

Artem
19.06.2018
13:53:35
да, есть такое

Sergey
19.06.2018
13:53:46
и пока их только 2 похожих - лучше оставить пока не будет очевидно что это одно и то же
склеивать проще чем разделять, а ограничения которые на тебя накладывает преждевременный DRY делает обычно хуже

Artem
19.06.2018
13:59:05

Sergey
19.06.2018
13:59:17
можешь почитать про primitive obsession
а ну и еще смотря что ты сеттерами называешь. Просто мне кажется странным что ты заморачиваешься о прекондишенах и я не уверен загоняешься ли ты еще и по инвариантам
сеттеры обычно плохи тем что на последнее им срать

Admin
ERROR: S client not available

Vitaly
19.06.2018
14:01:17
а какая альтернатива? Писать прекондишены в конструкторе?
Альтернатива - понять зачем тебе эти сеттеры. Если жизненный цикл сущности чуть больше чем просто появиться и быть записанным в базу и необходимо менять состояние в зависимости от логики, то логику изменения состояния необходимо инкапсулировать в самой сущности.

Sergey
19.06.2018
14:01:21
но у тебя под "сеттерами" походу подразумеваются просто методы которрые меняют стэйт
я сейчас уточняю потому что у людей какое-то тупое разделение видов методов на геттеры и сеттеры бывает, а не command/query
хотя последнее имеется ввиду.

Artem
19.06.2018
14:03:15

Sergey
19.06.2018
14:06:45
но стоит ли пихать туда то что непосредственно на инварианты объекта не влияет - это уже другой вопрос
как никак ограничения схемы твоей базы никакого отношения к доменной модели не имеет
иначе это будет протекание инфраструктуры в код

Artem
19.06.2018
14:07:34
@jimke тогда если сущность просто записывается в базу - можно написать в конструкторе. Но если есть какая-то бизнес-логика, то в соответствующем методе (и он будет менять состояние, но будет не просто тупо сеттером)
хотя не, фигня какая-то

Google

Maksim
19.06.2018
14:10:04
сеттеры для DTOошек и то если совсем лень думать и группировать)

Sergey
19.06.2018
14:12:17

Artem
19.06.2018
14:12:19
так, я вот тут вас слушаю и у меня возникает более фундаментальный вопрос
что вы считаете сеттером?
Как я понял это сеттер:
public function setX($x) {
$this->x = $x;
}
А это уже не сеттер:
public function setX($x) {
if ($x > 5) {
...
}
...
}
Правильно?

Sergey
19.06.2018
14:12:39
не поведение а именно доступ к стэйту

Artem
19.06.2018
14:12:54
значит до меня хоть что-то дошло :D

Sergey
19.06.2018
14:13:04
setStatus - сеттер, publish - команда, поведение

Artem
19.06.2018
14:14:00
как-то я раньше не задумывался, что в сеттере кроме установки значения ничего не должно быть, иначе он перестаёт быть сеттером
кто б мне так на работе моск вправлял

Maksim
19.06.2018
14:15:10
setUsername(string $username) : void{
$this->username = $username;
}
и
rename(string $newUsername): void {
$this->username = $newUsername;
}
разница маленькая, но существенная
от того, что в сеттере появится условие, он сеттером быть не перестанет)

Sergey
19.06.2018
14:16:52
ну тип того, важен смысл, семантик которую код несет

Artem
19.06.2018
14:16:58
ну это уже с точки зрения кларити

Sergey
19.06.2018
14:17:00
семантика set name - "запихни стэйт"
семантика rename - переименуй.
если надо поменять весь стэйт - проще новый объект ебнуть

Maksim
19.06.2018
14:17:46
withName(string $username): self {}
опять-таки, не сеттер)

Sergey
19.06.2018
14:18:17
ну ты не можешь говорить о сеттерах если у тебя нет стэйта)

Artem
19.06.2018
14:18:21

Sergey
19.06.2018
14:18:36

Maksim
19.06.2018
14:18:38
большой - это сколько?)