Sarà bene per un'interfaccia prendere dipendenza da un'interfaccia in questa situazione?

1

Sfondo

Ho un'interfaccia definita per un buffer circolare chiamato ICircularBuffer in un progetto separato. Questo ICircularBuffer è qualcosa che usiamo dappertutto, quindi risiede nel progetto CommonInterfaces .

Bene, abbiamo un'altra interfaccia IEquipmentController che controlla alcune apparecchiature molto distinte. Questo pezzo di equipaggiamento produce alcuni dati. Vorrei passare il mio buffer a IEquipmentController in modo da poter leggere il buffer in modo asincrono per riferimento dal thread che lo ha passato.

Il problema è che IEquipmentController e ICircularBuffer sono definiti in due progetti separati. Quindi questo mi porta nella mia domanda ...

Domanda

A causa del modo in cui CommonInterfaces viene utilizzato in tutto il luogo, va bene che il mio progetto di IEquipmentController prenda una dipendenza dal progetto CommonInterfaces ?

In alternativa

Forse posso avere il concreto EquipmentController a prendere la dipendenza da CommonInterfaces ... e poi solo il IEquipmentController definire un metodo che accede al buffer? Rimanendo così ignaro dei dettagli di implementazione (ed evita di passare per riferimento completamente)? Immagino che in questo modo le due interfacce ( IEquipmentController e ICircularBuffer ) non vengano legate insieme.

Qual è la mia migliore opzione qui? E in generale, ci sono mai situazioni in cui è una buona idea che un'interfaccia si assuma da un altro progetto solo per accedere ad un'altra interfaccia?

    
posta Snoop 09.06.2016 - 19:49
fonte

2 risposte

1

Ci sono due opzioni per questo tipo di dipendenza.

Dipendenza dell'interfaccia

È possibile definire un metodo sull'interfaccia controller che accetta un buffer. Ciò aumenta l'accoppiamento tra i moduli e può avere un effetto a catena in termini di dipendenze e modifiche al codice. Le implementazioni esistenti dovranno essere aggiornate e potrebbero non interessare al buffer.

Tutte le sottoclassi hanno un uso per il buffer? La parte "utilizza il buffer" di ciò che fa il controller? Se è così, questo può essere sensato.

Dipendenza del costruttore

Lascia le interfacce da solo e passa il buffer nel costruttore dell'implementazione. Questo evita l'accoppiamento dei moduli e l'aggiornamento delle classi esistenti.

Se solo alcune implementazioni riguardano il buffer o se è necessario limitare le modifiche tra i moduli, questa è una soluzione più efficace.

    
risposta data 09.06.2016 - 20:13
fonte
3

Because of how the CommonInterfaces is used all over the place, is it okay for my IEquipmentController's project to take a dependency on the CommonInterfaces project?

Certo che lo è. Questo è il punto centrale di un progetto come CommonInterfaces. Vuoi essere in grado di riutilizzare liberamente tali interfacce in una varietà di progetti.

Tuttavia, potresti prendere in considerazione la possibilità di restituire un'interfaccia più generica. Non perché si vuole evitare una dipendenza del progetto, ma perché si vuole evitare la perdita dei dettagli di implementazione. L'utente di IEquipmentController ha davvero bisogno di sapere che sta usando un ICircularBuffer ? ICircularBuffer probabilmente implementa (o dovrebbe implementare) IList . Forse ha senso restituire il buffer come elenco.

    
risposta data 09.06.2016 - 21:15
fonte

Leggi altre domande sui tag