Laut SOLID sollte die Schnittstelle nicht nur in einer anderen Datei, sondern auch in einer anderen Assembly erstellt werden.
Warum? Denn jede Änderung an einer Quelldatei, die in eine Assembly kompiliert wird, erfordert eine Neukompilierung der Assembly, und jede Änderung an einer Assembly erfordert eine Neukompilierung einer abhängigen Assembly. Wenn Sie also basierend auf SOLID eine Implementierung A durch eine Implementierung B ersetzen möchten, während die Klasse C von der Schnittstelle abhängt, muss ich den Unterschied nicht kennen, und Sie müssen sicherstellen, dass die Assembly mit I erstellt wird Daran ändert sich nichts, wodurch die Verwendungen geschützt werden.
"Aber es ist nur eine Neukompilierung", höre ich Sie protestieren. Das mag sein, aber in Ihrer Smartphone-App, die die Datenbandbreite Ihrer Benutzer schont. Laden Sie eine Binärdatei herunter, die sich geändert hat, oder laden Sie diese Binärdatei und fünf andere herunter, deren Code davon abhängt? Nicht jedes Programm ist so geschrieben, dass es von Desktop-Computern in einem LAN verwendet werden kann. Sogar in diesem Fall, in dem Bandbreite und Speicher günstig sind, können kleinere Patch-Versionen von Nutzen sein, da sie über Active Directory oder ähnliche Domänenverwaltungsebenen problemlos in das gesamte LAN übertragen werden können. Ihre Benutzer werden nur einige Sekunden auf die Anwendung warten, wenn sie sich das nächste Mal anmelden, anstatt ein paar Minuten, damit das Ganze erneut installiert werden kann. Ganz zu schweigen davon, dass je weniger Assemblys beim Erstellen eines Projekts neu kompiliert werden müssen, desto schneller erfolgt die Erstellung.
Nun zum Haftungsausschluss: Dies ist nicht immer möglich oder machbar. Am einfachsten ist es, ein zentrales "Schnittstellen" -Projekt zu erstellen. Dies hat seine eigenen Nachteile; Code wird weniger wiederverwendbar, da das Schnittstellenprojekt UND das Implementierungsprojekt in anderen Apps referenziert werden müssen, wobei die Persistenzschicht oder andere Schlüsselkomponenten Ihrer App wiederverwendet werden. Sie können dieses Problem überwinden, indem Sie die Schnittstellen in enger gekoppelte Assemblys aufteilen. Dann haben Sie jedoch mehr Projekte in Ihrer App, was einen vollständigen Build sehr schmerzhaft macht. Der Schlüssel ist das Gleichgewicht und die Beibehaltung des locker gekoppelten Designs. Normalerweise können Sie Dateien nach Bedarf verschieben. Wenn Sie also feststellen, dass eine Klasse viele Änderungen benötigt, oder dass regelmäßig neue Implementierungen einer Schnittstelle erforderlich sind (möglicherweise zur Verbindung mit neu unterstützten Versionen anderer Software),