Введение
Принцип разработки программного обеспечения "Не повторяйся" (DRY) – это принцип, направленный на уменьшение повторения информации, которая может измениться, путем замены её абстракциями, менее подверженными изменениям, или использования нормализации данных для предотвращения избыточности. Принцип DRY формулируется как: "Каждая единица знания должна иметь единственное, однозначное и авторитетное представление в системе". Этот принцип был сформулирован Энди Хантом и Дэйвом Томасом в их книге "Прагматичный программист". Они применяют его широко, включая схемы баз данных, планы тестирования, систему сборки и даже документацию. При успешном применении принципа DRY, изменение любого отдельного элемента системы не требует внесения изменений в другие логически не связанные элементы. Более того, логически связанные элементы изменяются предсказуемо и единообразно, что обеспечивает их синхронизацию. Помимо использования методов и подпрограмм в коде, Томас и Хант используют генераторы кода, автоматизированные системы сборки и скриптовые языки для соблюдения принципа DRY на разных уровнях.
"Don't repeat yourself" (DRY) is a principle of software development aimed at reducing repetition of information which is likely to change, replacing it with abstractions that are less likely to change, or using data normalization which avoids redundancy in the first place. The DRY principle is stated as "Every piece of knowledge must have a single, unambiguous, authoritative representation within a system". The principle has been formulated by Andy Hunt and Dave Thomas in their book The Pragmatic Programmer. They apply it quite broadly to include database schemas, test plans, the build system, even documentation. When the DRY principle is applied successfully, a modification of any single element of a system does not require a change in other logically unrelated elements. Additionally, elements that are logically related all change predictably and uniformly, and are thus kept in sync. Besides using methods and subroutines in their code, Thomas and Hunt rely on code generators, automatic build systems, and scripting languages to observe the DRY principle across layers.
Принцип единого выбора
Особенный случай принципа DRY — принцип единого выбора. Бертра́н Мейер определил его так: "Каждый раз, когда программная система должна поддерживать набор альтернатив, ровно один модуль в системе должен знать их полный перечень". Он был применён при разработке языка Эйфель.
"Whenever a software system must support a set of alternatives, one and only one module in the system should know their exhaustive list." It was applied when designing Eiffel.
НЕГОЛОГО
Противоположность принципу 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.