La teoria è che le classi che si conoscono e si utilizzano reciprocamente devono trovarsi nello stesso pacchetto (usando la visibilità pacchetto per le funzioni che non sono utilizzate dal resto dell'applicazione), formando così una concisa , interfaccia comprensibile. [Classi ben note (accessibili da quasi ovunque, come i logger) dovrebbero andare al loro pacchetto, chiamandolo utils
.]
Assumi una base di codice di diverse centinaia di file Java, distribuiti piuttosto liberamente su circa sei dozzine di pacchetti, la maggior parte dei metodi ha dichiarato public
(a parte alcuni private
), e relazioni piuttosto oscure tra le classi. (Nessun punto di ingresso chiaro, poiché i metodi vengono chiamati da un'infrastruttura JSF, se questo è importante. Potrebbero esserci alcuni metodi main()
, ma di solito sono non usati .)
Qualcuno ha mai pensato di applicare un approccio di clustering per raggruppare un insieme così ampio di classi Java in pacchetti? Mi chiedo se e come ciò sia possibile, sia per delineare la forza delle relazioni tra le classi come aiuto per la pulizia manuale, sia per riorganizzare automaticamente il codice in qualche modo.
La misura della distanza potrebbe implicare il numero di funzioni necessarie per essere dichiarate public
e il numero di istruzioni pacchetto import
(cioè quelle che terminano con .*
) necessarie per la compilazione del codice. Dal momento che la risposta algoritmicamente "migliore" a quella domanda sarebbe quella di avere tutte le classi in un unico pacchetto (non richiede alcun metodo pubblico o importa più, che non è quello che voglio), mi sembra che un approccio di clustering gerarchico sarebbe il migliore (lasciando la granularità finale dei pacchetti come una decisione per gli umani), ma forse ci sono approcci migliori di cui non sono a conoscenza.
Ho cercato di trovare informazioni su quell'argomento, ma la ricerca di "Java" e "clustering" mi ha portato solo su pagine che spiegavano come implementare il clustering con Java, che non è quello che sto cercando . (Naturalmente, un approccio potrebbe essere implementato anche in Java, dal momento che potrebbe essere realizzato usando l'introspezione, ma non è importante per la mia domanda.)