Copy-Paste programmering

Copy-paste- programmering , C&P-programmering eller copy- paste i programmering  er processen med at skabe programkode med hyppigt gentagne dele produceret ved copy-paste- operationer ( engelsk  copy-paste ) [1] [2] . Udtrykket bruges normalt i en nedsættende betydning for at henvise til utilstrækkelige computerprogrammeringsfærdigheder eller manglen på et udtryksfuldt udviklingsmiljø, hvor plug-in-biblioteker typisk kan bruges.

Copy-paste programmering er et almindeligt anti -mønster , der resulterer i duplikeret kode, normalt stor og svær at læse. Gentagne kodestykker udbreder en fejl lavet i den originale kode, og flere gentagelser gør det sværere at rette denne fejl i kopier [1] [3] .

Der er tilfælde , hvor copy-paste i programmering kan være acceptabelt eller nødvendigt: skabeloner, sløjfeafvikling (når der ikke er nogen automatisk understøttelse af compileren), og også i tilfælde af anvendelse af nogle programmeringsparadigmer eller i tilfælde af kildekodeunderstøttelse i form af uddrag af redaktører .

Plagiat

Copy-paste bruges ofte af uerfarne eller uerfarne programmører, der har svært ved at skrive kode fra bunden og foretrækker at lede efter tidligere skrevne løsninger eller delløsninger, der kan bruges som grundlag for at løse deres problem [4] .

Programmører, der ofte kopierer en andens kode, forstår ofte ikke en del af eller det hele. Som sådan opstår problemet mere fra deres uerfarenhed og mangel på vedholdenhed end fra selve kopieringen. Den kopierede kode er ofte taget fra venner, kolleger, internetfora , undervisere eller programmeringsbøger . Resultatet risikerer at være et usammenhængende stilsæt og kan indeholde redundant kode, der løser problemer, der ikke længere eksisterer.

Der er en vis forskel mellem copy-paste- programmering og cargo-cult-programmering . Den første type forstås mere som selve kendsgerningen med multiple duplikering af dele af programkoden [5] , den anden type kan betyde både kopiering af koden for at løse problemet, udført fra programmet eller eksterne kilder og uden at forstå skemaet af koden, og kopiering af dele af koden uden behov [5] [6] .

Et yderligere problem er, at fejl også bare kan inkluderes i den kopierede kode. Designteknikker, der bruges i forskellige kildekoder, er muligvis ikke acceptable, når de kombineres i et nyt miljø.

En sådan kode kan også utilsigtet blive sløret , da navnene på variabler, klasser, funktioner osv. efter kopiering normalt forbliver uændrede, selvom deres formål er helt anderledes i den nye kontekst [4] .

Duplikering

Som en form for kodeduplikering har C&P-programmering nogle problemer, der bliver værre, hvis koden ikke bevarer et semantisk forhold mellem originalen og kopien. I dette tilfælde, hvis ændringer er påkrævet, så er tiden spildt på at lede efter alle de duplikerede dele. Denne proces kan delvist accelereres med velkommenteret kode, men eliminerer stadig ikke behovet for flere redigeringer. Da kodevedligeholdelse ofte udelader opdatering af kommentarer [7] , er kommentarer, der beskriver, hvor man kan finde duplikerede dele af kode, notorisk forældede.

Eric Allen bruger i sin bog Common Design Mistakes udtrykket "falsk fliselægning" til at henvise til fejl forårsaget af kopiering af et stykke software. At udtrække et gentaget fragment i en metode (hovedopskriften på at slippe af med sådanne problemer) kan være en ikke-triviel opgave [8] .

Brug af biblioteker

Copy-paste programmering bruges også ofte af erfarne programmører, som har biblioteker af velafprøvede og brugsklare uddrag og generelle algoritmer, der er skræddersyet til specifikke opgaver [2] .

I stedet for at skabe flere modificerede kopier af en generisk algoritme, foreslår den objektorienterede tilgang at abstrahere algoritmen til en indkapslet klasse, der kan genbruges. En sådan klasse er skabt på en fleksibel måde med fuld understøttelse af nedarvning og overbelastning , hvilket gør det muligt for den kaldende kode at interagere med én generisk kode i stedet for med flere eller mange modificerede [9] . Efterhånden som den nødvendige funktionalitet udvides, vokser biblioteket også i størrelse (samtidig med bagudkompatibilitet ). Så hvis en fejl er rettet i den originale algoritme, vinder al software, der bruger denne algoritme og bibliotek.

