Kopiera-klistra in programmering

Copy-paste- programmering , C&P-programmering eller copy- paste i programmering  är processen att skapa programkod med ofta upprepade delar som produceras av copy-paste- operationer ( engelska  copy-paste ) [1] [2] . Termen används vanligtvis i en nedsättande mening för att hänvisa till otillräckliga datorprogrammeringskunskaper eller avsaknaden av en uttrycksfull utvecklingsmiljö där plugin-bibliotek vanligtvis kan användas.

Copy-paste-programmering är ett vanligt anti -mönster som resulterar i duplicerad kod, vanligtvis stor och svår att läsa. Upprepade kodavsnitt sprider ett fel som gjorts i den ursprungliga koden, och flera upprepningar gör det svårare att fixa detta fel i kopior [1] [3] .

Det finns fall när copy-paste i programmering kan vara acceptabelt eller nödvändigt: mallar, loopavveckling (när det inte finns något automatiskt stöd av kompilatorn), och även i fallet med tillämpning av vissa programmeringsparadigm eller i fallet med källkodsstöd i form av utdrag av redaktörer .

Plagiat

Copy-paste används ofta av oerfarna eller nybörjare programmerare som har svårt att skriva kod från grunden och föredrar att leta efter tidigare skrivna lösningar eller dellösningar som kan användas som grund för att lösa deras problem [4] .

Programmerare som ofta kopierar någon annans kod förstår ofta inte en del eller hela den. Som sådant härrör problemet mer från deras oerfarenhet och bristande uthållighet än från själva kopieringen. Den kopierade koden är ofta hämtad från vänner, kollegor, internetforum , pedagoger eller programmeringsböcker . Resultatet riskerar att vara en osammanhängande stiluppsättning och kan innehålla redundant kod som löser problem som inte längre finns.

Det finns en viss skillnad mellan copy-paste- programmering och cargo-cult-programmering . Den första typen förstås mer som själva faktumet av multipla duplicering av delar av programkoden [5] , den andra typen kan innebära både kopiering av koden för att lösa problemet, utförd från programmet eller externa källor och utan att förstå schemat av koden, och kopiering av delar av koden utan behov [5] [ 6] .

Ett ytterligare problem är att buggar också bara kan inkluderas med den kopierade koden. Designtekniker som används i olika källkoder är kanske inte acceptabla när de kombineras i en ny miljö.

Sådan kod kan också oavsiktligt fördunklas , eftersom namnen på variabler, klasser, funktioner etc. efter kopiering vanligtvis förblir oförändrade, även om deras syfte är helt annorlunda i det nya sammanhanget [4] .

Duplicering

Som en form av kodduplicering har C&P-programmering vissa problem som blir värre om koden inte har något semantiskt förhållande mellan originalet och kopian. I det här fallet, om ändringar krävs, slösas tid bort på att leta efter alla dubbletter. Denna process kan delvis accelereras med välkommenterad kod, men eliminerar ändå inte behovet av flera redigeringar. Eftersom kodunderhåll ofta utelämnar uppdatering av kommentarer [7] är kommentarer som beskriver var man kan hitta dubbletter av kod notoriskt föråldrade.

Eric Allen, i sin bok Common Design Mistakes, använder termen "falsk tiling" för att hänvisa till fel som orsakas av kopiering av en mjukvara. Att extrahera ett upprepande fragment till en metod (huvudreceptet för att bli av med sådana problem) kan vara en icke-trivial uppgift [8] .

Använda bibliotek

Copy-paste-programmering används också ofta av erfarna programmerare som har bibliotek med väl beprövade och färdiga att använda utdrag och allmänna algoritmer som är skräddarsydda för specifika uppgifter [2] .

Istället för att skapa flera modifierade kopior av en generisk algoritm, föreslår den objektorienterade metoden att abstrahera algoritmen till en inkapslad klass som kan återanvändas. En sådan klass skapas på ett flexibelt sätt, med fullt stöd för arv och överbelastning , vilket gör att den anropande koden kan interagera med en generisk kod snarare än med flera eller många modifierade [9] . När den nödvändiga funktionaliteten utökas, växer biblioteket också i storlek (med bibehållen bakåtkompatibilitet ). Så, om en bugg fixas i den ursprungliga algoritmen, vinner all programvara som använder denna algoritm och bibliotek.

