Kodmått – klasskoppling

Klasskopplingen går också under namnet Koppling mellan objekt (CBO) som ursprungligen definierades av CK94. I grund och botten är klasskoppling ett mått på hur många klasser en enskild klass använder. Ett högt tal är dåligt och ett lågt tal är vanligtvis bra med det här måttet. Klasskoppling har visat sig vara en korrekt förutsägelse av programvarufel och nyligen genomförda studier har visat att ett övre gränsvärde på 9 är den mest effektiva S2010.

Enligt Microsoft-dokumentationen mäter klasskopplingen kopplingen till unika klasser genom parametrar, lokala variabler, returtyper, metodanrop, generiska instansieringar eller mallinstansieringar, basklasser, gränssnittsimplementeringar, fält som definierats för externa typer och attributdekoration. Bra programvarudesign avgör att typer och metoder ska ha hög sammanhållning och låg koppling. Hög koppling indikerar en design som är svår att återanvända och underhålla på grund av dess många beroenden på andra typer."

Begreppen koppling och sammanhållning är tydligt relaterade. För att hålla den här diskussionen om ämnet kommer vi inte att fördjupa oss i sammanhållningen annat än att ge en kort definition från KKLS2000:

"Modulsammanhållning introducerades av Yourdon och Constantine som "hur nära bundna eller relaterade de interna elementen i en modul är till varandra" YC79. En modul har en stark sammanhållning om den representerar exakt en uppgift [...], och alla dess element bidrar till denna enda uppgift. De beskriver sammanhållning som ett attribut för design, snarare än kod, och ett attribut som kan användas för att förutsäga återanvändning, underhåll och ändringsbarhet."

Exempel på klasskoppling

Låt oss titta på klasskoppling i praktiken. Skapa först ett nytt konsolprogram och skapa en ny klass med namnet Person med vissa egenskaper i det och beräkna sedan kodmåtten omedelbart:

Exempel på klasskoppling 1

Observera att klasskopplingen är 0 eftersom den här klassen inte använder några andra klasser. Skapa nu en annan klass med namnet PersonStuff med en metod som skapar en instans av Person och anger egenskapsvärdena. Beräkna kodmåtten igen:

Exempel på klasskoppling 2

Se hur klasskopplingsvärdet ökar? Observera också att oavsett hur många egenskaper du anger går klasskopplingsvärdet bara upp med 1 och inte av något annat värde. Klasskoppling mäter varje klass endast en gång för det här måttet oavsett hur mycket den används. Dessutom kan du se att DoSomething() har en 1 men konstruktorn, , PersonStuff()har en 0 för dess värde? För närvarande finns det ingen kod i konstruktorn som använder en annan klass.

Vad händer om du placerar kod i konstruktorn som använde en annan klass? Här är vad du får:

Exempel på klasskoppling 3

Nu har konstruktorn helt klart kod som använder en annan klass och klasskopplingsmåttet visar detta faktum. Återigen kan du se att den övergripande klasskopplingen för är 1 och PersonStuff() är också 1 för DoSomething() att visa att endast en extern klass används oavsett hur mycket intern kod du har som använder den.

Skapa sedan en ny klass. Ge den här klassen ett namn och skapa några egenskaper i den:

Exempel på klasskoppling – lägg till ny klass

Nu använder du klassen i vår DoSomething() metod i PersonStuff klassen och beräknar kodmått igen:

Exempel på klasskoppling 4

Som du ser går klasskopplingen för klassen PersonStuff upp till 2 och om du går in i klassen kan du se att DoSomething() metoden har mest koppling i den, men konstruktorn använder fortfarande bara 1 klass. Med hjälp av dessa mått kan du se det totala maximala antalet för en viss klass och öka detaljnivån i informationen per medlem.

Det magiska numret

Precis som med cyklomatisk komplexitet finns det ingen gräns som passar alla organisationer. S2010 anger dock att en gräns på 9 är optimal:

"Därför anser vi tröskelvärdena [...] som den mest effektiva. Dessa tröskelvärden (för en enskild medlem) är CBO = 9[...]." (betoning tillagd)

Kodanalys

Kodanalys innehåller en kategori av regler för underhåll. Mer information finns i Underhållsregler. När du använder äldre kodanalys innehåller den utökade regeluppsättningen för designriktlinjer ett område för underhållbarhet.

Designriktlinjer för utökad klasskoppling

Inom underhållsområdet finns en regel för sammankoppling av klasser.

`Regel för klasskoppling`

Den här regeln utfärdar en varning när klasskopplingen är överdriven. Mer information finns i CA1506: Undvik överdriven klasskoppling.

Citat

CK94

Chidamber, S. R. & Kemerer, C. F. (1994). En måttsvit för objektorienterad design (IEEE-transaktioner inom programvaruteknik, vol. 20, nr 6). Hämtad 14 maj 2011 från University of Pittsburgh webbplats: http://www.pitt.edu/~ckemerer/CK%20research%20papers/MetricForOOD_ChidamberKemerer94.pdf

KKLS2000

Kabaili, H., Keller, R., Lustman, F., och Saint-Denis, G. (2000). Klasssammanhållning omvärderad: En empirisk studie om industriella system (Förhandlingar från verkstaden om kvantitativa metoder inom objektorienterad programvaruteknik). Hämtad 20 maj 2011 från Université de Montréals webbplats http://www.iro.umontreal.ca/~sahraouh/qaoose/papers/Kabaili.pdf

SK2003

Subramanyam, R. & Krishnan, M. S. (2003). Empirisk analys av CK-mått för komplexitet i objektorienterad design: Konsekvenser för programvarufel (IEEE:s tidskrift om programvaruteknik, vol. 29, nr 4).

S2010

Shatnawi, R. (2010). En kvantitativ undersökning av godtagbara risknivåer för objektorienterade metrik i system med öppen källkod ("IEEE Transactions on Software Engineering", vol. 36, nr 2).

YC79

Edward Yourdon och Larry L. Constantine. Strukturerad design. Prentice Hall, Englewood Cliffs, N.J., 1979.