Esistono metriche per la coesione e l'accoppiamento?


Risposte:


29

Penso che la metrica che stai cercando sia LCOM4, ​​sebbene si applichi di più alle classi.

Sonar lo spiega bene qui :

... metrica: LCOM4 (Lack Of Cohesion Methods) per misurare quanto sono coerenti le classi. L'interpretazione di questa metrica è piuttosto semplice in quanto il valore 1 indica che una classe ha solo una responsabilità (buona) e il valore X significa che una classe ha probabilmente responsabilità X (cattiva) e deve essere riformattata / suddivisa.

Non c'è magia qui, solo buon senso. Facciamo un semplice esempio con il driver di classe. Questa classe ha due campi: Car and Brain e cinque metodi: drive (), goTo (), stop (), getAngry () e drinkCoffee (). Ecco il grafico delle dipendenze tra questi componenti. Esistono tre blocchi di componenti correlati, quindi LCOM4 = 3, quindi la classe sembra avere tre diverse responsabilità e infrange il principio di responsabilità singola. http://i.stack.imgur.com/2527G.png

...

È un ottimo strumento, se puoi usarlo. :)


@OnorioCatenacci Nessun problema. :)
— Oleksi,

Peccato che non entrino nel modo in cui calcolano la metrica.
— Onorio Catenacci,

3
Questo potrebbe aiutare in questo: aivosto.com/project/help/pm-oo-cohesion.html
— Oleksi

Per curiosità, come rifatteresti quel diagramma per obbedire al principio della responsabilità singola? brain.setAngry(driver)? car.applyBreaks(driver)?
— Phil

Dubito che le metriche di coesione basate sul codice possano davvero essere indicative della coesione a livello di interfaccia e potrebbero persino promuovere una cattiva programmazione: mortoray.com/2015/04/29/…
— edA-qa mort-ora-y

16
  • Accoppiamento afferente: numero di responsabilità
  • Accoppiamento efficace: numero di dipendenze
  • Instabilità: rapporto tra accoppiamento efferente e accoppiamento totale (Afferent + Efferent).

L'instabilità è supportata in vari strumenti di metrica del codice.


Grazie @ Brian - esattamente il genere di cose che speravo di trovare.
— Onorio Catenacci,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.