Technologie/Nástroje

DRY (Don't Repeat Yourself)

Co je to princip DRY?

DRY je zkratka anglického Don't Repeat Yourself – nepopakuj se. Jde o klíčový programátorský princip, který říká, že každý kus logiky, informace nebo funkcionality by měl existovat v kódu pouze na jednom jediném místě. Jinými slovy, pokud potřebujete stejnou funkcionalitu na více místech vaší aplikace, neměli byste kopírovat a vkládat stejný kód znovu a znovu. Místo toho byste měli vytvořit znovupoužitelnou funkci, komponentu nebo modul, který pak použijete všude, kde je to potřeba.

Tento princip poprvé formuloval Andy Hunt a Dave Thomas v jejich knize "The Pragmatic Programmer" z roku 1999, která se stala biblí moderního softwarového vývoje. DRY není jen o kopírování kódu – jde o eliminaci duplicity znalostí a logiky v celém systému. Když dodržujete princip DRY, vytváříte kód, který je snadněji udržovatelný, méně náchylný k chybám a efektivnější pro budoucí rozšiřování.

V kontextu vývoje webu se princip DRY aplikuje všude – od HTML šablon přes CSS styly až po JavaScript logiku a backendové API. Profesionální vývojáři tento princip automaticky dodržují, protože vědí, že duplicitní kód je jednou z hlavních příčin technického dluhu a problémů při údržbě webu. Podle různých studií až 30-40% času při vývoji se tráví údržbou a opravami – DRY tento čas dramaticky snižuje.

Jak DRY funguje v praxi?

Představte si, že máte na webu kontaktní formulář a zároveň registrační formulář. Oba vyžadují validaci emailové adresy. Bez dodržení principu DRY byste napsali validační logiku zvlášť pro každý formulář. To znamená dvakrát stejný kód – a když objevíte chybu ve validaci nebo chcete přidat podporu pro nový formát emailu, musíte změnu provést na dvou místech. Navíc riskujete, že na jedno místo zapomenete, což vytvoří nekonzistenci.

S principem DRY vytvoříte jednu znovupoužitelnou funkci validateEmail(email), kterou pak zavoláte v obou formulářích. Když potřebujete změnit validační pravidla, změníte ji pouze na jednom místě a změna se automaticky projeví všude, kde funkci používáte. To je podstata DRY – single source of truth, jediný zdroj pravdy pro každou část logiky.

V praxi se princip DRY aplikuje pomocí různých technik podle kontextu. V JavaScriptu vytváříte funkce a komponenty, v CSS používáte třídy a proměnné, v PHP nebo jiných backendových jazycích vytváříte funkce a třídy, v HTML používáte šablony a includes. Moderní frameworky jako React, Vue nebo Next.js mají DRY zabudovaný v samotné architektuře – komponenty jsou ze své podstaty znovupoužitelné.

Důležité je chápat, že DRY není dogma – nejde o to nikdy nenapsat podobný kód dvakrát. Jde o to neopakovat stejnou logiku nebo znalost dvakrát. Někdy se dva kusy kódu mohou náhodou podobat, ale pokud řeší různé problémy nebo mají různý kontext, není nutné je nutně sjednotit. Klíčem je rozpoznat skutečnou duplicitu od náhodné podobnosti.

Výhody dodržování principu DRY

  • Snadnější údržba kódu

  • Když potřebujete změnit funkcionalitu, děláte to pouze na jednom místě místo hledání všech míst, kde je kód zkopírovaný. To dramaticky snižuje riziko chyb a urychluje práci. Pokud máte validaci emailu na deseti místech a objevíte bezpečnostní díru, musíte opravit deset míst. S DRY opravíte jedno místo.

  • Méně chyb a bugů

  • Duplicitní kód je jeden z hlavních zdrojů bugů. Když kopírujete kód, často zapomenete na nějaké místo při aktualizaci, což vede k nekonzistentnímu chování. DRY eliminuje tento problém u kořene – jedna implementace znamená konzistentní chování všude.

  • Rychlejší vývoj nových funkcí

  • Když máte dobře strukturovaný DRY kód, můžete znovupoužít existující komponenty a funkce při budování nových features. Místo psaní od nuly sestavujete z ověřených stavebních bloků. To zrychluje development a snižuje riziko nových chyb.

  • Lepší čitelnost a pochopitelnost

  • DRY kód je čitelnější, protože každá logika je na jednom místě s jasným názvem. Místo procházení stovek řádků duplicitního kódu najdete funkci formatDate() a okamžitě víte, co dělá. Pro nové vývojáře vstupující do projektu je DRY kód mnohem srozumitelnější.

  • Menší velikost aplikace

  • Eliminace duplicit znamená méně řádků kódu, menší velikost JavaScriptu, CSS a celkově menší bundle. To se přímo promítá do rychlosti načítání webu a lepší performance, což pozitivně ovlivňuje SEO i uživatelskou zkušenost.

  • Efektivnější týmová spolupráce

  • V týmu více vývojářů DRY zajišťuje, že všichni používají stejné funkce a komponenty. To vytváří konzistenci napříč projektem a usnadňuje code review. Vývojáři nemusí řešit, proč existují tři různé implementace stejné věci.

Nevýhody a úskalí principu DRY

  • Riziko předčasné abstrakce

  • Častá chyba začátečníků je snaha o DRY příliš brzy. Když vidíte podobný kód dvakrát, není vždy nutné okamžitě vytvářet abstrakci. Někdy je lepší počkat, až uvidíte pattern třikrát či čtyřikrát, abyste lépe pochopili, co skutečně potřebujete. Předčasná abstrakce může vést k příliš komplikovanému kódu.

  • Složitější kód při přehnání

  • Přílišná snaha o DRY může paradoxně vést k méně čitelnému kódu. Pokud vytvoříte super-generickou funkci s deseti parametry, která pokrývá dvacet různých případů, bude sice DRY, ale nikdo ji nebude rozumět. Někdy je lepší mít dva jednoduché kusy kódu než jeden extrémně komplikovaný.

  • Tight coupling (těsná provázanost)

  • Když více částí aplikace sdílí stejnou funkci, změna této funkce ovlivní všechny tyto části. To může být problém, pokud se požadavky na různá místa časem rozejdou. Musíte pečlivě vyvažovat DRY s principem single responsibility a low coupling.

  • Obtížnější refaktoring

  • Když máte sdílenou komponentu používanou na padesáti místech, její změna vyžaduje otestování všech padesáti míst. To může vést k situacím, kdy se vývojáři bojí měnit sdílený kód a raději vytvoří novou variantu – což porušuje DRY.

  • Náročnější na zkušenosti vývojářů

  • Dobře implementovat DRY vyžaduje zkušenosti a architektonické myšlení. Musíte umět rozpoznat, co je skutečná duplicita a co jen náhodná podobnost. Junior vývojáři často buď DRY zcela ignorují, nebo ho aplikují špatně.

Praktické tipy pro aplikaci DRY

  • Rule of Three (pravidlo tří)

  • Doporučuji dodržovat pravidlo tří – když píšete kód poprvé, napište ho přímo. Když ho píšete podruhé, trochu zaváhejte, ale pravděpodobně ho napište znovu. Když potřebujete stejnou funkcionalitu potřetí, je čas na refaktoring a vytvoření znovupoužitelné abstrakce. To vás ochrání před předčasnou abstrakcí.

  • Používejte CSS třídy místo inline stylů

  • V CSS je DRY obzvlášť důležitý. Místo psaní style="color: #333; font-size: 16px;" na deseti místech vytvořte třídu .text-body s těmito styly. Moderní CSS nabízí proměnné (custom properties) – použijte --primary-color místo opakování #3498db v celém kódu.

  • Vytvářejte utility funkce

  • Pro běžné operace jako formátování data, validace, manipulace s řetězci vytvořte soubor utils.js se znovupoužitelnými funkcemi. To je mnohem lepší než psát new Date().toLocaleDateString() stokrát v kódu.

  • Používejte šablony a layouty

  • V PHP nebo Next.js využívejte templates a layouts. Místo kopírování header a footer do každé stránky vytvořte layout komponentu, která je obsahuje. Každá stránka pak jen vkládá svůj specifický obsah.

  • Centralizujte konfiguraci

  • Všechny konfigurace – API URL, barvy, breakpointy, konstanty – by měly být na jednom místě. Vytvořte config.js nebo .env soubor místo rozházení magických hodnot po celém kódu.

  • Code review a refaktoring

  • Pravidelně procházejte kód a hledejte duplicity. Když vidíte copy-paste pattern, je čas na refaktoring. V týmu používejte code review – druhý pár očí často duplicity odhalí rychleji.

DRY vs WET a další související principy

Opak principu DRY se humorně nazývá WET – "Write Everything Twice" (napiš všechno dvakrát) nebo "We Enjoy Typing" (rádi píšeme). WET kód je plný duplicit, těžko se udržuje a je náchylný k chybám. Legacy projekty bez architektonického dohledu často končí jako WET kód, který je noční můrou pro údržbu.

Princip DRY často jde ruku v ruce s dalšími programátorskými principy. KISS (Keep It Simple, Stupid) říká, že řešení by měla být co nejjednodušší. Někdy je v rozporu s přílišným DRY – příliš komplexní abstrakce porušuje KISS. YAGNI (You Aren't Gonna Need It) varuje před přidáváním funkcionality, kterou zatím nepotřebujete – to zahrnuje předčasné DRY abstrakce.

V objektově orientovaném programování se DRY prolína s principem Single Responsibility – každá třída nebo funkce by měla mít jednu zodpovědnost. Dobře strukturovaný DRY kód tyto principy kombinuje pro vytvoření čitelné, udržovatelné architektury.

Nejčastější otázky o principu DRY

Co znamená princip DRY v programování? Rozbalit

DRY (Don't Repeat Yourself) je programátorský princip, který říká, že každý kus logiky nebo informace by měl existovat v kódu pouze na jednom místě. Cílem je eliminovat duplicitní kód a opakování. Když potřebujete stejnou funkcionalitu na více místech, vytvoříte znovupoužitelnou funkci nebo komponentu místo kopírování kódu. To vede k lepší údržbě, menšímu množství chyb a efektivnějšímu vývoji.

Jaké jsou výhody dodržování principu DRY? Rozbalit

Hlavní výhody principu DRY zahrnují: snadnější údržbu kódu (změna na jednom místě místo deseti), méně chyb a bugů díky konzistentní implementaci, rychlejší vývoj nových funkcí pomocí znovupoužitelných komponent, lepší čitelnost a pochopitelnost kódu, menší velikost aplikace a efektivnější spolupráci v týmu. DRY kód je profesionálnější a lépe se škáluje s růstem projektu.

Jak aplikovat princip DRY v praxi? Rozbalit

Princip DRY aplikujete vytvářením znovupoužitelných funkcí a komponent místo kopírování kódu, použitím šablon a layoutů pro opakující se části webu, centralizací konfigurace do jednoho souboru, využitím CSS tříd a proměnných místo inline stylů, a pravidelným refaktoringem duplicitního kódu. Doporučuji "pravidlo tří" – vytvořte abstrakci, až potřebujete stejnou funkcionalitu potřetí.

Kdy nedodržovat princip DRY? Rozbalit

Někdy je lepší mít duplikátní kód než přílišnou abstrakci. Nedodržujte DRY, když: dva kusy kódu vypadají podobně, ale řeší různé problémy, abstrakce by byla příliš komplikovaná, části kódu se pravděpodobně budou vyvíjet různými směry, nebo jste teprve na začátku a ještě nerozumíte patternu. Předčasná abstrakce může škodit víc než trocha duplicity.

Související pojmy