Files
bible/rules/patterns/no-hardcoded-vendors/contract.md
2026-03-01 22:21:13 +03:00

80 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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).