Programare Copy-Paste

Programarea copy-paste , programarea C&P sau copy- paste în programare  este procesul de creare a codului de program cu părți repetate frecvent produse prin operațiuni de copiere-lipire ( copy-paste în engleză  ) [1] [2] . Termenul este de obicei folosit într-un sens peiorativ pentru a se referi la abilități insuficiente de programare pe computer sau la lipsa unui mediu de dezvoltare expresiv în care bibliotecile plug-in pot fi utilizate de obicei.

Programarea copiere-lipire este un anti -model comun care are ca rezultat codul duplicat, de obicei mare și greu de citit. Fragmentele de cod repetate propagă o eroare făcută în codul original, iar repetările multiple fac mai dificilă remedierea acestei erori în copii [1] [3] .

Există cazuri când copy-paste în programare poate fi acceptabil sau necesar: ​​șabloane, derularea buclei (când nu există suport automat de către compilator), precum și în cazul aplicării unor paradigme de programare sau în cazul suport pentru codul sursă sub formă de fragmente de către editori .

Plagiat

Copy-paste este adesea folosit de programatorii neexperimentați sau începători, cărora le este greu să scrie cod de la zero și preferă să caute soluții scrise anterior sau soluții parțiale care să poată fi folosite ca bază pentru rezolvarea problemei lor [4] .

Programatorii care copiază adesea codul altcuiva nu înțeleg adesea o parte sau tot. Ca atare, problema apare mai mult din lipsa de experiență și lipsa de persistență a acestora decât din însuși faptul de a copia. Codul copiat este adesea preluat de la prieteni, colegi, forumuri de internet , educatori sau cărți de programare . Rezultatul riscă să fie un set de stiluri disjuns și poate conține cod redundant care rezolvă probleme care nu mai există.

Există o diferență între programarea copy-paste și programarea cargo-cult . Primul tip este înțeles mai mult ca însuși faptul dublării multiple a părților codului programului [5] , al doilea tip poate însemna atât copierea codului pentru rezolvarea problemei, efectuată din program sau surse externe, cât și fără înțelegerea schemei. a codului și copierea unor părți ale codului fără a fi nevoie [5] [6] .

O problemă suplimentară este că erorile pot fi incluse doar împreună cu codul copiat. Tehnicile de proiectare utilizate în diferite coduri sursă pot să nu fie acceptabile atunci când sunt combinate într-un mediu nou.

Un astfel de cod poate, de asemenea, să devină obscurcat din neatenție , deoarece numele variabilelor, claselor, funcțiilor etc., după copiere, rămân de obicei neschimbate, chiar dacă scopul lor este complet diferit în noul context [4] .

Duplicare

Ca formă de duplicare a codului , programarea C&P are unele probleme care se agravează dacă codul nu păstrează nicio relație semantică între original și copie. În acest caz, dacă sunt necesare modificări, atunci se pierde timpul căutând toate piesele duplicat. Acest proces poate fi parțial accelerat cu un cod bine comentat, dar totuși nu elimină necesitatea mai multor editări. Deoarece întreținerea codului omite adesea comentariile de actualizare [7] , comentariile care descriu unde să găsești părți duplicate ale codului sunt notoriu depășite.

Eric Allen, în cartea sa Common Design Mistakes, folosește termenul „false tiling” pentru a se referi la erorile cauzate de copierea unei piese de software. Extragerea unui fragment care se repetă într-o metodă (principalul „rețetă” pentru a scăpa de astfel de probleme) poate fi o sarcină non-trivială [8] .

Utilizarea bibliotecilor

Programarea copiere-lipire este adesea folosită de programatori cu experiență care au biblioteci de fragmente bine testate și gata de utilizare și algoritmi generali care sunt adaptați unor sarcini specifice [2] .

În loc să creeze mai multe copii modificate ale unui algoritm generic, abordarea orientată pe obiect sugerează abstracția algoritmului într-o clasă încapsulată care poate fi reutilizată. O astfel de clasă este creată într-un mod flexibil, cu suport complet pentru moștenire și supraîncărcare , ceea ce permite codului apelant să interacționeze cu un cod generic mai degrabă decât cu mai multe sau mai multe coduri modificate [9] . Pe măsură ce funcționalitatea necesară se extinde, biblioteca crește, de asemenea, în dimensiune (în același timp menținând compatibilitatea cu versiunea inversă ). Deci, dacă o eroare este remediată în algoritmul original, atunci toate programele care utilizează acest algoritm și bibliotecă câștigă.

