Másolás-beillesztés programozás

A másolás-beillesztés programozás , a C&P programozás vagy másolás-beillesztés a programozásban a gyakran ismétlődő részekből  álló programkód létrehozásának folyamata másolás-beillesztés művelettel ( angol  copy-paste ) [1] [2] . A kifejezést általában pejoratív értelemben használják az elégtelen számítógépes programozási készségekre vagy az expresszív fejlesztői környezet hiányára, amelyben a beépülő modulok jellemzően használhatók.

A másolás-beillesztés programozás egy gyakori anti -minta , amely duplikált kódot eredményez, általában nagy és nehezen olvasható. Az ismétlődő kódrészletek az eredeti kódban elkövetett hibát terjesztik, és a többszöri ismétlés megnehezíti a hiba javítását a másolatokon [1] [3] .

Vannak esetek , amikor a másolás-beillesztés a programozásban elfogadható vagy szükséges lehet: sablonok, hurok feltekercselés (amikor nincs automatikus támogatás a fordítótól), valamint bizonyos programozási paradigmák alkalmazásakor vagy forráskód támogatása a szerkesztők által kivonat formájában .

Plágium

A Copy-paste-t gyakran használják tapasztalatlan vagy kezdő programozók, akiknek nehéz a semmiből kódot írni, és szívesebben keresik a korábban megírt megoldásokat vagy részmegoldásokat, amelyek a problémájuk megoldásának alapjául szolgálhatnak [4] .

Azok a programozók, akik gyakran másolnak valaki más kódját, gyakran nem értik annak egy részét vagy egészét. Mint ilyen, a probléma inkább a tapasztalatlanságukból és a kitartás hiányából fakad, mintsem a másolás tényéből. A kimásolt kód gyakran barátoktól, kollégáktól, internetes fórumoktól , oktatóktól vagy programozási könyvektől származik . Az eredmény fennáll annak a veszélye, hogy szétválasztott stíluskészlet lesz, és redundáns kódot tartalmazhat, amely megoldja a már nem létező problémákat.

Van némi különbség a copy-paste programozás és a cargo-cult programozás között . Az első típus inkább a programkód részeinek többszöri megkettőzésének tényét jelenti [5] , a második típus jelentheti a kód másolását a probléma megoldása érdekében, a programból vagy külső forrásokból, de a séma megértése nélkül. a kódot, és a kód egyes részeit szükség nélkül másoljuk [5] [6] .

További probléma, hogy a hibák is csak belekerülhetnek a másolt kódba. Előfordulhat, hogy a különböző forráskódokban használt tervezési technikák új környezetben kombinálva nem elfogadhatók.

Az ilyen kódok akaratlanul is elhomályosulhatnak , mivel a változók, osztályok, függvények stb. nevei a másolás után általában változatlanok maradnak, még akkor is, ha az új kontextusban teljesen más a céljuk [4] .

Másolás

A kódduplikáció egy formájaként a C&P programozásnak vannak olyan problémái, amelyek súlyosbodnak, ha a kód nem tart meg semmilyen szemantikai kapcsolatot az eredeti és a másolat között. Ebben az esetben, ha változtatásokra van szükség, időt veszítenek az összes ismétlődő alkatrész keresésére. Ez a folyamat részben felgyorsítható jól kommentált kóddal, de mégsem szünteti meg a többszöri szerkesztés szükségességét. Mivel a kódkarbantartás gyakran figyelmen kívül hagyja a megjegyzések frissítését [7] , a kód ismétlődő részeit leíró megjegyzések köztudottan elavultak.

Eric Allen Common Design Mistakes című könyvében a "hamis csempézés" kifejezést használja egy szoftver másolása által okozott hibákra. Egy ismétlődő töredék kinyerése egy metódusba (az ilyen problémák kiküszöbölésének fő "receptje") nem triviális feladat lehet [8] .

A könyvtárak használata

A másolás-beillesztés programozást gyakorlott programozók is gyakran használják, akik jól tesztelt és használatra kész kódrészletek könyvtáraival és általános algoritmusokkal rendelkeznek, amelyek konkrét feladatokra vannak szabva [2] .

Egy általános algoritmus többszöri módosított másolatának létrehozása helyett az objektum-orientált megközelítés azt javasolja , hogy az algoritmust absztraháljuk egy beágyazott osztályba, amely újra felhasználható. Egy ilyen osztályt rugalmasan hozzák létre, teljes mértékben támogatja az öröklődést és a túlterhelést , ami lehetővé teszi, hogy a hívó kód egy általános kóddal kommunikáljon több vagy több módosított kód helyett [9] . Ahogy a szükséges funkcionalitás bővül, a könyvtár mérete is nő (a visszafelé kompatibilitás megőrzése mellett ). Tehát, ha egy hibát javítanak az eredeti algoritmusban, akkor minden szoftver, amely ezt az algoritmust és a könyvtárat használja, nyer.

