Päällekkäinen koodi - Duplicate code

Kahtena koodi on ohjelmointi termi sekvenssin lähdekoodin , joka esiintyy enemmän kuin kerran, joko ohjelman sisällä tai eri ohjelmien omistaa tai ylläpitää sama yksikkö. Koodin kopiota pidetään yleensä ei-toivottuna useista syistä. Vähimmäisvaatimusta sovelletaan yleensä koodimäärään, joka täytyy ilmestyä peräkkäin, jotta sitä voidaan pitää kaksoiskappaleena eikä sattumalta samankaltaisena. Päällekkäisen koodin jaksot tunnetaan joskus koodikloonina tai vain kloonina, automaattista päällekkäisyyksien löytämistä lähdekoodista kutsutaan kloonien havaitsemiseksi.

Kaksi koodisekvenssiä voi olla kaksoiskappaleita toisistaan ​​olematta merkki-merkki-identtisiä, esimerkiksi olemalla merkki-merkki-identtisiä vain, kun välilyöntejä ja kommentteja ei oteta huomioon, tai olemalla tunnuksilta tunnuksille identtisiä tai tunnuksia -merkille sama kuin satunnainen muunnelma. Jopa koodisekvenssejä, jotka ovat vain toiminnallisesti identtisiä, voidaan pitää kaksoiskoodina.

Esiintyminen

Joitakin tapoja, joilla kaksoiskoodi voidaan luoda, ovat:

  • scrounging, jossa osa koodista kopioidaan "koska se toimii". Useimmissa tapauksissa tähän toimintaan liittyy pieniä muutoksia kloonatussa koodissa, kuten muuttujien uudelleennimeäminen tai koodin lisääminen / poistaminen. Kieli sallii melkein aina kutsua yhden kopion koodista eri paikoista, jotta se voi palvella useita tarkoituksia, mutta ohjelmoija luo sen sijaan toisen kopion, ehkä siksi, että

Voi myös tapahtua, että vaaditaan toiminnallisuutta, joka on hyvin samanlainen kuin ohjelman toisessa osassa, ja kehittäjä kirjoittaa itsenäisesti koodin, joka on hyvin samanlainen kuin muualla. Tutkimukset viittaavat siihen, että tällainen itsenäisesti uudelleenkirjoitettu koodi ei tyypillisesti ole syntaktisesti samanlainen.

Automaattisesti luotu koodi, jossa kaksoiskoodin käyttämistä voidaan toivoa nopeuden tai kehityksen helpottamiseksi, on toinen syy kopiointiin. Huomaa, että varsinainen generaattori ei sisällä lähdekoodissaan kaksoiskappaleita, vaan vain sen tuottaman lähdön.

Kiinnitys

Päällekkäinen koodi korjataan yleisimmin siirtämällä koodi omaan yksikköönsä (toimintoon tai moduuliin) ja soittamalla kyseiselle yksikölle kaikista paikoista, joissa sitä alun perin käytettiin. Avoimen lähdekoodin kehitysmallin käyttö, jossa komponentit ovat keskitetyissä paikoissa, voi myös auttaa päällekkäisyydessä.

Kustannukset ja edut

Koodia, joka sisältää päällekkäisiä toimintoja, on vaikeampaa tukea,

  • yksinkertaisesti siksi, että se on pidempi, ja
  • koska jos se tarvitsee päivitystä, on olemassa vaara, että yksi kopio koodista päivitetään tarkistamatta tarkemmin muiden saman koodin esiintymien esiintymistä.

Toisaalta, jos yhtä kopiota koodista käytetään eri tarkoituksiin eikä sitä ole dokumentoitu asianmukaisesti, on olemassa vaara, että sitä päivitetään yhtä tarkoitusta varten, mutta tätä päivitystä ei vaadita eikä se sovellu muuhun. tarkoituksiin.

