Введение

Принцип разработки программного обеспечения "Не повторяйся" (DRY) – это принцип, направленный на уменьшение повторения информации, которая может измениться, путем замены её абстракциями, менее подверженными изменениям, или использования нормализации данных для предотвращения избыточности. Принцип DRY формулируется как: "Каждая единица знания должна иметь единственное, однозначное и авторитетное представление в системе". Этот принцип был сформулирован Энди Хантом и Дэйвом Томасом в их книге "Прагматичный программист". Они применяют его широко, включая схемы баз данных, планы тестирования, систему сборки и даже документацию. При успешном применении принципа DRY, изменение любого отдельного элемента системы не требует внесения изменений в другие логически не связанные элементы. Более того, логически связанные элементы изменяются предсказуемо и единообразно, что обеспечивает их синхронизацию. Помимо использования методов и подпрограмм в коде, Томас и Хант используют генераторы кода, автоматизированные системы сборки и скриптовые языки для соблюдения принципа DRY на разных уровнях.

Принцип единого выбора

Особенный случай принципа DRY — принцип единого выбора. Бертра́н Мейер определил его так: "Каждый раз, когда программная система должна поддерживать набор альтернатив, ровно один модуль в системе должен знать их полный перечень". Он был применён при разработке языка Эйфель.

НЕГОЛОГО

Противоположность принципу DRY называется WET, акроним, который обычно расшифровывают как "пиши всё дважды" (альтернативные расшифровки: "пиши каждый раз", "мы любим печатать" или "трать время всех"). Решения WET часто встречаются в многоуровневых архитектурах, когда разработчику, например, может быть поручено добавить поле для комментария в форму веб-приложения. Текстовая строка "комментарий" может повторяться в метке, HTML-теге, имени функции чтения, приватной переменной, DDL базы данных, запросах и так далее. Принцип DRY позволяет избежать этой избыточности, используя фреймворки, которые сокращают или устраняют большинство задач редактирования, оставляя лишь самые важные, и обеспечивая возможность расширения путем добавления новых переменных знаний в одном месте. Эта концепция "WET" как альтернативы "DRY" существует, по крайней мере, с 2002 года в среде Java, хотя автор этого термина неизвестен.

АХА

Другой подход к абстракциям — принцип AHA. AHA расшифровывается как "избегайте поспешных абстракций", описанный Кентом Доддсом как оптимизация для изменений в первую очередь и избежание преждевременной оптимизации, и был вдохновлён идеей Сэнди Метц о том, что лучше дублировать код, чем использовать неправильную абстракцию. AHA основан на понимании того, что чем больше усилий инженеры вложили в абстрагирование части программного обеспечения, тем сильнее они считают, что стоимость этих усилий уже не окупится (ошибка выжившего). Поэтому инженеры склонны продолжать дорабатывать одну и ту же абстракцию при каждом изменении требований. AHA-программирование исходит из того, что как решения WET, так и решения DRY неизбежно приводят к созданию жёсткого и сложного в поддержке программного обеспечения. Вместо того, чтобы начинать с абстракции или абстрагировать при определённом количестве дубликатов, программное обеспечение может быть более гибким и надёжным, если абстракция выполняется только тогда, когда это необходимо, или когда само дублирование становится препятствием и известно, как должна функционировать абстракция. Изначально AHA-программирование Доддс называл "влажным кодом", затем Дэниел Бартоломей, а Мэтт Райер первоначально использовал аббревиатуру DAMP (Don't Abstract Methods Prematurely). Существовал другой принцип программирования с названием DAMP (Descriptive And Meaningful Phrases), описанный Джеем Филдсом, и сообщество выступило против использования MOIST из-за культурной неприязни к слову "влажный". Доддс обратился за альтернативами в Twitter и предложил DATE, прежде чем остановился на предложении Шер Скарлетт — AHA.