roistat/php-code-conventions

Не объяснено почему вместо `getDate()` следует писать `date()`

sanmai opened this issue · 10 comments

Какие-то правила содержат объяснения вида почему так нужно делать, и почему делать иначе - плохо. Другие правила таких объяснений не содержат, это неправильно и отдаёт вкусовщиной. Серьёзный документ никак не может содержать вкусовщину и прочее подобное.

Пример:

Например, вместо getDate() следует писать date(). Геттер — метод, работающий только с полями своего объекта.

Почему это так нужно - не объясняется. При этом почему нужно делать не так может быть объяснено: если все геттеры начинаются с get, то не нужно гадать когда нужно что-то получить с объекта, набираете get и IDE показывает список всех геттеров, которые вам доступны.

Все правила должны быть обоснованы логически. Если для правила нет обоснования, то уважающий себя менеджер не может настаивать на том, чтобы этому правилу следовали его образованные и опытные коллеги, так как это будет неуважение к ним. Неуважение к коллегам ведёт к неуважению к менеджеру, а это провал всей работы менеджера.

Хороший вопрос.

  1. У объектов с данными не может быть практически ничего кроме геттеров, потому слово get там просто лишнее. Вместо $user->get... мы пишем $user-> и видим всё тот же список.
  2. Код должен максимально правильно читаться по-английски. $date = $user->date(); — читаем как Дата равна пользовательской дате. А $date = $user->getDate(); читаем как Дата равна дай дату пользователя. В общем, неправильно читается.
  3. Геттер — это по сути обертка над полем. То есть $user->date() равносильно $user->date.

Можно еще продолжить.
В общем, есть множество аргументов за то, что get у геттеров лишний. И нет ни одного за то, что он не лишний (на аргумент с автокомплитом ответил выше).

Не очень понятно почему эта проблема помечена как закрытая. Объяснения в инструкция так и не появилось.

Да, сорри, пока отвечал забыл, что речь шла о том, что оно не объяснено в документе. Надо будет моё пояснение как-то оформить и добавить.

Хорошо что вы сказали про английский язык. Как быть если свойство может быть и глаголом, и существительным? Например, представим себе такой код:

$driver->permit();

Если читать это строку по-английски, что можно понять что здесь вернётся значение чего-то, или вы даёте разрешение водителю на что-то?

Например, если в этой же ситуации другой метод не вызывает никаких разночтения и замечательно читается по-английски:

$driver->getPermit();

Вы наверное удивитесь если узнаете что именно из-за таких особенностей английского языка в большинстве проектов используются геттеры с приставкой get.

Интересный вопрос.

Если permit берем как глагол «разрешить», то после него должно идти существительное «что именно разрешить». То есть, если у нас есть код $permit = $driver->permit();, то это не может быть ничем, кроме геттера. А если у нас код $driver->permitAccess();, то это не может быть ничем другим, кроме как сеттером внутреннего состояния. Опять же: геттер не может быть вызван без сохранения результата в переменную (тогда это будет лишний ничего не делающий код). А сеттер наоборот не должен возвращать результат.

В общем, да, я удивлюсь, что именно из-за таких особенностей в большинстве проектах используется get. Буду рад какой-то статистике по большинству проектов.

Вот еще про функции вообще:

Functions/Methods are also supposed to be Verbs because they are performing some action.

Вот про необходимость get/set чтобы код читался как английский язык.

Про множество множество мнений что геттеры и сеттеры вообще не от добра, не будем забывать.

Честно говоря, для человека, который по большей части читает и пишет только на английском, довольно странно видеть что требование префиксов get/set может быть непонятно.

если у нас есть код $permit = $driver->permit();, то это не может быть ничем, кроме геттера

Если вы в голове переводите с английского на русский подстановкой по словарю, то да, ничем кроме геттера это быть не может. Если вы читаете сразу по английски, то все сразу становится много менее однозначно.

Походил по ссылкам. Про геттеры и сеттеры в целом — это наверное не в эту ветвь дискуссии. Здесь мы обсуждаем только потребность слова get в названии геттера и не более того.

Про комментарий человека о car.FuelLevel() — в общем, там ничего однозначного нет. Есть мнение человека, которое он ничем не обосновал, кроме как тем, что если к car.FuelLevel добавить скобки, то он начинает читать это по-другому. Но это его способ чтения кода. Я скобки вижу только в конце и не начинаю чтение с них. И я такой не один. То есть это просто вкусовщина.

Если вы в голове переводите с английского на русский подстановкой по словарю, то да, ничем кроме геттера это быть не может. Если вы читаете сразу по английски, то все сразу становится много менее однозначно.

В коде $permit = $driver->permit(); блок $driver->permit() я читаю как $driver->permit или как $driverPermit

В коде ... я читаю...

Слова выше - это вкусовщина. Из серии "мне таким цветом больше нравится". Такие аргументы можно использовать в комментариях, но в сам текст, конечно же, добавлять их не стоит.

Нужные какие-то другие, более веские, аргументы почему геттеры лучше писать без get в начале.

Я чувствую что мы не находим с вами общего языка, топчемся на пустом месте и переливаем из пустого в порожнее. Потому, простите, пожалуйста, но я не вижу другого пути кроме как избавить вас от своего участия.