Förgrening

Förgrening är en normal process vid mjukvaruutveckling i stora team. Det möjliggör parallell utveckling på grenar och förkortar därför utvecklingscyklerna. Klassisk förgrening har följande funktioner:

Copy-paste-programmering är ett mindre formellt alternativ till klassisk förgrening, som ofta används när grenar förväntas divergera (kodskillnaden i grenarna kommer att öka) mer och mer över tiden, som vid spinning av en ny mjukvaruprodukt från en befintliga.

Som ett sätt att isolera en ny produkt har copy-paste vissa fördelar. Eftersom utvecklingen av en ny produkt inte förändrar en befintlig:

Brister:

Ett annat alternativ till C&P-metoden är den modulära metoden :

Återkommande uppgifter eller uppgiftsvariationer

En av de mest skadliga formerna av C&P-programmering är duplicerad kod som utför en repetitiv uppgift eller en variant av huvuduppgiften, beroende på någon variabel. Varje kopia kopierar den tidigare skapade med mindre ändringar. Kallade effekter:

Medvetet val av tillvägagångssätt

Copy-paste i programmering accepteras ibland som en normal programmeringsteknik. Du kan vanligtvis se detta i mönster som att deklarera en klass, inklusive standardbibliotek, eller att använda en befintlig kodmall (med tomt innehåll eller stubbfunktioner ) som grund för utfyllnad.

Användningen av programmeringsidiom och designmönster liknar kopierings- och klistrametoden genom att de också använder standardkod. I vissa fall kan detta uttryckas som ett fragment som infogas i koden på begäran, även om det ofta helt enkelt "ropas upp" från programmerarens sinne. I andra fall kan användningen av idiom inte reduceras till standardkod. Men i de flesta fall, även om idiomet kan reduceras till kod, blir det antingen för långt (vilket kommer att extraheras till en funktion) eller för kort (så att det kan skrivas direkt).

Exempel

Ett enkelt exempel på en giltig tillämpning av tillvägagångssättet skulle vara en for-loop, som kan se ut som . Ett exempel på kod som använder en sådan slinga skulle vara: for (int i=0; i!=n; ++i) {}

void foo ( int n ) { för ( int i = 0 ; i != n ; ++ i ) { } }

Koden för slingan kan genereras av följande kodavsnitt (definierar typer och variabelnamn):

för ( $typ $loop_var = 0 ; $loop_var != $stop ; ++ $loop_var ) { }

Många programmerare använder ofta tillvägagångssättet eftersom de inte vill skriva om en rad som skiljer sig från den föregående med bara några få tecken (till exempel anropar samma funktion för två objekt av samma typ, vars namn skiljer sig något). Duplicera föregående rad (även med kortkommandon) är snabbare än att skriva om den igen. Men sannolikheten att göra ett misstag minskar inte [14] , speciellt inte för den sista raden [15] .

Om du behöver göra mer än en redigering av den duplicerade raden uppstår fel oftare. Som du kan se från exemplet, efter duplicering, korrigerade författaren det tilldelade värdet, men korrigerade inte arrayindexet på vänster sida:

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

Det finns en studie [16] som syftar till "avkriminalisering" av kopiera-klistra programmering - Undertext programmeringsspråk . Det bör noteras att i denna modell är copy-paste den huvudsakliga interaktionsmodellen och betraktas därför inte som ett antimönster.

Se även

Anteckningar

  1. 1 2 Etnografisk studie av kopiera och klistra .
  2. 1 2 Verktyg för att spåra kopiera-och-klistra kod .
  3. Enkät om programvara klondetektering .
  4. 12 Återbesöka nybörjarprogrammerarfel .
  5. 12 Integrering av antimönster .
  6. Lastkulter i Java .
  7. Bygga ASP.NET .
  8. Typiska designmisstag, 2003 .
  9. Principer för objektorienterad programmering .
  10. Kodåteranvändning i OO-utveckling .
  11. Fördelarna med kodningsstandarder .
  12. CS 106X .
  13. Perfect Code, 2005 .
  14. Karpov, 2011 .
  15. Karpov, 2014 .
  16. Undertext .

Litteratur