Открыть сервис

Принцип DRY

Принцип DRY (от англ. Don’t Repeat Yourself — «не повторяйся») — это принцип разработки программного обеспечения, нацеленный на снижение повторения информации различного рода, особенно в системах с множеством взаимосвязанных компонентов. Сформулированный Энди Хантом и Дейвом Томасом в книге «Программист-прагматик» (1999), DRY гласит: «Каждая часть знания должна иметь единственное, непротиворечивое, авторитетное представление в системе». Нарушение этого принципа приводит к дублированию кода, данных, логики или документации, что усложняет сопровождение и увеличивает риск ошибок при внесении изменений.

История возникновения

Термин DRY был впервые введён в 1999 году в книге Энди Ханта и Дейва Томаса «Программист-прагматик. Путь от подмастерья к мастеру». Авторы предложили его как один из ключевых принципов эффективной разработки, противопоставив распространённой практике копирования и вставки фрагментов кода. Идея быстро распространилась в сообществе разработчиков, став частью более широкой философии «прагматичного программирования». Впоследствии DRY вошёл в число базовых принципов объектно-ориентированного проектирования наряду с SOLID, KISS и YAGNI.

Сущность принципа

Принцип DRY требует, чтобы каждая логически завершённая единица знания (алгоритм, бизнес-правило, конфигурация, определение данных) была представлена в системе ровно один раз. Повторение одного и того же кода в разных местах считается антипаттерном, известным как «копипаста» (от англ. copy-paste). Основная проблема дублирования заключается в том, что при необходимости изменить повторяющуюся логику разработчику приходится вносить правки во все копии, что повышает вероятность пропустить одну из них и создать несогласованность.

DRY не следует путать с простым сокращением объёма кода. Цель — не минимизация количества строк, а устранение дублирования знаний. Например, если два метода выполняют одинаковые вычисления, но основаны на разных бизнес-правилах, их объединение может быть ошибочным, так как нарушит единственность представления для каждого отдельного знания.

Способы реализации

Абстракция и обобщение

Наиболее распространённый способ соблюдения DRY — вынесение повторяющегося кода в отдельные функции, методы, классы или модули. Вместо того чтобы писать один и тот же цикл или условие в нескольких местах, создаётся единая процедура, вызываемая по мере необходимости.

Использование шаблонов проектирования

Многие паттерны проектирования, такие как «Фабричный метод», «Стратегия» или «Шаблонный метод», способствуют устранению дублирования за счёт инкапсуляции изменяющегося поведения и вынесения общего кода в базовые классы.

Параметризация

Вместо написания нескольких почти идентичных функций, различающихся только значениями, используется параметризация: одна функция принимает аргументы, определяющие её поведение.

Генерация кода

В некоторых случаях (например, при работе с конфигурационными файлами или ORM) дублирование может быть устранено путём автоматической генерации кода на основе метаданных или шаблонов.

Связь с другими принципами

DRY и WET

Антиподом DRY является принцип WET (от англ. Write Everything Twice — «пиши всё дважды» или We Enjoy Typing — «нам нравится печатать»). WET описывает ситуацию, когда разработчики сознательно или по небрежности дублируют код, что приводит к увеличению объёма базы кода и сложности её сопровождения.

DRY и KISS

Принцип KISS (Keep It Simple, Stupid) требует максимальной простоты решений. DRY часто способствует упрощению, так как устраняет избыточные копии, но в некоторых случаях чрезмерное стремление к DRY может привести к созданию излишне абстрактных и сложных конструкций, что противоречит KISS.

DRY и YAGNI

YAGNI (You Ain’t Gonna Need It) предостерегает от написания кода «на всякий случай». DRY, напротив, может побудить разработчика сразу создавать обобщённое решение для потенциально повторяющихся фрагментов. Если будущее дублирование не очевидно, преждевременная абстракция может оказаться избыточной и нарушить YAGNI.

Критика и ограничения

Несмотря на широкое признание, принцип DRY не является абсолютным и имеет ограничения:

  • Чрезмерная абстракция. Стремление устранить любое дублирование может привести к созданию сложных иерархий классов, запутанных обобщений и кода, который трудно читать и отлаживать. В таких случаях дублирование может быть оправдано простотой и ясностью.
  • Контекстная зависимость. Два фрагмента кода могут быть внешне похожи, но решать разные задачи в разном контексте. Объединение их в одну сущность может нарушить единственность представления знаний, так как изменится семантика.
  • Производительность. В некоторых высоконагруженных системах вызов общей функции может быть менее эффективным, чем встраивание кода (инлайнинг). Однако это редкое исключение, обычно не перевешивающее выгоды от удобства сопровождения.
  • Дублирование данных. В базах данных и конфигурациях иногда требуется дублирование для обеспечения производительности (денормализация) или надёжности (резервные копии). DRY применим прежде всего к логике и знаниям, а не к физическому хранению данных.

Примеры нарушения и соблюдения

Нарушение (WET)

```python def calculate_area_circle(radius): return 3.14159 radius radius

def calculate_area_sphere(radius): return 4 3.14159 radius * radius ``` Здесь константа π (3.14159) повторяется дважды. При изменении точности её придётся менять в обоих местах.

Соблюдение (DRY)

```python PI = 3.14159

def calculate_area_circle(radius): return PI radius radius

def calculate_area_sphere(radius): return 4 PI radius * radius ``` Константа вынесена в одно место, что упрощает её изменение.

Применение в различных областях

Принцип DRY выходит за рамки программирования и применяется в:

  • Документировании. Вместо дублирования описания одного и того же компонента в нескольких документах используется единый источник (например, в wiki или системах управления знаниями).
  • Конфигурации. Параметры, используемые в разных частях системы, хранятся в централизованных конфигурационных файлах или переменных окружения.
  • Тестировании. Повторяющиеся шаги в тестовых сценариях выносятся в общие функции или фикстуры.
  • Бизнес-процессах. Описание одного и того же бизнес-правила не должно дублироваться в разных регламентах или системах.

Значение для разработки

Соблюдение принципа DRY существенно упрощает сопровождение программного обеспечения. При внесении изменений разработчику достаточно отредактировать код в одном месте, что снижает риск ошибок и сокращает время разработки. DRY также способствует лучшему пониманию системы, так как код становится более структурированным и менее избыточным. Вместе с тем, его применение требует баланса: излишняя абстракция может навредить читаемости, а полное игнорирование — привести к хаосу и «кодовой эрозии».

Источники

  • Хант Э., Томас Д. «Программист-прагматик. Путь от подмастерья к мастеру» (1999).
  • Мартин Р. «Чистый код: создание, анализ и рефакторинг» (2008).
  • Фаулер М. «Рефакторинг: улучшение существующего кода» (1999).
  • Принципы проектирования программного обеспечения — материалы курсов по разработке ПО (MIT, Stanford).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →