Потому что название должно отражать суть. Когда я вижу в коде $object instanceof Foo
я хочу точнее понимать, что такое Foo
класс или интерфейс, поэтому когда $object instanceof FooInterface
нет никаких непоняток, всё четко и определенно. Это касается и эвентов, и эксепшенов, и трейтов. В том же golang принято, что просто структура называется например post
, а интерфейс к ней poster
. Правила PHP-FIG PSR конечно не обязательны, но следование им признак хорошего тона и их пишут не просто, чтобы они были, а чтобы им все старались следовать. А автор сего опуса PHP-FIG точно не читал, а всего лишь следовал своему субъективному пониманию стиля кодирования.
Я о программировании, а вы о субъективном восприятии. Я говорю, что
$value = 1;
$value =+ 2;
а вы мне говорите - это не установка, это изменение, поэтому нужно
$value = 1;
add($value, 2);
Я говорю нафига, ведь $value =+ 2 более выразительно, вы мне, ну я так воспринимаю, а вдруг кто-нибудь забудет написать $value =+ 2;
и всё упадёт.
Когда вы создаете объект, поля уже и так содержат null
и любое присвоение является изменением null
на другое значение, хоть в конструкторе, хоть где. Всё есть изменение, зачем вам оператор "="? Откажитесь, правда я не знаю как вы в changeName()
сможете поменять поле name
без этого оператора.
publish()
не отменяет использование сеттеров, он как раз и является тем методом, который собирает объект, а сеттеры в процессе этого неявно вызываются, когда вы делаете процедуру присвоения через оператор "=" внутри publish()
. У меня есть модель пользователя, загруженная из базы и есть запрос на изменение имени пользователя с новым значением, какой шанс забыть в экшене написать
$user->name = $newName;
$user->update();
Такой шанс - 0.0% Вы в курсе, что оператор "=" оператор присвоения, а операция называется присвоение/установка/применение/изменение. У полей класса всегда есть значение по-умолчанию - null
и когда вы устанавливаете новое значение вы в любом случае изменяете
то что было null
на другое новое значение. Таким образом вы сами всегда и везде должны перестать использовать оператор "=", потому что он так или иначе изменяет начальное значение чего либо. Вы сами себе противоречите и вдаетесь в дебри, где на самом деле всё просто и понятно.
А какая вам разница что отражает $user->changeName($name)
и $user->name = $name;
точнее что лучше и понятнее отражает суть установки имени пользователя? У меня есть ваш класс, я не хочу разбираться какие у вас там методы существуют для каждого поля класса, я хочу поменять только значение определенного поля, для этого я пишу $user->name = $name
, а вы мне говорите, не чувак иди лесом и никто не догадается, что для этого есть некий метод changeName()
Объект может менять и пополнять своё состояние в рантайме и не обязательно, что изменение состояния будет делать сам объект внутри себя, и это вы знаете про какой-то там метод changeName()
, любой другой после вас афигеет, от того, что не сможет написать банальное $user->name = $name
Зачем думать? Сеттер не предназначен для того, чтобы что-то публиковать, сеттер изменяет состояние объекта, сама процедура публикации - это бизнес-логика и с сеттерами никак не связана.
Ничего не понятно, видно только, что принимает два строковых параметра и ничего более, неявный вызов сеттера может замечательно скрываться внутри этого метода, только лишь потому, вы не понимаете сути сеттера. Тем более, необязательно, что пост должен сам себя публиковать, его может опубликовать какой-нибудь адаптер к фейсбуку или вконтакту, и который понятия не имеет про ваш publish().
Например, мне попался ваш код, в гитхабе, открываю его и вижу строку $post->publish()
, какая тут сигнатура и как мне понять, что делает этот метод? Когда я вижу $post->state = PUBLISHED
я понимаю, вполне чётко и определенно, что эта сточка кода делает, но когда я вижу $post->publish()
я думаю, что обычный метод, который что-то там делает, а что - да хрен его знает.
Вот и получается, что хрен поймёшь, что делает ваш метод publish()
, зато любому дураку понятно, что делает $post->state = PUBLISHED
Потому что changeName() отражает то, что вы делаете, а сеттер
Это как, т.е. $user->name = $name;
для вас не отражает ничего конкретного и надежного? Хм, а по мне ваш метод changeName()
не отражает того, что я ожидаю. Ну есть метод changeName()
он что-то там типа меняет, а что он ещё делает я ручаться не могу, может он ещё пытается залезть в базу и сохранить объект с новым именем. Ну не вызвал я ваш changeName()
для объекта, ну похерил изменения свойства name
, чем это отличается от того, что я забыл написать $user->name = $name;
и тоже похерил изменения?
Я предпочитаю то, что гибко, читаемо, красиво и самое главное - легко поддерживается, а чтобы ваш монолит понять, а уж не дай бог что-то в нём поменять, чтобы не дай бог ничего не сломалось, нужно не одно поле бамбука выкурить.