Dipendenza ciclica in questo progetto

1

Ho 2 moduli (contenenti più classi). Chiamiamoli Module A e Module B . Il modulo B ha una dipendenza dal modulo A: Module B -> Module A . Ora, ho creato una classe di utilità C , che A e B dovrebbero usare ma l'utilità stessa dipende dalla funzionalità trovata in A e B, quindi A e B dipendono anche da C. Quindi qualcosa del genere: C <-> B -> A <-> C .

Sfortunatamente, non mi è permesso estrarre la dipendenza da A e B e metterli da qualche altra parte, quindi devono rimanere intatti (tranne che per il codice che usa l'utilità). Rendere l'utility un Interface e implementarlo in A e B, inoltre, non funziona perché le implementazioni dipenderanno anche da A e B, causando di nuovo una dipendenza ciclica ...

Si tratta di un problema di progettazione generale di come è stato progettato il mio progetto che è irrisolvibile?

EDIT: aggiunge un po 'più di dettagli.

Le dipendenze sono in forma di chiamate di metodo a classi situate all'interno dei moduli A e B. Un'estrazione sarebbe possibile ma interromperà il progetto iniziale e lo renderà anche strano dato che ha senso mantenerli dove sono.

    
posta sceiler 19.05.2016 - 09:23
fonte

3 risposte

1

Se C è una classe di utilità da riutilizzare da A e B, non dovrebbe contenere alcuna dipendenza diretta da A e B. Che è semplice come lo è.

Tuttavia, se C ha bisogno di un servizio da A (o B) per raggiungere il suo scopo, dovresti definire un'interfaccia per quel servizio , fare in modo che A (e / o B) implementino tale interfaccia, e iniettare il servizio in C durante la costruzione:

   class C
   {
        IService _service;
        C(IService x)
        {
            _service=x;
        }
   }

   class A : implements IService
   {
       C c;
       A()
       {
           c=new C(this);
       }
   }

In questo modo, non sarà necessario estrarre nulla da A o B in un altro posto, basta consentire a C di accedere alla funzionalità in A o B attraverso l'interfaccia IService .

    
risposta data 19.05.2016 - 15:17
fonte
0

È difficile dirlo senza saperne di più sul codice, ma nel modo in cui lo descrivi, l'unica soluzione sarebbe davvero quella di estrarre le parti da A e B da cui dipende C, e spostare queste parti in C. Poi A e B può dipendere da C, e C non dipende da nessuno.

Se questa non è un'opzione (perché?), l'unica opzione che posso vedere è di modificare C in modo tale che non dipenda più da A o B. Nella mia esperienza questo è solitamente possibile, ma per essere più specifici, avremmo bisogno di maggiori dettagli sul tuo codice.

    
risposta data 19.05.2016 - 12:44
fonte
0

Non ti piace cambiare i moduli A e B in un modo in cui si scrivono solo wrapper che incorporano la funzionalità che si desidera mantenere, ma in realtà utilizzano la funzionalità dal modulo D. Quindi si può continuare a utilizzare i moduli A e B esattamente nello stesso modo in cui l'hai fatto, ma la funzionalità comune è in realtà nel modulo D.

In questo modo non utilizzi la funzionalità tra A e B.

un wrapper potrebbe essere qualcosa del tipo:

function a(){
  dosomething()
}

diventa:

function d(){
  dosomething()
}

function a(){
  d()
}

Puoi continuare a usare la funzione come se fossi la logica sia altrove.

    
risposta data 19.05.2016 - 13:58
fonte

Leggi altre domande sui tag