Metrica di divergenza di classe

1

Alcuni anni fa stavo usando Sonar (prima che fosse SonarQube ) per analizzare del codice Java, e ricordo di aver visto un utile metrica che sarebbe tornata utile ancora oggi. Tuttavia non sembra essere parte dell'implementazione SonarQube a cui ho accesso.

La metrica descriveva il modo in cui una classe poteva essere facilmente suddivisa in classi separate senza richiedere un ampio refactoring.

A titolo di esempio, intendo: diciamo che abbiamo una classe chiamata MyService , che ha riferimenti a due DAO, CustomerDAO e ItemDAO . Ogni metodo su MyService chiama CustomerDAO o ItemDAO ma mai entrambi. Sembra intuitivo che MyService possa essere scomposto in CustomerService e ItemService , e quindi migliorare il principio di responsabilità singola globale dell'applicazione.

Tuttavia, non riesco a trovare riferimenti a questa metrica in una revisione degli strumenti di analisi statica e non riesco a trovare un modo conciso per descriverlo in un modo che un motore di ricerca potrebbe capire.

Qualcuno può indicarmi un buon nome per / la definizione di questa metrica e / o uno strumento che la implementa?

    
posta Jim Kiley 21.03.2018 - 18:22
fonte

2 risposte

2

Le metriche a cui sei interessato sono chiamate metriche coesione . Ce ne sono 30 o più diversi che io conosca. Questo articolo ne illustra alcuni e ha riferimenti ai documenti originali. A proposito, molti di loro danno risultati contro-intuitivi in alcuni casi e le misurazioni da una metrica spesso non sono d'accordo con gli altri.

Inoltre, tieni presente che la denominazione delle metriche è incoerente. Ad esempio, LCOM è l'acronimo di Lack of Cohesion Of Methods. Diverse persone hanno apportato modifiche al metodo LCOM originale, che ha portato altre persone ad aggiungere numeri per distinguerli: LCOM1, LCOM2, ecc. Sfortunatamente, questo significa che LCOM4 potrebbe essere una designazione imprecisa, a meno che qualcuno non si assicuri di dirti di chi LCOM4 di cui stanno parlando.

Il refactoring extract-class è quello che è utile per separare le grandi classi non coesive in classi più piccole e coerenti. IntelliJ IDEA ha uno strumento di refactoring della classe di estrazione piuttosto buono.

    
risposta data 13.05.2018 - 03:23
fonte
1

Puoi provare JArchitect per individuare le classi che potrebbero essere divise utilizzando le metriche LCOM / LCOMHS. Le classi con scarsa coesione sono le più candidate per un refactoring.

    
risposta data 30.03.2018 - 12:31
fonte

Leggi altre domande sui tag