# 14. Общие практики (DRY, KISS, YAGNI, Закон Деметры)

[← Оглавление](./index.md)

---

## DRY — не дублируйте знания

**ПЛОХО — ОДНА И ТА ЖЕ ЛОГИКА В ДВУХ МЕСТАХ**
```php
// В компоненте A:
$lead = \Bitrix\Crm\LeadTable::getByPrimary($id)->fetchObject();
if (!$lead) {
    throw new \Exception('Лид не найден');
}

// В компоненте B:
$lead = \Bitrix\Crm\LeadTable::getByPrimary($id)->fetchObject();
if (!$lead) {
    throw new \Exception('Лид не найден');
}
```

**ХОРОШО — ОБЩАЯ ЛОГИКА В LEADPROVIDER**
```php
class LeadProvider {
    public function getById(int $id): \Bitrix\Crm\Item {
        $lead = \Bitrix\Crm\LeadTable::getByPrimary($id)->fetchObject();
        if (!$lead) {
            throw new \Bitrix\Main\ObjectNotFoundException("Лид #{$id} не найден");
        }
        return $lead;
    }
}
```

---

## Закон Деметры — не разговаривай с незнакомцами

**ПЛОХО — ЦЕПОЧКА ЧЕРЕЗ ГРАНИЦЫ ОБЪЕКТОВ**
```php
$city = $deal->getContact()->getCompany()->getAddress()->getCity();
```

**ХОРОШО — ДЕЛЕГИРУЮЩИЙ МЕТОД В DEAL**
```php
// Вызов:
$city = $deal->getContactCompanyCity();

// Реализация внутри класса Deal:
public function getContactCompanyCity(): ?string {
    return $this->getContact()?->getCompany()?->getCity();
}
```

---

## KISS — простое решение лучше сложного

Не усложняйте без необходимости. Если задачу можно решить тремя строками — не пишите тридцать.

---

## YAGNI — не добавляйте функциональность «на будущее»

Реализуйте только то, что требуется прямо сейчас. Код, написанный «на перспективу», часто не используется и засоряет проект.