Forgrening

Forgrening er en normal proces i softwareudvikling i store teams. Det giver mulighed for parallel udvikling på grene og forkorter derfor udviklingscyklusser. Klassisk forgrening har følgende funktioner:

Copy-paste-programmering er et mindre formelt alternativ til klassisk branching, der ofte bruges, når grene forventes at divergere (kodeforskellen i grenene vil stige) mere og mere over tid, som i tilfældet med at udskille et nyt softwareprodukt fra en eksisterende.

Som en måde at isolere et nyt produkt på, har copy-paste nogle fordele. Da udviklingen af ​​et nyt produkt ikke ændrer et eksisterende:

Fejl:

Et andet alternativ til C&P-tilgangen er den modulære tilgang :

Tilbagevendende opgaver eller opgavevariationer

En af de mest skadelige former for C&P-programmering er duplikeret kode , der udfører en gentagen opgave eller en variation af hovedopgaven, afhængigt af en variabel. Hver kopi kopierer den tidligere oprettede med mindre ændringer. Kaldet effekter:

Bevidst valg af tilgang

Copy-paste i programmering accepteres nogle gange som en normal programmeringsteknik. Du kan normalt se dette i mønstre som f.eks. at erklære en klasse, inklusive standardbiblioteker, eller bruge en eksisterende kodeskabelon (med tomt indhold eller stubfunktioner ) som grundlag for udfyldning.

Brugen af ​​programmeringssprog og designmønstre ligner copy-paste-tilgangen, idet de også bruger boilerplate-kode. I nogle tilfælde kan dette udtrykkes som et fragment , der indsættes i koden efter behov, selvom det ofte blot "kaldes" fra programmørens sind. I andre tilfælde kan brugen af ​​idiomer ikke reduceres til boilerplate-kode. I de fleste tilfælde, men selvom formsproget kan reduceres til kode, vil det enten være for langt (hvilket vil blive ekstraheret til en funktion) eller for kort (så det kan skrives direkte).

Eksempel

Et simpelt eksempel på en gyldig anvendelse af tilgangen ville være en for-løkke, som kunne se ud . Et eksempel på kode, der bruger en sådan sløjfe ville være: for (int i=0; i!=n; ++i) {}

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

Koden til løkken kan genereres af følgende uddrag (der definerer typer og variabelnavne):

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

Mange programmører bruger ofte tilgangen, fordi de ikke ønsker at omskrive en linje, der adskiller sig fra den foregående med kun et par tegn (for eksempel kalder den samme funktion for to objekter af samme type, hvis navne er lidt forskellige). Dupliker den forrige linje (også ved hjælp af tastaturgenveje) er hurtigere end at omskrive den igen. Men sandsynligheden for at lave en fejl falder ikke [14] , især for den sidste linje [15] .

Hvis du skal lave mere end én redigering af den duplikerede linje, opstår der oftere fejl. Som du kan se fra eksemplet, korrigerede forfatteren efter duplikering den tildelte værdi, men korrigerede ikke array-indekset i venstre side:

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

Der er en undersøgelse [16] rettet mod "afkriminalisering" af copy-paste programmering - Undertekst programmeringssprog . Det skal bemærkes, at i denne model er copy-paste den primære interaktionsmodel og betragtes derfor ikke som et anti-mønster.

Se også

Noter

  1. 1 2 Etnografisk undersøgelse af kopiering og indsæt .
  2. 1 2 Værktøj til sporing af kopier-og-indsæt kode .
  3. Undersøgelse om Software Clone Detection .
  4. 12 Genbesøg fejl i begynderprogrammeringsprogrammer .
  5. 12 Integration af antimønstre .
  6. Cargo Cults in Java .
  7. Opbygning af ASP.NET .
  8. Typiske designfejl, 2003 .
  9. Principper for objektorienteret programmering .
  10. Genbrug af kode i OO-udvikling .
  11. Fordelene ved kodningsstandarder .
  12. CS 106X .
  13. Perfect Code, 2005 .
  14. Karpov, 2011 .
  15. Karpov, 2014 .
  16. Undertekst .

Litteratur