Муки выбора. Нейминг геттеров и сеттеров
Недавно я задумался о правилах нейминга геттеров и сеттеров. Всегда придерживался правила с префиксом getName
, setName
, но недавно при рефакторинге MoonShine я заметил кашу в нейминге, которая имеет право на жизнь, но это не тру.
Возникла идея сформировать комплексный подход к неймингу и пользоваться исключительно им. Чтобы все контрибьюторы уже огромного фреймворка MoonShine их придерживались и "говорили на одном языке"!
В целом, наверное, местами каша в нейминге появилась из-за продолжительной дружбы с Laravel, где также присутствует разнообразие и мы наблюдаем getKey
, setRelations
в моделях, но при этом видим path(), host(), fullUrlWithQuery(array $query)
.
Ну а в чем собственно проблема? Спросите вы.
Проблема в том, что getName
, setName
не подойдет для всех ситуаций, особенно если речь о fluent interface. Просто представьте большой билдер:
TableBuilder::make()
->setFields($fields)
->setItems($items)
->setTdAttributes($attributes)
->setAsyncUrl($url)
->set...
->set...
->set...
В реальности портянка кода будет даже больше, но уже и эта бросается в глаза.
Исходя из этого примера, формируем первое правило:
1. Для fluent-методов используем сеттер без префикса set.
Ок, вроде разобрались. В глаза попался геттер для получения имени поля - $field->name()
Выглядит красиво и большой соблазн присутствует оставить как есть. Но! Это также публичный метод, плюс у него есть аргумент
name(?int $index = null)
и на вид он ничем не будет отличаться от сеттера и будет вводить в заблуждение. Я искал компромисс между красотой и здравым смыслом, и метался между правилом - для геттеров всегда использовать префикс get, а также использовать префикс get для не публичных геттеров и редко используемых. Остальные геттеры, часто используемые для красоты интерфейса, оставить без префикса, но здравый смысл победил и так появилось второе правило: 2. Геттеры всегда с префиксом get, исключения обсуждаем в процессе ревью пул реквестов
После мыслей по геттерам, снова решил взглянуть на сеттеры под новым углом и размышляю, как поступить с fluent всегда без префикса, но если метод используется очень редко, то с префиксом? Но если метод очень редкий, то возможно и fluent лишний?!
В общем пока оставляем правила 1 и 2. А что вы думаете об этом? Думаю, что это очень простая, но важная тема, о которой может высказаться разработчик любого уровня!
>>Click here to continue<<