Nämä näkökohdat eivät koske automaattisesti luotua koodia, jos lähdekoodissa on vain yksi kopio toiminnallisuudesta.

Aikaisemmin, kun muistitila oli rajallisempi, kaksoiskoodilla oli lisäksi haittana enemmän tilaa viemistä, mutta nykyään tämä ei todennäköisesti ole ongelma.

Kun ohjelmistohaavoittuvuutta sisältävä koodi kopioidaan, haavoittuvuus saattaa edelleen esiintyä kopioidussa koodissa, jos kehittäjä ei ole tietoinen tällaisista kopioista. Päällekkäisen koodin korjaaminen voi parantaa monia ohjelmistomittareita, kuten koodirivejä , syklomaattinen monimutkaisuus ja kytkentä . Tämä voi johtaa lyhyempiin kokoamisaikoihin, pienempään kognitiiviseen kuormitukseen , vähemmän inhimillisiin virheisiin ja vähemmän unohdettuihin tai unohdettuihin koodikappaleisiin. Kaikkia koodien päällekkäisyyksiä ei kuitenkaan voida korjata. Kloonit voivat olla tehokkain ratkaisu, jos ohjelmointikieli tarjoaa puutteelliset tai liian monimutkaiset abstraktit, varsinkin jos niitä tuetaan käyttöliittymän tekniikoilla, kuten samanaikaisella muokkauksella . Lisäksi koodin rikkomisesta aiheutuvat riskit uudelleenkäsittelyssä voivat olla suuremmat kuin ylläpitohyödyt. Wagnerin, Abdulkhaleqin ja Kayan tutkimuksessa päädyttiin siihen, että vaikka kaksoiskappaleiden synkronoimiseksi on tehtävä lisätyötä, jos mukana olevat ohjelmoijat ovat tietoisia kaksoiskoodista, vikoja ei aiheutunut merkittävästi enemmän kuin yksinkertaisessa koodissa.

Tunnistetaan kaksoiskoodi

Useita erilaisia ​​algoritmeja on ehdotettu kaksoiskoodin havaitsemiseksi. Esimerkiksi:

Esimerkki toiminnallisesti päällekkäisestä koodista

Harkita seuraavia koodinpätkä laskemiseksi keskiarvo , joka joukko on kokonaislukuja

extern int array_a[];
extern int array_b[];
 
int sum_a = 0;

for (int i = 0; i < 4; i++)
   sum_a += array_a[i];

int average_a = sum_a / 4;
 
int sum_b = 0;

for (int i = 0; i < 4; i++)
   sum_b += array_b[i];

int average_b = sum_b / 4;

Kaksi silmukkaa voidaan kirjoittaa uudelleen yhtenä toimintona:

int calc_average_of_four(int* array) {
   int sum = 0;
   for (int i = 0; i < 4; i++)
       sum += array[i];

   return sum / 4;
}

tai yleensä edullisesti parametroimalla elementtien lukumäärä taulukossa.

Yllä olevan toiminnon käyttäminen antaa lähdekoodin, jolla ei ole silmukan päällekkäisyyksiä:

extern int array1[];
extern int array2[];

int average1 = calc_average_of_four(array1);
int average2 = calc_average_of_four(array2);

Huomaa, että tässä triviaali tapauksessa, kääntäjä voi valita inline molemmat puhelut toiminnon, siten, että tuloksena kone koodi on identtinen sekä kahdennettu ja ei-päällekkäisiä esimerkkejä edellä. Jos toimintoa ei ole upotettu, toimintokutsujen ylimääräisten yleiskustannusten suorittaminen kestää todennäköisesti kauemmin (10 prosessorin ohjeiden järjestyksessä useimmille korkean suorituskyvyn kielille). Teoriassa tällä ylimääräisellä juoksuaikalla voi olla merkitystä.

Image
Esimerkki kaksoiskoodikorjauksesta koodilla, joka on korvattu menetelmällä

Katso myös

Viitteet

Ulkoiset linkit