Branching

Branching -ul este un proces normal în dezvoltarea de software în echipe mari. Permite dezvoltarea paralelă pe ramuri și, prin urmare, scurtează ciclurile de dezvoltare. Ramificarea clasică are următoarele caracteristici:

Programarea prin copiere și lipire este o alternativă mai puțin formală la ramificarea clasică, folosită adesea atunci când se așteaptă ca ramurile să diverge (diferența de cod între ramuri va crește) din ce în ce mai mult în timp, ca în cazul derulării unui nou produs software dintr-un unul existent.

Ca modalitate de a izola un produs nou, copy-paste are unele avantaje. Deoarece dezvoltarea unui nou produs nu schimbă unul existent:

Defecte:

O altă alternativă la abordarea C&P este abordarea modulară :

Sarcini recurente sau variații ale sarcinii

Una dintre cele mai dăunătoare forme de programare C&P este codul duplicat care efectuează o sarcină repetitivă sau o variație a sarcinii principale, în funcție de o variabilă. Fiecare copie o copie pe cea creată anterior cu modificări minore. Efecte numite:

Alegerea deliberată a abordării

Copy-paste în programare este uneori acceptat ca o tehnică normală de programare. De obicei, puteți vedea acest lucru în modele, cum ar fi declararea unei clase, inclusiv biblioteci standard, sau utilizarea unui șablon de cod existent (cu conținut gol sau funcții stub ) ca bază pentru umplutură.

Utilizarea modalităților de programare și a modelelor de proiectare este similară cu abordarea copy-paste prin faptul că folosesc și codul standard. În unele cazuri, acest lucru poate fi exprimat ca un fragment care este inserat în cod la cerere, deși adesea este pur și simplu „chemat” din mintea programatorului. În alte cazuri, utilizarea idiomurilor nu poate fi redusă la un cod standard. În cele mai multe cazuri însă, chiar dacă expresia poate fi redusă la cod, va fi fie prea lung (care va fi extras într-o funcție) fie prea scurt (astfel încât să poată fi tastat direct).

Exemplu

Un exemplu simplu de aplicare validă a abordării ar fi o buclă for, care ar putea arăta ca . Un exemplu de cod care utilizează o astfel de buclă ar fi: for (int i=0; i!=n; ++i) {}

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

Codul pentru buclă poate fi generat de următorul fragment (definirea tipurilor și a numelor de variabile):

for ( $tip $loop_var = 0 ; $loop_var != $stop ; ++ $loop_var ) { }

Mulți programatori folosesc adesea abordarea pentru că nu doresc să rescrie o linie care diferă de cea anterioară doar prin câteva caractere (de exemplu, apelarea aceleiași funcții pentru două obiecte de același tip, ale căror nume diferă ușor). Dublarea liniei anterioare (folosind și comenzile rapide de la tastatură) este mai rapidă decât rescrierea din nou. Dar probabilitatea de a greși nu scade [14] , mai ales pentru ultima linie [15] .

Dacă trebuie să faceți mai multe modificări la linia duplicată, erorile apar mai des. După cum puteți vedea din exemplu, după duplicare, autorul a corectat valoarea atribuită, dar nu a corectat indexul matricei din partea stângă:

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

Există un studiu [16] care vizează „decriminalizarea” programării copy-paste – Limbajul de programare subtext . Trebuie remarcat faptul că în acest model, copy-paste este principalul model de interacțiune și, prin urmare, nu este considerat ca un anti-pattern.

Vezi și

Note

  1. 1 2 Studiu etnografic de copiere și lipire .
  2. 1 2 Instrument pentru urmărirea codului de copiere și inserare .
  3. Sondaj privind detectarea clonelor software .
  4. 12 Revizuirea erorilor programatorilor începători .
  5. 12 Integrarea antipatterns .
  6. Cultele de marfă în Java .
  7. Construirea ASP.NET .
  8. Typical Design Mistakes, 2003 .
  9. Principiile programării orientate pe obiecte .
  10. Reutilizarea codului în dezvoltarea OO .
  11. Beneficiile standardelor de codare .
  12. CS 106X .
  13. Cod perfect, 2005 .
  14. Karpov, 2011 .
  15. Karpov, 2014 .
  16. Subtext .

Literatură