denlinkers

Зарегистрирован с 26.09.2019
Комментарии
26 сентября 2019

Потому что название должно отражать суть. Когда я вижу в коде $object instanceof Foo я хочу точнее понимать, что такое Foo класс или интерфейс, поэтому когда $object instanceof FooInterface нет никаких непоняток, всё четко и определенно. Это касается и эвентов, и эксепшенов, и трейтов. В том же golang принято, что просто структура называется например post, а интерфейс к ней poster. Правила PHP-FIG PSR конечно не обязательны, но следование им признак хорошего тона и их пишут не просто, чтобы они были, а чтобы им все старались следовать. А автор сего опуса PHP-FIG точно не читал, а всего лишь следовал своему субъективному пониманию стиля кодирования.

Ответить
26 сентября 2019

Я о программировании, а вы о субъективном восприятии. Я говорю, что

$value = 1;
$value =+ 2;

а вы мне говорите - это не установка, это изменение, поэтому нужно

$value = 1;
add($value, 2);

Я говорю нафига, ведь $value =+ 2 более выразительно, вы мне, ну я так воспринимаю, а вдруг кто-нибудь забудет написать $value =+ 2; и всё упадёт.

Ответить
26 сентября 2019

Когда вы создаете объект, поля уже и так содержат null и любое присвоение является изменением null на другое значение, хоть в конструкторе, хоть где. Всё есть изменение, зачем вам оператор "="? Откажитесь, правда я не знаю как вы в changeName() сможете поменять поле name без этого оператора.

Ответить
26 сентября 2019

publish() не отменяет использование сеттеров, он как раз и является тем методом, который собирает объект, а сеттеры в процессе этого неявно вызываются, когда вы делаете процедуру присвоения через оператор "=" внутри publish(). У меня есть модель пользователя, загруженная из базы и есть запрос на изменение имени пользователя с новым значением, какой шанс забыть в экшене написать

$user->name = $newName;
$user->update();

Такой шанс - 0.0% Вы в курсе, что оператор "=" оператор присвоения, а операция называется присвоение/установка/применение/изменение. У полей класса всегда есть значение по-умолчанию - null и когда вы устанавливаете новое значение вы в любом случае изменяете то что было null на другое новое значение. Таким образом вы сами всегда и везде должны перестать использовать оператор "=", потому что он так или иначе изменяет начальное значение чего либо. Вы сами себе противоречите и вдаетесь в дебри, где на самом деле всё просто и понятно.

Ответить
26 сентября 2019

А какая вам разница что отражает $user->changeName($name) и $user->name = $name; точнее что лучше и понятнее отражает суть установки имени пользователя? У меня есть ваш класс, я не хочу разбираться какие у вас там методы существуют для каждого поля класса, я хочу поменять только значение определенного поля, для этого я пишу $user->name = $name, а вы мне говорите, не чувак иди лесом и никто не догадается, что для этого есть некий метод changeName()

Объект может менять и пополнять своё состояние в рантайме и не обязательно, что изменение состояния будет делать сам объект внутри себя, и это вы знаете про какой-то там метод changeName(), любой другой после вас афигеет, от того, что не сможет написать банальное $user->name = $name

Ответить
26 сентября 2019

Зачем думать? Сеттер не предназначен для того, чтобы что-то публиковать, сеттер изменяет состояние объекта, сама процедура публикации - это бизнес-логика и с сеттерами никак не связана.

Ответить
26 сентября 2019

Ничего не понятно, видно только, что принимает два строковых параметра и ничего более, неявный вызов сеттера может замечательно скрываться внутри этого метода, только лишь потому, вы не понимаете сути сеттера. Тем более, необязательно, что пост должен сам себя публиковать, его может опубликовать какой-нибудь адаптер к фейсбуку или вконтакту, и который понятия не имеет про ваш publish().

Ответить
26 сентября 2019

Например, мне попался ваш код, в гитхабе, открываю его и вижу строку $post->publish(), какая тут сигнатура и как мне понять, что делает этот метод? Когда я вижу $post->state = PUBLISHED я понимаю, вполне чётко и определенно, что эта сточка кода делает, но когда я вижу $post->publish() я думаю, что обычный метод, который что-то там делает, а что - да хрен его знает.

Ответить
26 сентября 2019

Потому что changeName() отражает то, что вы делаете, а сеттер Это как, т.е. $user->name = $name; для вас не отражает ничего конкретного и надежного? Хм, а по мне ваш метод changeName() не отражает того, что я ожидаю. Ну есть метод changeName() он что-то там типа меняет, а что он ещё делает я ручаться не могу, может он ещё пытается залезть в базу и сохранить объект с новым именем. Ну не вызвал я ваш changeName() для объекта, ну похерил изменения свойства name, чем это отличается от того, что я забыл написать $user->name = $name; и тоже похерил изменения?

Я предпочитаю то, что гибко, читаемо, красиво и самое главное - легко поддерживается, а чтобы ваш монолит понять, а уж не дай бог что-то в нём поменять, чтобы не дай бог ничего не сломалось, нужно не одно поле бамбука выкурить.

Ответить