Copy-and-paste programming

Copy-and-paste programming může kvůli nadbytečné složitosti způsobit potíže s údržbou, čitelností, či se systémovými zdroji

Copy-and-paste programming, což by se dalo volně přeložit jako programování metodou „zkopíruj a vlož“, je druh programování, který se označuje jako antivzor. Je to vytváření kódu, při němž ve velké míře dochází k opakování určitých pasáží. To je způsobeno stylem psaní kódu, kde se nadužívá možnosti zkopírovat a vložit. Primárně se tento pojem používá pejorativně; ti, kteří tento pojem používají, jím naznačují, že programátorovy schopnosti jsou na nízké úrovni. Může to být ale i důsledek omezení dostupnými technologiemi. Naopak existují případy, kdy se považuje jeho použití za přijatelné nebo dokonce nutné. Například, když je třeba při programování použít na více místech stejný kód (nebo jen málo odlišný).

Původ

Stylem zkopíruj-a-vlož často píší své programy nezkušení programátoři nebo studenti. Pro ty je psaní vlastního kódu z hlavy příliš složité nebo otravné. Využívají proto možnosti, které nabízí internet a hledají tam už hotová řešení, které zkopírují a podle potřeby upraví. Nezkušení programátoři, kteří kód kopírují, ale kódu často úplně nerozumí a nevědí, jak funguje. Proto mívají problém s jeho laděním a úpravami. Navíc se v kódu často vyskytují nevyužité řádky kódu. Ty bývají reliktem z původního programu.

Navíc kód pochází z různorodých zdrojů jako jsou kamarádi, spolužáci, kolegové nebo internetová fóra, učebnice programování a různé návody a články. Takový poskládaný kód je nesouvislý, obsahuje mnoho různých stylů programování a nerelevantního kódu.

Takový kód může být také neúmyslně nesrozumitelný. Například názvy proměnných nebo metod – programátor, který zkopíruje kód pro svůj program odjinud, s velkou pravděpodobností nechá názvy proměnných a metod s původním názvem, i když v jeho programu mohou vykonávat úplně odlišnou práci. Člověk čtoucí takový kód má pak velký problém porozumět, k čemu daná proměnná nebo metoda slouží. A nejenom další osoba, ale i samotný tvůrce si už po pár dnech nevzpomene.

Duplikace

Aplikování knihovního kódu

Zkopíruj-a-vlož je prováděn nejen nezkušenými programátory, nýbrž i zkušenými, kteří ale nekopírují cizí kód. Zkušení programátoři používají svůj vlastní kód, který mají dobře otestovaný a rozumí mu. Ten, aby ho nemuseli pořád psát dokola, zkopírují z nějakého svého úložiště a použijí jej. Dalším příkladem je použití pro generické algoritmy, které se snadno upravují pro konkrétní úlohu.

Zkopíruj-a-vlož programování může být jistou formou duplicity kódu. Pokud kopírujeme kód z jedné části aplikace do jiných částí, tak se tento kód zbytečně duplikuje. Z podstaty tohoto stylu vyplývá několik problémů. Například když si kód nedrží žádné sémantické propojení mezi zdrojovým textem a jeho kopiemi. V tomto případě, když budou požadovány nějaké změny, strávíme zbytečně velké množství času hledáním všech kopií upravovaného kódu. (Důsledky této chyby se nechají zmírnit řádným okomentování zdrojového kódu, tak i jeho kopií. Avšak nám zůstává nutnost projít všechny výskyty a ručně je opravit. Při úpravách kódu se často vynechává aktualizace komentářů. Komentáře popisující, kde najít další výskyt tohoto kódu jsou notoricky známé pro svoji častou neaktuálnost.)

