Másol-beillesztéses programozás

A Wikipédiából, a szabad enciklopédiából
(Copy-paste programozás szócikkből átirányítva)

A másol-beillesztéses programozás a számítógép-programozásban azt jelenti, hogy ismétlődő kódot állítanak elő másolással. Mivel gyakran a tapasztalat hiányát jelzi, használata pejoratív. Lehet a technológiai korlátok következménye is, amit egyébként könyvtárakkal vagy függvényekkel oldanának meg. Azonban van, amikor alkalmazása megengedhető, mint boilerplate kód, ciklus kifejtése (ha a fordító nem támogatja), de támogatják bizonyos idiómák, forráskód-szerkesztők kódrészletek formájában.

Okai[szerkesztés]

A másolást gyakran tapasztalatlan programozók végzik, akiknek nehéz lenne saját kód írása és nem ismernek függvénykönyvtárakat a feladat megoldására. Emiatt keresnek valahol egy létező megoldást, amit saját megoldásukhoz felhasználhatnak. Néha több helyről gyűjtik össze a szükséges részleteket.[1] (Lásd még: Cargo cult programozás)

Gyakran nem értik eléggé a kimásolt kódot, emiatt problémáik inkább a tapasztalatlanságból mint a másolásból származnak. A kód különböző helyről származhat, könyvekből, elektronikus jegyzetekből, internetes fórumokból, oktatóktól, barátoktól, munkatársaktól. Az eredmény stílusa nem egységes, és tartalmazhat olyan kódrészleteket is, amelyekre az új helyen már nincs szükség. További probléma a kód nem értéséből fakadó hibák, amiket újabb másolással igyekszik a programozó kijavítani. Előfordul, hogy nem nevezi át a kódban szereplő változókat, osztályokat, függvényeket, így azok neve nem lesz informatív az új környezetben.[1]

A másolásos programozás lehet annak is a következménye, hogy a kezdő programozó nem ismeri eléggé az adott paradigma programozási elemeit, mint ciklusok, függvények és szubrutinok.

Duplikáció[szerkesztés]

Könyvtári kód[szerkesztés]

Ismétlődő kódszakasz kiemelése függvénybe

Tapasztaltabb programozók is másolnak néha, már meglevő, kipróbált kódszakaszokat vesznek át saját könyvtárukból, és generikus algoritmusokat alkalmaznak a jelenlegi helyzetre, de nem kívánják a teljes könyvtárat beépíteni a projektbe, például terjedelmi okokból.[2]

A másolással létrehozott kód is duplikáció, emiatt osztozik annak problémáiban. Nincs kapcsolat a különböző példányok között, emiatt a karbantartó időt veszít vagy a többi példány keresésére vagy az egyenkénti kijavításra. Kommentben jelezhető a kapcsolat, de mivel korlátozottan tartják karban a kommenteket, azért ez elavulhat.[3]

Az objektumorientált programozásban igyekeznek minél absztraktabbá és általánosabbá tenni a másolást, ha mégis sor kerülne rá. Így javasolják, hogy a generikus algoritmus osztályba ágyazását, ami újrahasználható. Az öröklődés és a túlterhelés segítségével a hívó kód ahelyett, hogy átvenné és megváltoztatná a kódot, csak meghívja, esetleg előtte vagy utána csinál még valamit. Ha további funkcionalitás szükséges, akkor az osztály illetve könyvtár bővíthető. Ha valami probléma adódik, akkor elég egy helyen javítani.[4]

Elágazás[szerkesztés]

A nagy csapatokban végzett fejlesztés támogatására elágaztatják a kódot. A példányokon párhuzamosan lehet dolgozni, amivel lerövidíthető a fejlesztési ciklus. A klasszikus elágaztatás jellemzői:

Kevésbé formális mód az egyszerű másolás, amit akkor használnak, ha már látszódik, hogy a két vonal fejlesztése egyre inkább elszakad egymástól.