Elágazás

Az elágazás normális folyamat a nagy csapatok szoftverfejlesztésében. Lehetővé teszi a párhuzamos fejlesztést az ágakon, így lerövidíti a fejlesztési ciklusokat. A klasszikus elágazás a következő tulajdonságokkal rendelkezik:

A másolás-beillesztés programozás a klasszikus elágazás kevésbé formális alternatívája, amelyet gyakran használnak, amikor az ágak várhatóan egyre jobban eltérnek egymástól (az ágakban lévő kódkülönbség nőni fog), mint például egy új szoftvertermék kicsavarása esetén. meglévőt.

Egy új termék elkülönítésének módjaként a másolás-beillesztésnek van néhány előnye. Mivel egy új termék fejlesztése nem változtat a meglévőn:

Hibák:

A C&P megközelítés másik alternatívája a moduláris megközelítés :

Ismétlődő feladatok vagy feladatváltozatok

A C&P programozás egyik legkárosabb formája a megkettőzött kód , amely valamilyen változótól függően egy ismétlődő feladatot vagy a fő feladat egy változatát hajtja végre. Minden másolat a korábban létrehozott példányt másolja kisebb változtatásokkal. Az úgynevezett effektusok:

Szándékos megközelítésválasztás

A másolást a programozásban néha szokásos programozási technikaként fogadják el. Ezt általában olyan mintákban láthatja, mint például egy osztály deklarálása, beleértve a szabványos könyvtárakat, vagy egy meglévő kódsablon használata (üres tartalommal vagy csonkfüggvényekkel ) a kitöltés alapjaként.

A programozási idiómák és tervezési minták használata hasonló a másolás-beillesztés megközelítéshez, mivel ezek is sablonkódot használnak. Egyes esetekben ez egy töredékként is kifejezhető, amelyet kérésre beillesztenek a kódba, bár gyakran egyszerűen a programozó elméjéből "hívják". Más esetekben az idiómák használata nem redukálható kazánkódra. A legtöbb esetben azonban, még ha az idióma kódra redukálható is, vagy túl hosszú (amit egy függvénybe vonnak ki), vagy túl rövid (hogy közvetlenül beírható legyen).

Példa

Egy egyszerű példa a megközelítés érvényes alkalmazására egy for ciklus, amely így nézhet ki . Példa az ilyen ciklust használó kódra: for (int i=0; i!=n; ++i) {}

void foo ( int n ) { for ( int i = 0 ; i != n ; ++ i ) { } }

A ciklus kódja a következő kódrészlettel generálható (típusok és változónevek meghatározása):

for ( $type $hurok_var = 0 ; $hurok_var != $stop ; ++ $hurok_var ) { }

Sok programozó gyakran alkalmazza ezt a megközelítést, mert nem akar átírni egy olyan sort, amely csak néhány karakterrel különbözik az előzőtől (például ugyanazt a függvényt hívja meg két azonos típusú objektumhoz, amelyek neve kissé eltér). Az előző sor megkettőzése (billentyűparancsok használatával is) gyorsabb, mint újraírni. De a hibázás valószínűsége nem csökken [14] , különösen az utolsó sornál [15] .

Ha egynél többször kell szerkesztenie a megkettőzött sort, akkor gyakrabban fordulnak elő hibák. Amint a példából látható, a szerző a sokszorosítás után javította a hozzárendelt értéket, de nem javította a bal oldalon lévő tömbindexet:

mArray [ 12 ] = "a" ; mArray [ 13 ] = "b" ; mArray [ 14 ] = "c" ; mArray [ 14 ] = "d" ;

Van egy tanulmány [16] , amelynek célja a másolás-beillesztés programozás „dekriminalizálása” – Subtext programozási nyelv . Meg kell jegyezni, hogy ebben a modellben a másolás-beillesztés a fő interakciós modell, ezért nem tekinthető antimintának.

Lásd még

Jegyzetek

  1. 1 2 Másolás és beillesztés néprajzi tanulmánya .
  2. 1 2 Eszköz a másolás és beillesztés kód követéséhez .
  3. Felmérés a szoftverklónok észleléséről .
  4. 12 Újralátogatás a kezdő programozók hibáinál .
  5. 12 Antiminták integrálása .
  6. Cargo Cults in Java .
  7. ASP.NET felépítése .
  8. Tipikus tervezési hibák, 2003 .
  9. Az objektum-orientált programozás alapelvei .
  10. Kód újrafelhasználása az OO fejlesztésben .
  11. A kódolási szabványok előnyei .
  12. CS 106X .
  13. Tökéletes kód, 2005 .
  14. Karpov, 2011 .
  15. Karpov, 2014 .
  16. Alszöveg .

Irodalom