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:
- kopioi ja liitä ohjelmointi , joka akateemisissa olosuhteissa voidaan tehdä osana plagiointia
- 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ä
- eivät ymmärrä kieltä kunnolla
- ei ole aikaa tehdä se oikein, tai
- älä välitä aktiivisen ohjelmiston lisääntyneestä mätänemisestä .
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:
- Bakerin algoritmi.
- Rabin – Karp-merkkijonohakualgoritmi .
- Abstraktien syntaksipuiden käyttö .
- Visuaalinen kloonien tunnistus.
- Laske matriisikloonin tunnistus.
- Paikkakohtainen hajautus
- Yhdistymisen vastainen
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ä.
Katso myös
- Abstraktioperiaate (ohjelmointi)
- Anti-kuvio
- Tietojen deduplikaatio
- Älä toista itseäsi (KUIVA)
- Luettelo työkaluista staattisen koodin analysointia varten
- Tarpeeton koodi
- Kolmen säännön sääntö (tietokoneohjelmointi)