# 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).