Add no-hardcoded-vendors contract
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
79
rules/patterns/no-hardcoded-vendors/contract.md
Normal file
79
rules/patterns/no-hardcoded-vendors/contract.md
Normal file
@@ -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).
|
||||||
Reference in New Issue
Block a user