1
0
mirror of https://github.com/1C-Company/v8-code-style.git synced 2025-01-06 00:33:23 +02:00
v8-code-style/Check_Convention.md
2021-05-21 14:19:41 +03:00

224 lines
15 KiB
Markdown

# Check convention - Соглашения проверок
## Регистрация проверки
### Категория проверки
Проект 1С:Стандарты разработки V8 поставляет категории в разрезе типов объектов в метаданных.
Следует указывать категорию для каждой проверки из соответствующего бандла, где размещен класс проверки.
### Код проверки
1. cebab-case (кебаб-кейс) - с маленькой буквы, без пробелов, использовать тире между словами. Не следует использовать `CamelCase` т.к. он менее читабельный.
2. Префикс типа объекта (md, form, right, ql, dcs и т.д) - код должен содеражть префикс типа объекта или имя уникального класса объекта (`common-module`, `catalog`, `role` и т.д.) что бы не допустить неоднозначности толкования к чему применяется проверка
3. Префикс вендора (`v8codestyle`) в коде проверки не используется
4. Константа с кодом проверки должна быть приватной
#### Код проверки должен отражать смысл проверяемой проблемы.
Следует отражать в коде проверки находимую проблему или группу проблем (если проверка выполняет множество однотипных проверок).
Код проверки не должен состоять лишь из имен найденных объектов.
НЕПРАВИЛЬНО:
Здесь ключ проверки отражает только имена объектов которые проверяет:
```
module-method-check
function-type-check
```
Не следует в коде проверки отражать процесс поиска проблемной ситуации.
НЕПРАВИЛЬНО:
```
check-method-usage
```
ПРАВИЛЬНО:
```
method-never-used
```
#### Код проверки должен корректно читаться вместе с аннотацией
Это чуть более актуально для проверок по модулю - т.к. это будет везде визуально читаться.
Для других типов проверок (по метаданным) аналогичное правило подходит, хоть и не будет постоянно отображаться везде в интерфейсе (при открытии доп.формы).
НЕПРАВИЛЬНО:
```bsl
//@skip-check check-method-never-used
```
ПРАВИЛЬНО
```bsl
//@skip-check method-never-used
```
#### Слова-паразиты
Следует избегать использования "слов-паразитов", которые не добавляют никакого смысла в код проверки, например слова: check, error, warning, артикли a, the, to, is, are и т.д. problem, valid
НЕПРАВИЛЬНО
```
check-method-is-empty
to-find-my-awesome-problem
```
ПРАВИЛЬНО:
```
method-empty
awesome-problem
```
#### Разделение по типам объектов метаданных
Из кода проверки желательно сразу понимать к какому типу объектов она имеет отношение. Обычно это следует от типа ТОП-объектов (md, form, module/bsl, dcs, ql, moxel). Если проверка диагностирует проблему в подчиненном объекте имя которого уникально - можно не указывать префикс топ-объекта.
НЕПРАВИЛЬНО:
```
attribute-type-empty
parameter-name-too-short
```
ПРАВИЛЬНО:
```
form-attribute-type-empty
md-attribute-type-empty
method-parameter-name-too-short
form-parameter-name-too-short
module-standard-regions
function-has-no-return-type
```
### Наименование проверки
- Что проверяем, какую ошибку находит
- Существительное, в именительном падеже
- Наименование должно быть локализовано через NLS класс
### Детальное описание
1. Следует указывать описание при регистрации проверки в классе.
2. Детальное описание должно быть локализовано через NLS класс
2. Формируется описание в виде `check.descriptions/check-id.md` и `check.descriptions/ru/check-id.md` с детальным описанием
3. Ссылку на стандарт, по которому выполняется проверка, следует указывать в секции `## См.` (или `## See`) в файлах описаний `check-id.md`
4. Следует описывать все возможные варианты `НЕПРАВИЛЬНО` и `ПРАВИЛЬНО` которые находит проверка. Желательно использовать примеры из тестов.
### Тип (issueType)
Тип найденной проблемы/диагностики
- `ERROR` - Ошибка в приложении
- `WARNING` - Предупреждение о проблеме в приложении
- `SECURITY` - Уязвимость в приложении
- `PERFORMANCE` - Проблема производительности приложения
- `PORTABILITY` - Проблема универсальности метаданных и кода приложения.
- `LIBRARY_DEVELOPMENT_AND_USAGE` - Проблема внедрения библиотеки или нарушение принципов библиотечной разработки.
- `CODE_STYLE` - Соглашения при написании кода, некачественный код
- `UI_STYLE` - Проблема проектирования UI
- `SPELLING` - Опечатка в тексте, коде, в именах метаданных
### Критичность (severity)
Необходимо установить критичность найденной ошибки по умолчанию.
Критичность необходимо устанавливать адекватную проблеме уровню проблемы в приложении.
- `BLOCKER` - ошибку необходимо исправлять немедленно
- `CRITICAL` - Критичная проблема, необходимо исправлять в первую очередь
- `MAJOR` - Обычная проблема, исправлять следут в обычном порядке
- `MINOR` - Незначительная проблема
- `TRIVIAL` - Тривиальная проблема
### Сложность (complexity)
- `NORMAL` - Сложность алгоритма поиска ошибочной ситуации низкая, не выполянется обращение к объектам из других ресурсов.
- `COMPLEX` - Большое количество вычислений, обращение к объектам из других ресурсов
### Параметры
Принципы создания параметров:
- Возможность внести исключения в правило поиска проблемных мест
- Нет смысла в параметрах если проверяется единственный объект и какое-либо исключение равно отключению проверки
- Используйте паттерны в параметрах для поиска исключений
- Любые константные значения (текстовые, числовые, с большой вариабельностью, Булево), которое имеют отношение к логике проверки, следует задавать через параметры
Типовые примеры:
- Исключение по имени метаданного
- Длина, количество символов и т.д. - числовые значения в проверке обычно являются кандидатами для вынесения в параметры
Соглашения при создании параметров:
1. имена параметров должны быть понятны в контексте проверки
2. имена параметров пишутся в `camelCase`, начиная с маленькой буквы, без пробелов, второе слово и далее с заглавной буквы
3. Константа с именем параметра должна быть публичной
4. Заголовок параметра должен быть локализован через NLS класс
### Компоненты, расширяющие функциональность
- Проверки, проверяющие 1 объект на наличие ошибок, в общем случае следует наследовать от `com._1c.g5.v8.dt.check.components.BasicCheck` или аналогичных для специфичных областей `com.e1c.g5.v8.dt.bsl.check.DocumentationCommentBasicDelegateCheck`, `com.e1c.g5.v8.dt.ql.check.QlBasicDelegateCheck`
- При наличии нескольих повторяющихся фрагментов кода c параметризацией и фильтрацией объектов - желательно создавать компонент `com._1c.g5.v8.dt.check.components.IBasicCheckExtension` для переиспользования.
- При необходимости использовать существующие компоненты `com._1c.g5.v8.dt.check.components.ModuleTopObjectNameFilterExtension`, `com._1c.g5.v8.dt.check.components.TopObjectFilterExtension`
## Логика проверки / код проверки
- В общем случае, при регистрации проверки, следует выбирать тот объект, в котором будет найдена ошибка, от этого объекта следует вычислять/находить другие зависимые, влияющие объекты.
- Код поиска ошибочной ситуации следует строить максимально оптимальным способом.
- Не следует ухудшать читаемость кода, за исключением производительности.
### Текст ошибки
Текс ошибки должен отвечать на вопрос:
1. Какой объект содержит ошибку? В одной строке может быть несколько очень разных объектов. Объект желательно писать в именительном падеже.
2. В чем именно ошибка, что в коде не правильно?
3. При этом, указание наименования объекта - не обзятельно, но желательно - если оно не портит фразу.
4. Указание значений параметров в сообщении, если от значений зависит наличие ошибки.
5. Сообщение должно быть локализовано через NLS класс.
Примеры:
1. Переменная не была инициализирована
2. Конфигурация содержит некоректный режим блокировки данных
3. Метод пустой
4. Метод не используется
5. Длина имени объекта метаданного должна быть меньше чем `80`
### Как проверять
1. Одна проверка должна находить одно проблемное место в одном типе объектов
2. Учитывать параметры, а не хардкод конкретных значений
3. Учитывать исключения, место проверки исключения следует выбирать из оптимальности алгоритма
При регистрации проверки следует указывать все фичи, от которых зависит логика проверки - это означает, что при изменении любого из второстепенных свойств объекта будет выполнена перевалидация по текущей проверке.
## Тестирование проверок
1. Для каждого варианта ошибочного состояния необходим тест. Если тестовые ситуации слишком разные, желательно написать различные тесты
2. Для корректного состояния необходимо добавить тест, в котором проверка не должна находить проблему.
Каждый корректный и ошибочный вариант должны быть добавлены в разделы "ПРАВИЛЬНО" и "НЕПРАВИЛЬНО" описания проверки
## Проверка не по стандарту
Если какая-либо проверка напрямую не описана в одном из стандартов, но при этом является полезной - такую проверку можно размещать в этом проекте.
Проверку следует регистрировать по умолчанию выключенной - таким образом каждый проект 1С:Предприятия может сам решить какие дополнительные проверки активировать.
Регистрация проверки не по стандарту, включенной по умолчанию, следует явно описывать в задаче (issue) в проекте, если контрибьютор считает, что ее необходимо активировать всегда.