Kohézió (számítástechnika)

A Wikipédiából, a szabad enciklopédiából
Ugrás a navigációhoz Ugrás a kereséshez

A számítógépes programozásban a kohézió azt mutatja, hogy a modulon belüli elemek mennyire tartoznak össze. Bizonyos értelemben ez egy osztály metódusai és adatai, valamint az osztály által szolgált egyesítő cél vagy fogalom közötti kapcsolat erősségének mérőszáma. Más értelemben az osztály módszerei és adatai közötti kapcsolat erősségének mérőszáma.

A kohézió egy ordinális típusú mérés, és általában a "nagy kohézió" vagy az "alacsony kohézió" jelzővel írják le. A magas kohézióval rendelkező modulok általában előnyösebbek, mivel a magas kohézió a szoftver számos kívánatos tulajdonságával jár együtt, beleértve a robusztusságot, a megbízhatóságot, az újrafelhasználhatóságot és az érthetőséget. Ezzel szemben az alacsony kohézió olyan nemkívánatos tulajdonságokkal jár együtt, mint a nehezen karbantartható, tesztelhető, újrafelhasználható vagy akár érthető.

A kohéziót gyakran szembeállítják a csatolással, amely egy másik fogalom. A nagy kohézió gyakran korrelál a laza csatolással, és fordítva. A csatolás és a kohézió szoftveres mérőszámait Larry Constantine találta ki az 1960-as évek végén a strukturált tervezés részeként, a karbantartási és módosítási költségeket csökkentő "jó" programozási gyakorlatok jellemzői alapján. A strukturált tervezés, a kohézió és a csatolás a Stevens, Myers & Constantine (1974) című cikkben és a Yourdon & Constantine (1979) című könyvben jelent meg; az utóbbi két kifejezés később a szoftverfejlesztés standard fogalmaivá vált.

Nagy kohézió[szerkesztés]

Az objektumorientált programozásban, ha egy osztályt kiszolgáló metódusok sok szempontból hasonlóak, akkor az osztályról azt mondjuk, hogy magas kohézióval rendelkezik. Egy nagy kohéziójú rendszerben a kód olvashatósága és újrafelhasználhatósága megnő, miközben a komplexitás kezelhető marad.

Kohézió

A kohézió fokozódik, ha:

  • Az osztályokba ágyazott funkciók, amelyekhez a metódusokon keresztül férhetünk hozzá, sok közös vonást mutatnak.
  • A metódusok kisszámú, egymással összefüggő tevékenységet végeznek, elkerülve a durva szemcsés vagy egymástól független adathalmazokat.
  • A kapcsolódó metódusok ugyanabban a forrásfájlban vagy más módon csoportosítva vannak; például különálló fájlokban, de ugyanabban az alkönyvtárban/mappában.

A nagy kohézió (vagy "erős kohézió") előnyei a következők:

  • Csökkentett modulkomplexitás (egyszerűbbek, kevesebb műveletük van).
  • A rendszer karbantarthatóságának növekedése, mivel a tartományban bekövetkező logikai változások kevesebb modult érintenek, és mivel az egyik modulban bekövetkező változások kevesebb módosítást igényelnek más modulokban.
  • Fokozott modul-újrafelhasználhatóság, mivel az alkalmazásfejlesztők könnyebben megtalálják a modul által biztosított műveletek összefüggő halmaza között a szükséges komponenst.

Míg elvileg egy modul tökéletes kohézióval rendelkezhet, ha csak egyetlen atomikus elemből áll - például egyetlen funkcióval rendelkezik -, a gyakorlatban az összetett feladatok nem fejezhetők ki egyetlen egyszerű elemmel. Így egy egyelemű modulnak van olyan eleme, amely vagy túl bonyolult ahhoz, hogy egy feladatot teljesítsen, vagy túl szűk, és így szorosan kapcsolódik más modulokhoz. Így a kohézió egyensúlyban van mind az egység összetettségével, mind a csatolással.

A kohézió típusai[szerkesztés]

A kohézió minőségi mérés, ami azt jelenti, hogy a mérendő forráskódot egy rubrika segítségével vizsgálják meg a besorolás meghatározásához. A kohéziós típusok a legrosszabbtól a legjobbig a következők:

Véletlenszerű kohézió (legrosszabb)
Véletlenszerű kohézióról akkor beszélünk, amikor egy modul részei találomra vannak csoportosítva; a részek közötti egyetlen kapcsolat az, hogy egy csoportba lettek csoportosítva (pl. egy "Utilities" osztály). Példa:
/*
Groups: The function definitions
Parts: The terms on each function
*/
Module A{
 /*
 Implementation of r(x) = 5x + 3
 There is no particular reason to group functions in this way,
 so the module is said to have Coincidental Cohesion.
 */ 
 r(x) = a(x) + b(x) 
 a(x) = 2x + 1
 b(x) = 3x + 2
}
Logikai kohézió

A logikai kohézió az, amikor egy modul részei azért vannak csoportosítva, mert logikailag ugyanazt a feladatot látják el, még ha természetüknél fogva különböznek is (pl. az egér- és billentyűzetbeviteli rutinok csoportosítása).

Időbeli kohézió

Időbeli kohézióról akkor beszélünk, ha egy modul részeit a feldolgozásuk időpontja szerint csoportosítjuk - a részek a programvégrehajtás egy adott időpontjában kerülnek feldolgozásra (pl. egy függvény, amelyet egy kivétel elkapása után hívunk meg, amely lezárja a nyitott fájlokat, hibanaplót készít, és értesíti a felhasználót).

Eljárási kohézió
Procedurális kohézióról akkor beszélünk, ha egy modul részei azért vannak csoportosítva, mert mindig egy bizonyos végrehajtási sorrendet követnek (pl. egy függvény, amely ellenőrzi a fájljogosultságokat, majd megnyitja a fájlt).
Kommunikációs / információs kohézió
Kommunikációs kohézióról akkor beszélünk, ha egy modul részei azért vannak csoportosítva, mert ugyanazokkal az adatokkal dolgoznak (pl. egy modul, amely ugyanazon az információs rekordon dolgozik).
Szekvenciális kohézió
A szekvenciális kohézió az, amikor egy modul részei azért vannak csoportosítva, mert az egyik rész kimenete egy másik rész bemenete, mint egy futószalag (pl. egy függvény, amely adatokat olvas be egy fájlból és feldolgozza az adatokat).
Funkcionális kohézió (legjobb)
Funkcionális kohézióról akkor beszélünk, ha egy modul részei azért vannak csoportosítva, mert mindannyian hozzájárulnak a modul egyetlen jól meghatározott feladatához (pl. egy XML-szöveg lexikális elemzése). Példa:
/*
Groups: The function definitions
Parts: The terms on each function
*/
Module A {
 /*
 Implementation of arithmetic operations
 This module is said to have functional cohesion because 
 there is an intention to group simple arithmetic operations
 on it. 
 */
 a(x, y) = x + y
 b(x, y) = x * y
}

Module B {
 /*
 Module B: Implements r(x) = 5x + 3
 This module can be said to have atomic cohesion. The whole
 system (with Modules A and B as parts) can also be said to have functional
 cohesion, because its parts both have specific separate purposes. 
 */
 r(x) = [Module A].a([Module A].b(5, x), 3)
}
Tökéletes kohézió (atom)
Példa.
/*
Groups: The function definitions
Parts: The terms on each function
*/
Module A {
 /* 
 Implementation of r(x) = 2x + 1 + 3x + 2
 It's said to have perfect cohesion because it cannot be reduced any more than that.
 */
 r(x) = 5x + 3
}

Bár a kohézió egy ordinális típusú skála, a rangsorok nem jelzik a kohézió javulásának folyamatos előrehaladását. Különböző személyek, köztük Larry Constantine, Edward Yourdon és Steve McConnell tanulmányai azt mutatják, hogy a kohézió első két típusa gyengébb, a kommunikációs és a szekvenciális kohézió nagyon jó, a funkcionális kohézió pedig jobb.

Bár a funkcionális kohéziót tartják a szoftvermodulok legkívánatosabb kohéziótípusának, ez nem feltétlenül érhető el. Vannak olyan esetek, amikor a kommunikációs kohézió a legmagasabb szintű kohézió, amely az adott körülmények között elérhető.

Fordítás[szerkesztés]

Ez a szócikk részben vagy egészben a Cohesion (computer science) című angol Wikipédia-szócikk ezen változatának 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 jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

Kapcsolódó szócikkek[szerkesztés]