Ho fatto una ricerca approfondita su domande relative a precedenti domande, ma poiché le mie domande sono alquanto peculiari, ho deciso di crearne una nuova.
Sto implementando un'applicazione di visualizzazione (in JS). Esiste una classe, chiamata Graph , che contiene la visualizzazione di un grafico, insieme a tutti i componenti necessari (nodi, spigoli, ecc.). Ho deciso di implementare una funzionalità di clustering sul grafico, che consente all'utente di raggruppare un gruppo di nodi in un singolo cluster, a seconda di alcuni attributi. Inizialmente ho implementato questa funzionalità nella classe Graph. Tuttavia, poiché è una quantità significativa di logica, che non è direttamente correlata al grafico, penso che dovrebbe essere correttamente refactored ad un componente diverso (l'ho chiamato ClusteringEngine ). E qui arriva il problema.
ClusteringEngine ha bisogno di un riferimento a Graph, per recuperare nodi, bordi ecc. Quindi, se ClusteringEngine è implementato come sottocomponente di una classe esterna (un CentralController), il grafico delle dipendenze sarà come:
CentralController ---> Graph <----\
\ \
\--> ClusteringEngine
che sembra molto accoppiato. Un'altra opzione è quella di implementare ClusteringEngine come componente di Graph, dove finirò con un riferimento circolare:
CentralController -----> Graph <-----> ClusteringEngine
che è di nuovo altamente accoppiato. Mi stavo chiedendo se c'è un modo per evitare questo problema e progettarlo in un modo migliore.
P.S. Ho pensato all'Observer Design Pattern, ma poiché non esiste un contesto di eventi-messaggi, penso che non sia appropriato per questo caso.