В документе описываются соглашения именования, используемые в нашей команде. Данные соглашения составлены для облегчения поддержки проекта и касаются любого предмета логики, например: роутинг, директория, интерфейс, класс, трейт, функция, переменная, константа и т.п..
И прежде чем продолжить, предлагаю ознакомиться с полезными статьями:
В основу соглашения о префиксах положена конвенция сообщества symfony
XXX это имя соответствующего предмета (обычно), иногда дополненное описанием обстоятельств происходящих с ним действий. Любой метод должен возвращать булевое значение true или в случае проблем выбрасывать эксепшен, за исключением методов, в которых описано что именно должен возвращать метод (см. столбец Описание).
| Именование | Описание |
| findXXX | Используется, когда нужно найти данные по определенным параметрам (применяется вместо filterXXX). Если данные не найдены, то в случае поиска одного предмета обязан возвратить значение значение null, в случае поиска нескольких предметов обязан возвратить пустой массив или пустую коллекцию. |
| getXXX | Используется для получения данных, обязан возвратить искомый тип данных или выбросить эксепшен. Так же применяется когда нужно обработать данные, например трансформировать одни данные в другие. |
| upsertXXX | Используется для создания или изменения данных (альтернатива syncXXX) |
| updateXXX | Используется для изменения данных |
| replaceXXX | Используется для перемещения данных из одного места в другое |
| removeXXX | Используется для удаления данных (применяется вместо deleteXXX) |
| restoreXXX | Используется для восстановления данных (применяется вместо recoverXXX) |
| createXXX | Используется для создания чего-либо в памяти (например объект с помощью фабрики) |
| addXXX | Используется для добавления данных (например добавить файл в директорию или добавить строку в таблицу б.д.). Применяется вместо attachXXX, linkXXX, registerXXX, saveXXX и т.п. |
| copyXXX | Используется для копирования данных (например при копировании заказа будет скопировано все без исключения, что касается этого заказа, кроме номера заказа) |
| fillXXX | Используется, когда нужно заполнить/обогатить передаваемые в метод данные (применяется вместо enrichXXX), возвращает тот же тип данных, который был передан в метод |
| countXXX | Используется, когда нужно выполнить расчет данных (например countRegisteredUsers), возвращает числовое значение |
| checkXXX | Используется, для проверки наличия данных (например checkUserHasMoney) |
| validateXXX | Используется, для валидации данных (например validatePassportNumber) |
| sendXXX | Используется, для отправки данных в сторонний сервис (например sendMessage) |
| execute | Используется, когда имя класса описывает выполняемую логику, при условии в классе одного публичного метода |
Допускается использовать сочетание наименований, например:
Иногда может показаться, что нужного префикса нет, и тогда разработчик изобретает новые префиксы, которые не раскрывают сути или которые можно заменить одним из выше перечисленных методов, например:
| Неправильное именование | Описание |
| processXXX | абстрактное действие |
| generateXXX | вероятнее всего можно заменить на addXXX |
Как видите, чаще всего в изобретении нового префикса нет нужды, но это не значит, что разработчик не имеет права предложить свой вариант, который стоит добавить в таблицу правильных префиксов.
XXX это имя соответствующего предмета.
| Неявная связь | Явная связь |
| add | addXXX |
| get | getXXX |
| set | setXXX |
| has | hasXXX |
| all | getXXXs |
| replace | setXXXs |
| remove | removeXXX |
| clear | clearXXX |
| isEmpty | isEmptyXXX |
| register | registerXXX |
| count | countXXX |
| send | sendXXX |
| keys | не доступно |
Неявная связь - используется, когда объект реализует один из паттернов проектирования, а как известно паттерны это абстракции, а какие у абстракций могут быть явные связи - никаких (например: Registry, Pool, Service Locator и т.п.), более конкретный пример:
function add($name)
function get($name)
function remove($name)
function replace(array(['name' => $name, 'name2' => $name2, ...]))Как видим, имя предмета, с которым имеется связь, передается в параметре $name.
Явная связь - используется, когда объект имеет явную связь с другим объектом, например:
function addUser()
function getUser()
function removeUser()
function setNames(array(['name' => $name, 'name2' => $name2, ...]))Первым делом предлагаю освежить знания о частях речи.
имя прилагательное - отвечает на вопросы: какой, какая, какое, какие, чей
имя существительное - отвечает на вопросы:
В свою очередь имя существительное может быть двух видов:

Мы часто встречаем именование основанное на правиле - сначала главное, потом второстепенное, данное правило очень удобно (его часто используют при именовании таблиц в базе данных, когда второстепенная таблица расширяет основную). Но данное правило не панацея от всех бед, и в силу простоты данное правило в коде часто затрудняет чтение (особенно сложной бизнес-логики или предмета логики), поэтому в дополнение к данному правилу, мы применяем подход основанный на трех правилах (в порядке приоритета):
1. если нет необходимости подразумевать апостроф в именах существительных мы так и делаем, примеры:
| Описание | Именование |
| основная услуга | main_service |
| дополнительная услуги | additional_service |
| технологический комплекс | technological_complex |
2. если получается подразумевать апостроф в именах существительных мы так и делаем, примеры:
| Описание | Именование |
| id услуги | service_id |
| имя услуги | service_name |
| имена услуги | service_names |
| имена услуг | services_names |
К сожалению часто используемый в литературе привычный подход (подразумевая апостроф) при сложном именовании (имя содержащее существительные в множественном числе или состоящее из двух существительных) не дает возможности правильно передать суть и в этом случае мы переходим к пункту 3.
3. если правило 1 или 2 ошибочно передает описание предмета логики, то используем предлог of, примеры:
| Описание | Подразумевая `s | Именование |
| услуга группы | group_service | service_of_group |
| группы услуги | groups_service | groups_of_service |
| группа услуги | service_group | group_of_service |
| группа услуг | services_group | group_of_services |
| группы услуги | service_groups | groups_of_service |
| группы услуг | services_groups | groups_of_services |
| группа услуг из 1с | services_group_1с | group_of_services_from_1c |
Как видим подход использования предлога of немного не привычен, но сильно помогает правильно передать мысль. Например, при длинном именовании, отказ от предлога of, может сильно осложнить понимание кода при чтении и обычно влечет за собой написание поясняющего комментария или попытку понять по кодовой базе смысл, который автор пытался передать, вот более сложный пример из реальной жизни:
| Описание: | Дополнительная услуга основной услуги технологического комплекса |
| Именование: | AdditionalServiceOfMainServiceOfTechnologicalComplex |
Вполне вероятно, что в проекте могут встречаться исключения из правил, обычно это связано с наследием, иногда с человеческим фактором, но важно понимать, что данные исключения не являются оправданием появления новых исключений.
Комментарии