Copy-paste programování , C&P programování nebo copy- paste v programování je proces vytváření programového kódu s často opakovanými částmi produkovanými operacemi copy-paste ( anglicky copy-paste ) [1] [2] . Termín se obvykle používá v pejorativním smyslu k označení nedostatečných počítačových programovacích dovedností nebo nedostatku expresivního vývojového prostředí, ve kterém lze typicky používat zásuvné knihovny.
Programování kopírování a vkládání je běžný anti -vzor, jehož výsledkem je duplicitní kód, obvykle velký a těžko čitelný. Opakované úryvky kódu šíří chybu v původním kódu a vícenásobné opakování ztěžuje opravu této chyby v kopiích [1] [3] .
Existují případy , kdy copy-paste v programování může být přijatelné nebo nezbytné: šablony, odvíjení smyčky (když neexistuje automatická podpora ze strany kompilátoru), a také v případě použití některých programovacích paradigmat nebo v případě podpora zdrojového kódu ve formě úryvků ze strany editorů .
Copy-paste často používají nezkušení nebo začínající programátoři, pro které je obtížné napsat kód od nuly a raději hledají dříve napsaná řešení nebo dílčí řešení, která mohou sloužit jako základ pro řešení jejich problému [4] .
Programátoři, kteří často kopírují kód někoho jiného, často nerozumí jeho části nebo celému. Problém jako takový vyplývá spíše z jejich nezkušenosti a nedostatku vytrvalosti než ze samotného faktu kopírování. Zkopírovaný kód je často převzat od přátel, kolegů, internetových fór , pedagogů nebo knih o programování . Výsledkem je riziko, že jde o nesouvislou sadu stylů a může obsahovat redundantní kód, který řeší problémy, které již neexistují.
Existuje určitý rozdíl mezi programováním copy-paste a programováním cargo-cult . První typ je spíše chápán jako samotný fakt vícenásobné duplikace částí programového kódu [5] , druhý typ může znamenat jak zkopírování kódu pro vyřešení problému, prováděné z programu nebo externích zdrojů, tak bez pochopení schématu. kódu, a kopírování částí kódu bez nutnosti [5] [ 6] .
Dalším problémem je, že chyby mohou být také zahrnuty do zkopírovaného kódu. Techniky návrhu používané v různých zdrojových kódech nemusí být přijatelné, pokud jsou kombinovány v novém prostředí.
Takový kód se také může nechtěně zamlžovat , protože názvy proměnných, tříd, funkcí atd. po zkopírování obvykle zůstanou nezměněny, i když je jejich účel v novém kontextu zcela odlišný [4] .
Jako forma duplikace kódu má programování C&P určité problémy, které se zhorší, pokud si kód nezachová žádný sémantický vztah mezi originálem a kopií. V tomto případě, pokud jsou nutné změny, je ztracen čas hledáním všech duplicitních částí. Tento proces lze částečně urychlit dobře okomentovaným kódem, ale přesto neodstraňuje nutnost několika úprav. Protože údržba kódu často vynechává aktualizace komentářů [7] , komentáře popisující, kde najít duplicitní části kódu, jsou notoricky zastaralé.
Eric Allen ve své knize Common Design Mistakes používá termín „falešné dlaždice“ k označení chyb způsobených zkopírováním části softwaru. Extrahování opakujícího se fragmentu do metody (hlavní „recept“ na zbavení se takových problémů) může být netriviální úkol [8] .
Programování kopírováním a vkládáním také často používají zkušení programátoři, kteří mají knihovny dobře otestovaných a připravených úryvků a obecných algoritmů, které jsou přizpůsobeny konkrétním úkolům [2] .
Namísto vytváření více modifikovaných kopií generického algoritmu, objektově orientovaný přístup navrhuje abstrahovat algoritmus do zapouzdřené třídy, kterou lze znovu použít. Taková třída je vytvořena flexibilním způsobem, s plnou podporou dědičnosti a přetížení , což umožňuje volajícímu kódu interagovat s jedním generickým kódem spíše než s několika nebo mnoha modifikovanými [9] . S rozšiřováním požadované funkčnosti roste i velikost knihovny (při zachování zpětné kompatibility ). Pokud je tedy chyba opravena v původním algoritmu, vyhrává veškerý software, který tento algoritmus a knihovnu používá.
Větvení je normální proces při vývoji softwaru ve velkých týmech. Umožňuje paralelní vývoj na větvích a tím zkracuje vývojové cykly. Klasické větvení má následující vlastnosti:
Programování kopírováním a vkládáním je méně formální alternativa ke klasickému větvení, která se často používá, když se očekává, že se větve budou v průběhu času rozcházet (rozdíl v kódech ve větvích se bude zvětšovat), jako v případě odštěpení nového softwarového produktu od stávající.
Jako způsob, jak izolovat nový produkt, má copy-paste určité výhody. Protože vývoj nového produktu nemění stávající:
nedostatky:
Další alternativou k přístupu C&P je modulární přístup :
Jednou z nejškodlivějších forem programování C&P je duplicitní kód , který provádí opakující se úkol nebo obměnu hlavního úkolu v závislosti na nějaké proměnné. Každá kopie kopíruje dříve vytvořenou s malými změnami. Nazývané efekty:
Copy-paste v programování je někdy přijímáno jako normální programovací technika. Obvykle to můžete vidět ve vzorech, jako je deklarace třídy, včetně standardních knihoven, nebo použití existující šablony kódu (s prázdným obsahem nebo funkcemi stub ) jako základ pro výplň.
Použití programovacích idiomů a návrhových vzorů je podobné přístupu kopírování a vkládání v tom, že také používají standardní kód. V některých případech to může být vyjádřeno jako fragment , který je vložen do kódu na požádání, i když často je jednoduše „vyvolán“ z mysli programátora. V ostatních případech nelze použití idiomů omezit na standardní kód. Ve většině případů však, i když lze idiom zredukovat na kód, bude buď příliš dlouhý (což bude extrahováno do funkce), nebo příliš krátký (takže jej lze zadat přímo).
Jednoduchým příkladem platné aplikace tohoto přístupu by byla smyčka for, která by mohla vypadat jako . Příklad kódu používajícího takovou smyčku by byl: for (int i=0; i!=n; ++i) {}
void foo ( int n ) { for ( int i = 0 ; i != n ; ++ i ) { } }Kód pro smyčku lze vygenerovat následujícím fragmentem (definujícím typy a názvy proměnných):
for ( $type $loop_var = 0 ; $loop_var != $stop ; ++ $loop_var ) { }Mnoho programátorů tento přístup často používá, protože nechtějí přepisovat řádek, který se od předchozího liší jen o pár znaků (například volání stejné funkce pro dva objekty stejného typu, jejichž názvy se mírně liší). Duplikovat předchozí řádek (také pomocí klávesových zkratek) je rychlejší než jej znovu přepisovat. Ale pravděpodobnost, že uděláte chybu, neklesá [14] , zvláště u posledního řádku [15] .
Pokud potřebujete provést více než jednu úpravu duplicitního řádku, chyby se vyskytují častěji. Jak můžete vidět z příkladu, po duplikaci autor opravil přiřazenou hodnotu, ale neopravil index pole na levé straně:
mArray [ 12 ] = "a" ; mArray [ 13 ] = "b" ; mArray [ 14 ] = "c" ; mArray [ 14 ] = "d" ;Existuje studie [16] zaměřená na "dekriminalizaci" programování copy-paste - Subtext programming language . Je třeba poznamenat, že v tomto modelu je kopírování a vkládání hlavním modelem interakce, a proto se nepovažuje za anti-vzor.