diff --git a/rules/patterns/no-hardcoded-vendors/contract.md b/rules/patterns/no-hardcoded-vendors/contract.md new file mode 100644 index 0000000..06f0d35 --- /dev/null +++ b/rules/patterns/no-hardcoded-vendors/contract.md @@ -0,0 +1,79 @@ +# Contract: No Hardcoded Vendors or Models + +Version: 1.0 + +## Purpose + +Запрет на хардкод названий вендоров, моделей и партномеров в коде. + +--- + +## Правило + +Названия вендоров, моделей, серий оборудования и партномеров **не появляются в коде**. +Они приходят из данных: БД, конфига, входного документа, справочника. + +--- + +## Что запрещено + +```go +// Запрещено +if device.Vendor == "Dell" { ... } +if strings.Contains(model, "PowerEdge") { ... } +switch vendor { +case "HP", "HPE", "Hewlett Packard": ... +} +``` + +```go +// Запрещено — список вендоров в коде +var knownVendors = []string{"Dell", "HP", "Cisco", "Lenovo"} +``` + +--- + +## Что делать вместо + +Логика определяется по полям из данных, не по названию вендора: + +```go +// Правильно — смотрим на возможности объекта, не на имя вендора +if device.HasIPMI { ... } +if device.ParserType == "redfish" { ... } +``` + +Если нужен маппинг — он живёт в конфиге или справочной таблице БД, не в коде: + +```yaml +# config.yaml +vendor_parsers: + dell: redfish + hp: ilo + cisco: ucs +``` + +```sql +-- справочник в БД +SELECT parser_type FROM vendor_registry WHERE LOWER(vendor) = LOWER(?); +``` + +--- + +## Исключения + +Допускается упоминание вендора **только** в: + +- Названиях пакетов/директорий парсеров: `internal/parser/vendors/dell/` +- Комментариях и документации +- Тестовых фикстурах (XML/JSON с реальными данными оборудования) + +В этих местах название вендора — идентификатор модуля, не условие в логике. + +--- + +## Почему + +Хардкод вендора делает код хрупким: новый вендор требует правок в коде, а не в данных. +Опечатка в строке (`"HPE"` vs `"HP"`) создаёт незаметный баг. +Регистр не контролируется (см. `identifier-normalization` contract).