DRY (Don't Repeat Yourself) — это один из ключевых принципов в программировании, цель которого заключается в том, чтобы избежать дублирования кода. Этот принцип был впервые формализован в книге «The Pragmatic Programmer» (1999) Дэйва Томаса и Энди Ханта.
Основная идея DRY:
Каждая часть знаний системы должна иметь единственное, однозначное и авторитетное представление.
Это означает, что если в коде или логике программы есть повторяющиеся фрагменты, их следует реорганизовать таким образом, чтобы они присутствовали только в одном месте.
Примеры дублирования, которых следует избегать:
1. Дублирование кода:
Проблема: Если один и тот же блок кода используется в нескольких местах, это может привести к проблемам при изменении логики. Если потребуется изменение, его нужно будет вносить в нескольких местах, что увеличивает вероятность ошибок.
Пример проблемы:
Представим, что у нас есть два метода, которые вычисляют налог для разных типов товаров. Логика расчета налога одинаковая, но она дублируется в обоих методах.
Java (без DRY):
Python (без DRY):
Здесь логика расчета налога дублируется в двух местах. Если налог изменится, нам придется изменить код в обоих местах, что увеличивает вероятность ошибок.
Решение (с применением DRY):
Мы можем вынести общую логику расчета налога в отдельный метод или функцию.
Java (с DRY):
Python (с DRY):
Теперь, если налог изменится, нам нужно будет изменить его только в одном месте.
2. Дублирование бизнес-логики:
Проблема: Если бизнес-логика (например, проверка данных или выполнение расчетов) реализована в нескольких местах, то при изменении бизнес-правил нужно будет обновлять код в нескольких местах, что увеличивает вероятность ошибок и несоответствий.
Пример проблемы:
Предположим, у нас есть два метода, которые проверяют возраст пользователя, чтобы определить, может ли он совершить покупку. Логика проверки возраста одинаковая, но она дублируется.
Java (без DRY):
Python (без DRY):
Здесь логика проверки возраста дублируется. Если возрастное ограничение изменится (например, с 18 на 21 год), нужно будет обновлять обе функции.
Решение (с применением DRY):
Вынесем проверку возраста в отдельную функцию.
Java (с DRY):
Python (с DRY):
Теперь при изменении возрастного ограничения нам нужно изменить только одну функцию.
3. Дублирование знаний:
Проблема: Дублирование знаний может касаться документации, комментариев, конфигурационных файлов и других аспектов системы. Например, если конфигурационные данные (например, настройки базы данных или URL-адреса API) дублируются в нескольких местах, это может привести к ошибкам и несоответствиям.
Пример проблемы:
Предположим, у нас есть приложение, которое подключается к базе данных, и конфигурация базы данных указана в нескольких местах.
Java (без DRY):
Python (без DRY):
Адреса баз данных дублируются в коде, и если конфигурация изменится, её нужно будет обновлять в нескольких местах.
Решение (с применением DRY):
Мы можем хранить конфигурацию в одном месте, например, в конфигурационном файле или в виде констант.
Java (с DRY):
Python (с DRY):
Теперь, если изменится URL базы данных, его нужно будет изменить только в одном месте.
Примечание к последнему примеру - вообще лучшим решением будет хранить константы в конфигурационном файле. В файлах с логикой лучше не хранить.
Примеры применения DRY:
1. Функции и методы:
Вместо того чтобы копировать и вставлять одинаковые фрагменты кода в разных частях программы, их можно вынести в отдельную функцию или метод, который будет вызываться в нужных местах.
2. Модули и библиотеки:
Общие части кода можно вынести в отдельные модули или библиотеки, чтобы использовать их повторно в разных проектах или частях системы.
3. Конфигурационные файлы:
Настройки и параметры лучше хранить в одном месте (например, в конфигурационном файле), чем жестко прописывать их в коде.
4. Наследование и композиция:
В объектно-ориентированном программировании использование наследования и композиции помогает избежать дублирования кода путем объединения общих свойств и методов в базовые классы или компоненты.
Преимущества DRY:
- Упрощение сопровождения: Изменения нужно вносить только в одном месте, что снижает вероятность ошибок.
- Чистота и читаемость кода: Код становится проще, так как в нем меньше повторений.
- Ускорение разработки: Повторное использование кода экономит время.
- Меньше багов: Так как изменения вносятся в одном месте, меньше шансов, что разные части кода будут вести себя по-разному.
Потенциальные проблемы:
Иногда, следуя принципу DRY, можно переусердствовать, что приведет к сложностям.
Например, чрезмерно обобщенный код может стать трудным для понимания и сопровождения.
Важно соблюдать баланс между соблюдением DRY и поддерживаемостью кода.
Заключение:
DRY — это важный принцип, который помогает улучшить качество кода, делая его более гибким и простым в сопровождении. Однако его применение должно быть разумным и сбалансированным, чтобы не создавать избыточной сложности.
Если Вам интересно, что еще можно найти на канале QA Helper, прочитайте статью: Вместо оглавления. Что вы найдете на канале QA Helper - справочник тестировщика?
Не забудьте подписаться на канал, чтобы не пропустить полезную информацию: QA Helper - справочник тестировщика
Пишите в комментариях какой пункт было бы интересно рассмотреть более подробно.
Обязательно прочитайте: Что должен знать и уметь тестировщик
Также будет интересно почитать: Вопросы которые задают на собеседовании тестировщикам