Ich untersuche SOLID-Prinzipien und habe eine Frage zum Abhängigkeitsmanagement in Bezug auf Schnittstellen.Kann eine Schnittstelle von einer Klasse abhängig sein?
Ein Beispiel aus dem Buch lese ich (Adaptive-Code über C# von Gary McLean Halle) zeigt eine TradeProcessor
Klasse, die die Handelsdaten erhalten wird, verarbeiten und speichern sie in der Datenbank. Die Handelsdaten werden von einer Klasse namens TradeRecord
modelliert. Eine TradeParser
Klasse verarbeitet die erhaltenen Handelsdaten in eine TradeRecord
Instanz (en). Die TradeProcessor
Klasse verweist nur auf eine ITradeParser
Schnittstelle, so dass sie nicht von der TradeParser
Implementierung abhängig ist.
Der Autor hat die Parse
Methode (in der ITradeParser
Schnittstelle) eine IEnumerable<TradeRecord>
Sammlung zurückgeben, die die verarbeiteten Handelsdaten enthält. Bedeutet das nicht, dass ITradeParser
nun von der Klasse TradeRecord
abhängig ist?
Sollte der Autor nicht etwas wie eine ITradeRecord
Schnittstelle gemacht haben und Parse
eine Sammlung von ITradeRecord
Instanzen zurückgeben? Oder vermisse ich etwas Wichtiges?
Hier ist der Code (die Implementierung von TradeRecord
ist irrelevant, so dass es weggelassen):
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);
}
Beachten Sie auch: der Autor befürwortet Schnittstellen und ihre Implementierungen in einer separaten Baugruppe (d. H. Das Stairway-Muster) zu halten. Wenn ich diesem Muster folge, müsste "TradeRecord" in beiden Assemblys vorhanden sein, oder ich müsste einen Verweis von der Implementierungsassembly auf die Implementierungsassembly haben (wodurch eine zirkuläre Referenz erstellt wird). –
Tatsächlich ist die Implementierung von TradeRecord relevant. Wenn es sich um eine reine Datenklasse handelt (enthält nur Eigenschaften ohne Logik), dann gibt es keinen Grund, die Schnittstelle dafür zu öffnen. – Evk
Ich denke, es ist, weil TradeRecord nur ein einfaches DTO-Objekt ist. Natürlich können Sie eine Schnittstelle für diese Klasse erstellen, aber würden Sie Schnittstellen für jede andere von Ihnen erstellte Klasse erstellen? Sie können Ihre TradeRecord-Klasse als Vertrag behandeln. – MistyK