Abstraktionen (abstrakte Typen und Schnittstellen)
Hinweis
Diese Inhalte wurden mit Genehmigung von Pearson Education, Inc. aus Framework Design Guidelines nachgedruckt: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Diese Ausgabe wurde 2008 veröffentlicht, und das Buch wurde seitdem in der dritten Ausgabe vollständig überarbeitet. Einige der Informationen auf dieser Seite sind möglicherweise veraltet.
Eine Abstraktion ist ein Typ, der einen Vertrag beschreibt, aber keine vollständige Implementierung des Vertrags bereitstellt. Abstraktionen werden normalerweise als abstrakte Klassen oder Schnittstellen implementiert und verfügen über eine klar definierte Sammlung von Referenzdokumentation, die die erforderliche Semantik der Typen beschreibt, die den Vertrag implementieren. Zu den wichtigsten Abstraktionen in .NET Framework zählen Stream, IEnumerable<T> und Object.
Sie können Frameworks erweitern, indem Sie einen konkreten Typ implementieren, der den Vertrag einer Abstraktion unterstützt, und diesen konkreten Typ mit Framework-APIs verwenden, die die Abstraktion nutzen (mit ihr arbeiten).
Eine sinnvolle und nützliche Abstraktion, die dem Test der Zeit standhalten kann, ist sehr schwer zu entwerfen. Die Hauptschwierigkeit besteht darin, den richtigen Satz von Membern zu bestimmen, nicht mehr und nicht weniger. Wenn eine Abstraktion zu viele Member aufweist, ist die Implementierung schwierig oder sogar unmöglich. Wenn sie zu wenige Member für die versprochene Funktionalität enthält, wird Sie in vielen interessanten Szenarien unbrauchbar.
Zu viele Abstraktionen in einem Framework wirken sich auch negativ auf die Verwendbarkeit des Frameworks aus. Es ist oft ziemlich schwierig, eine Abstraktion zu verstehen, ohne zu verstehen, wie sie in das größere Bild der konkreten Implementierungen und der APIs passt, die mit der Abstraktion arbeiten. Außerdem sind die Namen von Abstraktionen und ihren Membern notwendigerweise abstrakt, wodurch Sie häufig kryptisch und unhandlich werden, ohne zunächst den umfassenderen Kontext ihrer Verwendung zu verstehen.
Abstraktionen bieten jedoch eine extrem leistungsfähige Erweiterbarkeit, mit der die anderen Erweiterungsmechanismen oft nicht mithalten können. Sie befinden sich im Kern vieler architektonischer Muster, z. B. von Plug-Ins, Inversion of Control (IoC), Pipelines usw. Sie sind auch für die Testfähigkeit von Frameworks äußerst wichtig. Gute Abstraktionen ermöglichen es, große Abhängigkeiten für Komponententests auszulagern. Zusammenfassend lässt sich sagen, dass Abstraktionen für den gesuchten Umfang der modernen objektorientierten Frameworks verantwortlich sind.
❌ Stellen Sie KEINE Abstraktionen bereit, es sei denn, sie werden getestet, indem Sie mehrere konkrete Implementierungen und APIs entwickeln, die die Abstraktionen nutzen.
✔️ WÄHLEN Sie beim Entwerfen einer Abstraktion sorgfältig zwischen einer abstrakten Klasse und einer Schnittstelle.
✔️ ERWÄGEN Sie, Referenztests für konkrete Implementierungen von Abstraktionen bereitzustellen. Solche Tests sollten Benutzern das Testen ermöglichen, ob ihre Implementierungen den Vertrag ordnungsgemäß implementieren.
Teile ©2005, 2009 Microsoft Corporation. Alle Rechte vorbehalten.
Nachdruck mit Genehmigung von Pearson Education, Inc aus Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition von Krzysztof Cwalina und Brad Abrams, veröffentlicht am 22. Oktober 2008 durch Addison-Wesley Professional als Teil der Microsoft Windows Development Series.