язык: заведён блок ПРИМЕРЫ
- пятая, необязательная часть правила: код парой «плохо → хорошо» после обоснования; метка добавлена в словарь (EXAMPLES) и в строку о версии языка во всех тринадцати файлах - сказано, чем примеры не являются: требований в блоке нет, дословным сниппетом он не служит, при расхождении с нормой правят пример - READING.md обновлён по META-30, в машинные проверки добавлен порядок блоков, в читательские — что примеры норму не расширяют
This commit is contained in:
+76
-17
@@ -118,12 +118,12 @@ version: 1
|
||||
```
|
||||
|
||||
Четыре обязательные части: **идентификатор**, **заголовок**, **модальность
|
||||
с нормой**, **обоснование под меткой ПОЧЕМУ**. Норма — одна фраза; если в неё
|
||||
не влезает, это два правила. Требование единичности взято из ISO/IEC/IEEE
|
||||
29148: составная норма не проверяема целиком, и нарушение одной её половины
|
||||
нечем адресовать.
|
||||
с нормой**, **обоснование под меткой ПОЧЕМУ**. Пятый блок, ПРИМЕРЫ,
|
||||
необязателен — о нём ниже. Норма — одна фраза; если в неё не влезает, это два
|
||||
правила. Требование единичности взято из ISO/IEC/IEEE 29148: составная норма
|
||||
не проверяема целиком, и нарушение одной её половины нечем адресовать.
|
||||
|
||||
Обе метки правила — модальное слово и ПОЧЕМУ — пишутся заглавными и
|
||||
Метки правила — модальное слово, ПОЧЕМУ, ПРИМЕРЫ — пишутся заглавными и
|
||||
принадлежат словарю набора: скелет правила читается одинаково в любом языке,
|
||||
на который канон переведён.
|
||||
|
||||
@@ -149,9 +149,10 @@ version: 1
|
||||
|
||||
Отсюда три следствия:
|
||||
|
||||
- **Хвост после ПОЧЕМУ — обоснование**, а не безымянная часть правила и не
|
||||
проза вокруг. Требований в нём не живёт: то, что подлежит исполнению, стоит
|
||||
в блоке нормы, где у него есть модальность и адрес. Требование, оставленное
|
||||
- **Хвост после ПОЧЕМУ — обоснование** до следующей метки или до конца
|
||||
области, а не безымянная часть правила и не проза вокруг. Требований в нём
|
||||
не живёт: то, что подлежит исполнению, стоит в блоке нормы, где у него есть
|
||||
модальность и адрес. Требование, оставленное
|
||||
в хвосте, требованием не является — сослаться на него нельзя и отступление
|
||||
от него записать нельзя.
|
||||
- **Таблица и список после модальной метки — часть нормы.** Правило,
|
||||
@@ -166,6 +167,58 @@ version: 1
|
||||
упоминания отличает положение: метка стоит первой в своём абзаце, полужирным
|
||||
и с точкой.
|
||||
|
||||
## Примеры к правилу
|
||||
|
||||
Пятый блок правила — необязательный, под меткой ПРИМЕРЫ. В нём код,
|
||||
показывающий норму в деле, обычно парой «плохо → хорошо». Стоит он после
|
||||
обоснования: сначала требование, потом причина, потом иллюстрация.
|
||||
|
||||
````markdown
|
||||
### XKEY-5. Внешний идентификатор разбирается до обращения к базе
|
||||
|
||||
**ДОЛЖЕН.** Значение, пришедшее снаружи, проходит разбор и нормализацию
|
||||
раньше, чем по нему делается запрос.
|
||||
|
||||
**ПОЧЕМУ.** Синтаксически невалидное значение не может соответствовать
|
||||
записи, поэтому поход в базу за ним — заведомо холостой.
|
||||
|
||||
**ПРИМЕРЫ.**
|
||||
|
||||
Плохо — строка уходит в запрос как пришла:
|
||||
|
||||
```go
|
||||
row := db.QueryRow("select … where id = ?", r.PathValue("id"))
|
||||
```
|
||||
|
||||
Хорошо — разбор на границе, запроса при неудаче нет:
|
||||
|
||||
```go
|
||||
id, err := ident.Parse(r.PathValue("id"))
|
||||
if err != nil {
|
||||
return notFound(w)
|
||||
}
|
||||
row := db.QueryRow("select … where id = ?", id)
|
||||
```
|
||||
````
|
||||
|
||||
**Пример иллюстрирует норму, а не задаёт её.** Три следствия, ради которых
|
||||
это сказано:
|
||||
|
||||
- **требований в блоке нет.** Всё, что подлежит исполнению, стоит в блоке
|
||||
нормы; деталь примера — имя переменной, конкретная функция, форма ответа —
|
||||
требованием не становится. Разошёлся пример с нормой — действует норма, а
|
||||
пример правят;
|
||||
- **это не готовый сниппет.** Код в примере сокращён до того, что показывает
|
||||
правило: обработка ошибок, контекст, импорты в нём условны, и копировать его
|
||||
дословно не нужно;
|
||||
- **пример стареет быстрее нормы.** Он привязан к сегодняшнему API, поэтому
|
||||
расхождение примера с текущим кодом — повод поправить пример, а не отменять
|
||||
правило.
|
||||
|
||||
Блок необязателен: он окупается там, где норму словами описать дороже, чем
|
||||
показать, — форма вызова, структура записи в логе, раскладка файла. У правила
|
||||
про выбор границы или про уровень лога иллюстрировать нечего.
|
||||
|
||||
## Обоснование обязательно
|
||||
|
||||
Правило без блока ПОЧЕМУ не принимается. Это требование к форме, а не
|
||||
@@ -267,14 +320,16 @@ Directives, Part 2, по одной форме записи на ступень,
|
||||
| рекомендация против | НЕ СЛЕДУЕТ | SHOULD NOT |
|
||||
| разрешение | ДОПУСКАЕТСЯ | MAY |
|
||||
|
||||
**Метки.** Обязательности не задают, а размечают: ПОЧЕМУ — часть правила,
|
||||
МЕХАНИЗИРОВАНО — запись о проверке в копии, СНЯТО — заглушку на месте
|
||||
убранного правила. Стандартом не даются ни в одном языке: в BCP 14 таких
|
||||
понятий нет, слова подбираются под язык так же, как остальные.
|
||||
**Метки.** Обязательности не задают, а размечают: ПОЧЕМУ — обоснование,
|
||||
ПРИМЕРЫ — иллюстрации к норме, МЕХАНИЗИРОВАНО — запись о проверке в копии,
|
||||
СНЯТО — заглушку на месте убранного правила. Стандартом не даются ни в одном
|
||||
языке: в BCP 14 таких понятий нет, слова подбираются под язык так же, как
|
||||
остальные.
|
||||
|
||||
| Метка | Русский | Английский |
|
||||
|---|---|---|
|
||||
| обоснование | ПОЧЕМУ | WHY |
|
||||
| иллюстрации | ПРИМЕРЫ | EXAMPLES |
|
||||
| способ проверки | МЕХАНИЗИРОВАНО | MECHANIZED |
|
||||
| снятое правило | СНЯТО | RETIRED |
|
||||
|
||||
@@ -303,15 +358,15 @@ Directives, Part 2, по одной форме записи на ступень,
|
||||
Каждая конвенция называет язык одной строкой во вводной прозе:
|
||||
|
||||
> Ключевые слова ДОЛЖЕН, НЕ ДОЛЖЕН, СЛЕДУЕТ, НЕ СЛЕДУЕТ, ДОПУСКАЕТСЯ и метки
|
||||
> ПОЧЕМУ, МЕХАНИЗИРОВАНО и СНЯТО толкуются как описано в языке конвенций
|
||||
> версии 1 — тогда и только тогда, когда написаны заглавными.
|
||||
> ПОЧЕМУ, ПРИМЕРЫ, МЕХАНИЗИРОВАНО и СНЯТО толкуются как описано в языке
|
||||
> конвенций версии 1 — тогда и только тогда, когда написаны заглавными.
|
||||
|
||||
Слова в строке — из словаря того языка, на котором написан набор. Для
|
||||
англоязычного набора та же строка выглядит так:
|
||||
|
||||
> The key words MUST, MUST NOT, SHOULD, SHOULD NOT, MAY and the marks WHY,
|
||||
> MECHANIZED and RETIRED are to be interpreted as described in the conventions
|
||||
> language, version 1, and only when written in capitals.
|
||||
> EXAMPLES, MECHANIZED and RETIRED are to be interpreted as described in the
|
||||
> conventions language, version 1, and only when written in capitals.
|
||||
|
||||
Форма скопирована у BCP 14, где та же задача решается тем же способом:
|
||||
спецификация не прикладывает к себе словарь и не указывает путь к нему, а
|
||||
@@ -530,6 +585,8 @@ XMIG-6 не соблюдается в легаси-таблицах `show_histor
|
||||
- у каждого `### <ПРЕФИКС>-<n>` есть либо модальное слово с нормой и блок
|
||||
ПОЧЕМУ — ни норма, ни обоснование не удаляются никогда (META-8, META-10), —
|
||||
либо блок СНЯТО с датой и причиной;
|
||||
- блок ПРИМЕРЫ, если он есть, стоит после обоснования и не открывает правило:
|
||||
порядок блоков — норма, ПОЧЕМУ, ПРИМЕРЫ;
|
||||
- вводная проза содержит строку о версии языка;
|
||||
- ссылки вида `<ПРЕФИКС>-<n>` — хоть в тексте набора, хоть в локальной части
|
||||
копии — разрешаются: неразрешённый идентификатор всегда ошибка (META-32);
|
||||
@@ -564,7 +621,9 @@ XMIG-6 не соблюдается в легаси-таблицах `show_histor
|
||||
- норма исполнима без обращения к другим файлам (в файлах конвенций: они
|
||||
уезжают по одной, а обвязка ссылается на соседей свободно);
|
||||
- обоснование отвечает на «что сломается», а не пересказывает норму;
|
||||
- хвост обоснования не вводит требований, которых нет в блоке нормы.
|
||||
- хвост обоснования не вводит требований, которых нет в блоке нормы;
|
||||
- примеры иллюстрируют норму и не расширяют её: деталь примера не читается
|
||||
как требование.
|
||||
|
||||
## Версия языка
|
||||
|
||||
|
||||
Reference in New Issue
Block a user