язык: заведён блок ПРИМЕРЫ

- пятая, необязательная часть правила: код парой «плохо → хорошо» после
  обоснования; метка добавлена в словарь (EXAMPLES) и в строку о версии
  языка во всех тринадцати файлах
- сказано, чем примеры не являются: требований в блоке нет, дословным
  сниппетом он не служит, при расхождении с нормой правят пример
- READING.md обновлён по META-30, в машинные проверки добавлен порядок
  блоков, в читательские — что примеры норму не расширяют
This commit is contained in:
av
2026-07-26 16:09:58 +03:00
parent 1d19e0357b
commit 59a1c23f55
16 changed files with 116 additions and 48 deletions
+76 -17
View File
@@ -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
- норма исполнима без обращения к другим файлам (в файлах конвенций: они
уезжают по одной, а обвязка ссылается на соседей свободно);
- обоснование отвечает на «что сломается», а не пересказывает норму;
- хвост обоснования не вводит требований, которых нет в блоке нормы.
- хвост обоснования не вводит требований, которых нет в блоке нормы;
- примеры иллюстрируют норму и не расширяют её: деталь примера не читается
как требование.
## Версия языка