Move inline code examples out of normative contracts
identifier-normalization, no-hardcoded-vendors, vendor-installer-verification, and build-version-display follow the go-database split: rules in contract.md, snippets in README.md. Routed contract reads get cheaper; examples stay available on demand. Lint now also rejects stale kit/patterns references. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
42
rules/patterns/no-hardcoded-vendors/README.md
Normal file
42
rules/patterns/no-hardcoded-vendors/README.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# No Hardcoded Vendors Pattern Notes
|
||||
|
||||
This file keeps examples. The normative rules live in `contract.md`.
|
||||
|
||||
## Запрещено
|
||||
|
||||
```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(?);
|
||||
```
|
||||
@@ -1,64 +1,23 @@
|
||||
# Contract: No Hardcoded Vendors or Models
|
||||
|
||||
Version: 1.0
|
||||
Version: 1.1
|
||||
|
||||
## Purpose
|
||||
|
||||
Запрет на хардкод названий вендоров, моделей и партномеров в коде.
|
||||
|
||||
---
|
||||
See `README.md` for code examples.
|
||||
|
||||
## Правило
|
||||
|
||||
Названия вендоров, моделей, серий оборудования и партномеров **не появляются в коде**.
|
||||
Они приходят из данных: БД, конфига, входного документа, справочника.
|
||||
|
||||
---
|
||||
|
||||
## Что запрещено
|
||||
|
||||
```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(?);
|
||||
```
|
||||
|
||||
---
|
||||
- Запрещены сравнения и switch по имени вендора (`if device.Vendor == "Dell"`) и
|
||||
списки вендоров в коде (`var knownVendors = []string{...}`).
|
||||
- Логика определяется по полям из данных (`device.HasIPMI`, `device.ParserType`),
|
||||
не по названию вендора.
|
||||
- Если нужен маппинг вендор → поведение, он живёт в конфиге или справочной таблице БД.
|
||||
|
||||
## Исключения
|
||||
|
||||
@@ -70,8 +29,6 @@ SELECT parser_type FROM vendor_registry WHERE LOWER(vendor) = LOWER(?);
|
||||
|
||||
В этих местах название вендора — идентификатор модуля, не условие в логике.
|
||||
|
||||
---
|
||||
|
||||
## Почему
|
||||
|
||||
Хардкод вендора делает код хрупким: новый вендор требует правок в коде, а не в данных.
|
||||
|
||||
Reference in New Issue
Block a user