Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Klassekoppeling staat ook bekend als Koppeling tussen objecten (CBO), zoals oorspronkelijk gedefinieerd door CK94. In principe is klassekoppeling een meting van het aantal klassen dat één klasse gebruikt. Een hoog getal is slecht en een laag getal is meestal goed met deze metrische waarde. Er is aangetoond dat klassekoppeling een nauwkeurige predictor is van softwarefouten en recente studies hebben aangetoond dat een bovengrenswaarde van 9 de meest efficiënte S2010 is.
Volgens de Microsoft-documentatie meet klassekoppeling de koppeling naar unieke klassen via parameters, lokale variabelen, retourtypen, methode-aanroepen, generieke of sjabloonexemplarisaties, basisklassen, interface-implementaties, velden die zijn gedefinieerd op externe typen en attributendecoratie. Goed softwareontwerp bepaalt dat typen en methoden een hoge samenhang en lage koppeling moeten hebben. Hoge koppeling geeft een ontwerp aan dat moeilijk te hergebruiken en te onderhouden is vanwege de vele onderlinge afhankelijkheden van andere typen."
De concepten van koppeling en samenhang zijn duidelijk gerelateerd. Om deze discussie over het onderwerp te behouden, zullen we niet verder ingaan op de samenhang dan om een korte definitie te geven van KKLS2000:
Module-samenhang is geïntroduceerd door Yourdon en Constantine als 'hoe nauw de interne elementen van een module aan elkaar verbonden of gerelateerd zijn' YC79. Een module heeft een sterke samenhang als deze precies één taak [...]vertegenwoordigt en alle bijbehorende elementen bijdragen aan deze ene taak. Ze beschrijven cohesie als een kenmerk van ontwerp, in plaats van code, en een kenmerk dat kan worden gebruikt om herbruikbaarheid, onderhoudbaarheid en veranderbaarheid te voorspellen."
Voorbeeld van klassekoppeling
Laten we eens kijken naar klassekoppeling in actie. Maak eerst een nieuwe consoletoepassing en maak een nieuwe klasse met de naam Person met enkele eigenschappen erin en bereken vervolgens onmiddellijk de metrische codegegevens:
U ziet dat de klassekoppeling 0 is, omdat deze klasse geen andere klassen gebruikt. Maak nu een andere klasse met de naam PersonStuff met een methode waarmee een exemplaar van Person wordt gemaakt en de eigenschapswaarden worden ingesteld. Bereken opnieuw de metrische codegegevens:
Ziet u hoe de waarde van de klassekoppeling omhoog gaat? U ziet ook dat, ongeacht het aantal eigenschappen dat u instelt, de waarde van de klassekoppeling alleen met 1 omhoog gaat en niet door een andere waarde. Klassekoppeling meet elke klasse slechts één keer voor deze metrische waarde, ongeacht hoeveel deze wordt gebruikt. Bovendien kunt u zien dat DoSomething() er een 1 is, maar de constructor, PersonStuff()heeft een 0 voor de waarde? Er is momenteel geen code in de constructor die een andere klasse gebruikt.
Wat gebeurt er als u code in de constructor plaatst die een andere klasse heeft gebruikt? Dit is wat u krijgt:
De constructor bevat nu duidelijk code die gebruikmaakt van een andere klasse en de metrische gegevens voor klassekoppelingen laten dit feit zien. Nogmaals, u kunt de algehele klassekoppeling voor PersonStuff() 1 zien en DoSomething() is ook 1 om aan te geven dat er slechts één externe klasse wordt gebruikt, ongeacht hoeveel interne code u hebt die deze gebruikt.
Maak vervolgens nog een nieuwe klasse. Geef deze klasse een naam en maak er enkele eigenschappen in:
Gebruik nu de klasse in onze DoSomething() methode binnen de PersonStuff klasse en bereken de metrische codegegevens opnieuw:
Zoals u ziet, gaat de klassekoppeling voor de klasse PersonStuff tot 2 en als u inzoomt op de klasse, kunt u zien dat de DoSomething() methode de meeste koppeling bevat, maar de constructor nog steeds slechts één klasse verbruikt. Met behulp van deze metrische gegevens kunt u het totale maximumaantal voor een bepaalde klasse zien en inzoomen op de details per lid.
Het magicnummer
Net als bij cyclomatische complexiteit is er geen limiet die past bij alle organisaties. S2010 geeft echter wel aan dat een limiet van 9 optimaal is:
"Daarom beschouwen we de drempelwaarden [...] als de meest effectieve. Deze drempelwaarden (voor één lid) zijn CBO = 9[...]." (nadruk toegevoegd)
Codeanalyse
Codeanalyse bevat een categorie onderhoudsregels. Zie Regels voor onderhoudbaarheidvoor meer informatie. Wanneer u verouderde codeanalyse gebruikt, bevat de regelset uitgebreide ontwerprichtlijnen een gebied voor onderhoudbaarheid:
Binnen het gebied onderhoudbaarheid is een regel voor klassekoppeling:
Deze regel geeft een waarschuwing wanneer de klassekoppeling te hoog is. Zie CA1506 voor meer informatie: Vermijd overmatige klassekoppelingen.
Citaten
CK94
Chidamber, S. R. & Kemerer, C. F. (1994). Een Metriekenpakket voor Objectgeoriënteerd Ontwerp (IEEE Transactions on Software Engineering, Vol. 20, Nr. 6). Opgehaald op 14 mei 2011, van de website university of Pittsburgh: http://www.pitt.edu/~ckemerer/CK%20research%20papers/MetricForOOD_ChidamberKemerer94.pdf
KKLS2000
Kabili, H., Keller, R., Lustman, F., en Saint-Denis, G. (2000). Class Cohesion Revisited: Een Empirisch Onderzoek naar industriële systemen (Proceedings van de Workshop over Kwantitatieve Benaderingen in Object-Georiënteerde Software Engineering). Opgehaald op 20 mei 2011 van de website van Université de Montréal http://www.iro.umontreal.ca/~sahraouh/qaoose/papers/Kabaili.pdf
SK2003
Subramanyam, R. & Krishnan, M. S. (2003). Empirische analyse van CK-metrieken voor object-oriented ontwerpcomplexiteit: implicaties voor softwaredefecten (IEEE Transactions on Software Engineering, Vol. 29, Nr. 4).
S2010
Shatnawi, R. (2010). Een kwantitatief onderzoek naar de acceptabele risiconiveaus van Object-Oriented metrieken in Open-Source Systemen (IEEE Transactions on Software Engineering, Vol. 36, Nr. 2).
YC79
Edward Yourdon en Larry L. Constantine. Gestructureerd ontwerp. Prentice Hall, Englewood Cliffs, N.J., 1979.