Az új verzió fejlesztésének kezdetekor az elágazásnak vannak előnyei, például a már létező verziót nem zavarják az újabb fejlesztések. Hasonló a helyzet, ha mélyebb átdolgozás történik, és a csapat egy új termékkel áll elő.

  • Nincs szükség az elágazáskor regressziós tesztre, amivel rövidítik a piacra jutási időt.
  • Nem vezetnek be újabb hibákat a már létező verzióba, így a felhasználókat ez nem érinti.

A hátrányok:

  • A régi hibákat mindkét helyen javítani kell.
  • Ha kiderül, hogy az új verzió nem fog nagyon különbözni a régitől, így két verziót kell fenntartani. Ez növeli a fenntartás költségét. Szükség lehet refaktorálásra, amit kézzel kell átvezetni mindkét termékbe.

Alternatíva lehet a modularizált fejlesztés:

  • Kifraktorálja a mindkét termék által részt egy külön modulba, könyvtárba.
  • Ezeket használják az új termékhez vagy verzióhoz.
  • Ha jönnek a további verziók, akkor a hozzáadott kódot külön modulba teszik.[5]

Ismétlődő és hasonló feladatok[szerkesztés]

A másolásos programozás által keletkezett kód javításának problémája

A másol-beillesztéses programozás egyik legártalmasabb formája, ha ugyanazt a kódot használják több helyen. Ennek egy változata, hogy egy változótól függ, hogy mikor melyiket. Ahelyett, hogy függvénybe vagy szubrutinba tennék őket, és azt hívnák meg, ezzel a változóval mint paraméterrel, a kódot több helyre másolják. Ennek káros következményei:

  • Hosszabbak lesznek a metódusok.
  • Ha egy hiba előfordul az egyik helyen, akkor a többi helyen is megtalálható. Ahelyett, hogy egyszerre ki lehetne javítani, ha elég sok másolat van, akkor kimaradhat belőle néhány, amit újra ki kell majd javítani. Ezzel a javítás költsége megnő.[6]
  • Rontja az olvashatóságot, mivel külön figyelni kell, hogy melyik előfordulás mennyiben más. Növeli a hibalehetőséget, és a kód vizsgálatát is lassítja.
  • A procedurális programozás a függvények és szubrutinok használatát ajánlja.[7]
  • Az általános ökölszabály: Ne ismételd önmagad!

Elfogadható alkalmazások[szerkesztés]

Néha a másolásos programozás elfogadható. Többnyire a boilerplate kódot kell másolni, mint deklarációkat, importált könyvtárakat, használt keretrendszert. Ezt elvégezheti a fejlesztőkörnyezet is.

Programozási idiómák, programtervezési minták használatakor ki lehet indulni az eleve adott kódból. Az idiómákat, snippeteket általában célszerű függvényként vagy szubrutinként betenni.

A Subtext programozási nyelv egy kutatási projekt, ami a másolásos programozás elfogadhatóvá tételét célozza.

Példa[szerkesztés]

Egy egyszerű példa egy ciklus: for (int i=0; i!=n; ++i) {}.

Példa kód, ami ezt használja:

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

A ciklust generálhatja a következő snippet:

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

Fordítás[szerkesztés]

Ez a szócikk részben vagy egészben a Copy and paste programming című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

Jegyzetek[szerkesztés]

  1. a b Revisiting Novice Programmers Errors. acm.org. (Hozzáférés: 2008. június 4.)
  2. Building ASP.NET Web Pages Dynamically in the Code-Behind. codeproject.com. (Hozzáférés: 2008. június 4.)
  3. Spinellis, Diomidis: The Bad Code Spotter's Guide. InformIT.com. (Hozzáférés: 2008. június 6.)
  4. Lewallen, Raymond: 4 major principles of Object-Oriented Programming. codebetter.com. [2010. november 25-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. június 4.)
  5. Eriksen, Lisa: Code Reuse In Object Oriented Software Development. Norwegian University of Science and Technology, Department of Computer and Information Science. (Hozzáférés: 2008. május 29.)
  6. Ashley Marsh: Coding Standards – The Way to Maintainable Code. MAAN Softwares INC.. (Hozzáférés: 2018. április 10.)[halott link]
  7. Stanford University, CS 106X ("Programming Abstractions") Course Handout: "Decomposition". Stanford University. [2008. május 16-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. június 4.)