Что такое DRY

Ответ

DRY (Don't Repeat Yourself) — принцип разработки, при котором каждая часть знания или логики должна иметь единственное, однозначное представление в системе. Это помогает избежать дублирования кода, упрощает поддержку и снижает вероятность ошибок.

Пример нарушения DRY:

function calculateArea(width, height) {
  return width * height;
}

function calculateVolume(width, height, depth) {
  return width * height * depth;
}

Исправленный вариант:

function multiply(a, b) {
  return a * b;
}

function calculateArea(width, height) {
  return multiply(width, height);
}

function calculateVolume(width, height, depth) {
  return multiply(multiply(width, height), depth);
}

Важно не переусердствовать — иногда лучше небольшое дублирование, чем излишняя абстракция.

Ответ 18+ 🔞

А, ну это же классика, блядь! Принцип DRY. Расшифровывается как "Don't Repeat Yourself", а по-нашему — "Не повторяйся, ёпта".

Смысл в чём, сука? Чтобы каждая идея, каждый кусок логики в твоём коде жил в одном-единственном месте. Не размазан по всему проекту, как говно по стенке. Зачем? Да чтобы потом, когда тебе начальник скажет: "Вася, поменяй вот эту формулу расчёта площади", ты не бегал как угорелый, меняя её в двадцати функциях, а пошёл в одно место, чих-пых, и всё исправил. И не обосрался, что где-то забыл.

Смотри, вот тебе пример, как делать НЕ НАДО, прям как у некоторых "архитекторов":

function calculateArea(width, height) {
  return width * height;
}

function calculateVolume(width, height, depth) {
  return width * height * depth;
}

Видишь? Умножение width * height повторяется, сука! А если мы там накосячили? Или хотим добавить округление? Придётся в двух местах ковыряться. Пиздец, а не подход.

А теперь смотри, как красавчики делают:

function multiply(a, b) {
  return a * b;
}

function calculateArea(width, height) {
  return multiply(width, height);
}

function calculateVolume(width, height, depth) {
  return multiply(multiply(width, height), depth);
}

Вот! Вся логика умножения теперь в одной функции multiply. Хочешь её поменять? Пожалуйста — один раз и навсегда. Красота, блядь!

Но вот тут, сука, главный подвох! Нельзя с этим принципом, как с манной кашей, обосраться. Иногда начинающие гении так увлекаются, что выносят ВСЁ. Получается такая хуйня, где чтобы чайник вскипятить, нужно вызвать функцию boilWater(), которая вызывает getElectricity(), которая дергает checkFuse(), а та, блядь, стучится в базу данных... В итоге код превращается в ёбаную абстракцию ради абстракции, понять ничего нельзя, отладка — ад.

Иногда проще и честнее оставить два похожих, но РАЗНЫХ куска кода рядом. Чем связывать их в одну супер-функцию с кучей условий, которая делает и то, и сё, и ещё по-третьему, если передать specialFlag = true. Это уже не DRY, а пиздопроебина полная.

Короче, правило такое: если изменение в одной логике ДОЛЖНО повлечь изменение в другой — это дублирование, убивай его. А если это просто два похожих, но независимых куска — можешь расслабить булки. Главное — мозг включать, а не слепо следовать мантрам.