Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
DRY (Dont Repeat Yourself) — Принцип единственного источника истины
DRY — это фундаментальный принцип разработки программного обеспечения, который гласит: каждое знание должно иметь единственное, однозначное представление в системе. Другими словами, не копируй код, логику или данные — выноси их в одно место и переиспользуй.
Основная идея
Проблема дублирования:
// ❌ Плохо — код повторяется
function validateEmail($email) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new Exception("Invalid email");
}
}
function processRegistration($email) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new Exception("Invalid email");
}
// ... регистрация
}
function updateProfile($email) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new Exception("Invalid email");
}
// ... обновление профиля
}
Решение — применяем DRY:
// ✅ Хорошо — одно место для валидации
function validateEmail($email) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidEmailException("Invalid email");
}
}
function processRegistration($email) {
validateEmail($email);
// ... регистрация
}
function updateProfile($email) {
validateEmail($email);
// ... обновление профиля
}
Преимущества DRY
- Легче менять — изменил в одном месте, эффект везде
- Меньше ошибок — исправил баг в функции, все её использующие получат fix
- Читаемость — код понятнее и короче
- Тестирование — проверяешь логику один раз
- Поддерживаемость — намного проще поддерживать проект
Где применяется DRY
- Функции и методы — выносим повторяющуюся логику
- Константы и конфиги — не хардкодим строки, числа, URL
- Запросы в БД — используем репозитории, не копируем SQL
- Стили и шаблоны — наследование в классах, миксины в CSS
- Бизнес-правила — одна реализация проверок, валидаций
DRY и архитектура
// ✅ Правильно — сервис содержит бизнес-логику
class UserService {
public function validateAndRegister(string $email, string $password) {
$this->validateEmail($email);
$this->validatePassword($password);
return $this->createUser($email, $password);
}
}
// ✅ Контроллер просто вызывает сервис
class AuthController {
public function register(Request $request, UserService $service) {
return $service->validateAndRegister(
$request->input("email"),
$request->input("password")
);
}
}
Когда НЕ переусложнять
Важно не путать DRY с YAGNI (You Arent Gonna Need It). Если код повторяется только в 2 местах и вероятность изменений низкая, можно оставить как есть. Правило 3: если повторяется 3+ раза — точно нужно рефакторить.