Sto studiando i principi SOLID e ho una domanda sulla gestione delle dipendenze in relazione alle interfacce.Puoi avere un'interfaccia dipendente da una classe?
Un esempio dal libro che sto leggendo (Codice Adaptive tramite C# da Gary McLean Hall) mostra una classe TradeProcessor
che otterrà i dati commerciali, di processo, e memorizzare nel database. I dati commerciali sono modellati da una classe chiamata TradeRecord
. Una classe TradeParser
gestirà la conversione dei dati commerciali ricevuti in una o più istanze di TradeRecord
. La classe TradeProcessor
fa riferimento solo all'interfaccia ITradeParser
in modo che non dipenda dall'implementazione TradeParser
.
L'autore ha il metodo Parse
(nell'interfaccia ITradeParser
) restituisce una raccolta IEnumerable<TradeRecord>
che contiene i dati commerciali elaborati. Ciò non significa che ITradeParser
ora dipende dalla classe TradeRecord
?
L'autore non ha dovuto fare qualcosa come fare un'interfaccia ITradeRecord
e avere Parse
restituire una raccolta di istanze ITradeRecord
? O mi manca qualcosa di importante?
Ecco il codice (l'implementazione di TradeRecord
è irrilevante per cui viene omesso):
TradeProcessor.cs
public class TradeProcessor
{
private readonly ITradeParser tradeParser;
public TradeProcessor(ITradeParser tradeParser)
{
this.tradeParser = tradeParser;
}
public void ProcessTrades()
{
IEnumerable<string> tradeData = "Simulated trade data..."
var trades = tradeParser.Parse(tradeData);
// Do something with the parsed data...
}
}
ITradeParser.cs
public interface ITradeParser
{
IEnumerable<TradeRecord> Parse(IEnumerable<string> tradeData);
}
Nota anche: l'autore sostiene di mantenere le interfacce e le loro implementazioni in un assieme separato (ad esempio il modello di scala). Se seguo quel modello, 'TradeRecord' dovrebbe essere presente in entrambi gli assembly o dovrei avere un riferimento dall'assembly di implementazione all'assembly di implementazione (creando così un riferimento circolare). –
In realtà l'implementazione di TradeRecord è rilevante. Se questa è pura classe di dati (contiene solo proprietà senza alcuna logica), quindi non ci sono molte ragioni per intorciare l'interfaccia per esso. – Evk
Penso che sia perché TradeRecord è solo un semplice oggetto DTO. Ofcourse puoi creare un'interfaccia per questa classe ma creeresti interfacce per ogni altra classe che crei? Puoi trattare la tua classe TradeRecord come un contratto. – MistyK