Příznivci objektově orientovaných metodologií dále odmítají používání zkopíruj-a-vlož při kopírování z vlastních "knihoven kódu", což jsou úseky kódu, které má programátor někde uloženy, aby nemusel stále dokola vymýšlet, co už jednou vymyslel. Namísto vytváření množství mutací kopírovaného generického algoritmu, se v objektově orientovaném přístupu doporučuje zobecnit algoritmus do znovupoužitelné zapouzdřené třídy. Třída je napsána flexibilně s plnou podporou dědění a přetěžování, takže se tento generický kód může volat napřímo, raději než mutaci originálního kódu. V případě, že je požadovaná další funkcionalita, tak se pouze rozšíří knihovna, zatímco zůstane zpětná kompatibilita. Když se v původním kódu objeví chyba, nebo dojde k vylepšení, tak všechen kód co volá tuto knihovnu, bude ovlivněn bez toho, aby se muselo upravovat všechny jeho výskyty.

Větvení

Větvení je běžnou součástí vývoje ve velkých týmech. Umožňuje paralelní vývoj na všech větvích a pomáhá ke zkrácení vývojového cyklu. Klasické větvení při vývoji má následující znaky:

  • Je řízeno a organizováno pomocí verzovacího systému umožňující paralelní vývoj
  • Po dokončení vývoje se paralelní větve sloučí dohromady

Zkopíruj-a-vlož by se dalo označit i jako jednodušší způsob klasického větvení, když předpokládáme, že se větve budou v průběhu času více a více rozcházet a vznikne tak nový odvozený produkt.

Jako způsob odvození nového produktu má zkopíruj-a-vlož několik výhod. Díky tomu, že se nový vývoj nedotkne už existujícího kódu tak:

  • U produktu nejsou nutné regresní testy, takže se ušetří na QA potřebném pro uvedení na trh. Tím se sníží doba od vývoje až po samotný prodej produktu.
  • Není tu riziko zavedených chyb v existujícím produktu, které by mohli rozzlobit uživatele, kteří mají produkt nainstalovaný

Nevýhody:

  • Pokud se nový produkt nebude od původního odlišovat, jako se očekávalo, tak zde budou dva podobné kódy, které musejí být podporované (to znamená dvojnásobné náklady), místo aby byl jenom jeden. To může vést k drahému refaktoringu a ručnímu slučování změn.
  • Zdvojený kód zdvojnásobí čas potřebný k potřebný k implementaci změn, které mohou být požadovány pro oba produkty. To zvýší čas nutný pro jejich zavedení a hlavně můžeme rovnou přijít o všechen čas ušetřený díky rozvětvení kódu.

Alternativou pro přístup zkopíruj-a-vlož může být přístup využívající moduly:

  • na začátku se refaktoruje kód pro použití v knihovnách, které pak využijí oba produkty
  • namísto zkopírování původního kódu se použijí tyto knihovny jako základ pro vývoj nového produktu,
  • při vývoji dalších verzí je díky použití společných knihoven dramaticky zkrácený cyklus vývoje.

Různé varianty nebo opakující se úlohy

Jeden z nejhorších projevů zkopíruj-a-vlož programování lze nalézt u kódu, který vykonává buď opakující se úlohy, nebo různé varianty téhož kódu lišící se v některých proměnných. Každá instance je pak zkopírována ze svého předchůdce a zase vložena s malou úpravou. Mezi negativní efekty patří:

  • Zkopíruj-a-vlož vede k příliš velkým metodám,[ujasnit]
  • s každým případem se vytvoří kopie kódu se všemi jeho problémy. Oprava chyb je pak velmi obtížná a nákladná.
  • takový kód je obtížně čitelný pro člověka, je obtížné poznat, v čem se jednotlivé případy liší. To má přímý dopad na rizika a náklady na revize kódu,
  • pro opakující se úlohy se v modelu procedurálního programování silně odrazuje od používání zkopíruj-a-vlož. Pro opakující se úlohy se v procedurálním programování preferuje přístup využití funkce nebo podprogramu, který nahradí kopii modifikovaného bloku.

Metoda zkopíruj-a-vlož porušuje tzv. DRY principle ("Don't repeat yourself"), což je v překladu "Neopakuj se".

Reference

V tomto článku byl použit překlad textu z článku Copy and paste programming na anglické Wikipedii.

Média použitá na této stránce

Forgotten edits in copypaste programming.gif
Autor: Atroshko, Licence: CC0
Forgotten edits — one of the most common and annoying problems in copy-paste programming