Ich hatte im Allgemeinen weitaus mehr Wartungsprobleme mit reinen Schnittstellen als mit ABCs, selbst mit ABCs, die mehrfach vererbt wurden. YMMV - keine Ahnung, vielleicht hat unser Team sie nur unzureichend eingesetzt.
Wenn wir jedoch eine reale Analogie verwenden, wie viel Nutzen haben reine Schnittstellen, denen Funktionalität und Status völlig fehlen? Wenn ich als Beispiel USB verwende, ist das eine ziemlich stabile Schnittstelle (ich denke, wir haben jetzt USB 3.2, aber die Abwärtskompatibilität wurde beibehalten).
Es ist jedoch keine zustandslose Schnittstelle. Es ist nicht ohne Funktionalität. Es ist eher eine abstrakte Basisklasse als eine reine Schnittstelle. Es ist tatsächlich näher an einer konkreten Klasse mit sehr spezifischen Funktions- und Statusanforderungen, wobei die einzige Abstraktion das ist, was als einziger austauschbarer Teil in den Port eingesteckt wird.
Andernfalls wäre es nur eine "Lücke" in Ihrem Computer mit einem standardisierten Formfaktor und viel geringeren funktionalen Anforderungen, die nichts für sich tun würden, bis sich jeder Hersteller eine eigene Hardware ausgedacht hätte, um dieses Loch zu veranlassen, zu welchem Zeitpunkt etwas zu tun es wird ein viel schwächerer Standard und nichts weiter als ein "Loch" und eine Spezifikation dessen, was es tun soll, aber keine zentrale Bestimmung, wie es getan werden soll. In der Zwischenzeit stehen uns möglicherweise 200 verschiedene Möglichkeiten zur Verfügung, nachdem alle Hardwarehersteller versucht haben, ihre eigenen Möglichkeiten zu finden, um die Funktionalität und den Status dieser "Lücke" festzulegen.
Und zu diesem Zeitpunkt haben wir möglicherweise bestimmte Hersteller, die andere Probleme vorziehen. Wenn wir die Spezifikation aktualisieren müssen, stehen möglicherweise 200 verschiedene konkrete USB-Port-Implementierungen mit völlig unterschiedlichen Methoden zur Verfügung, um die Spezifikation zu lösen, die aktualisiert und getestet werden müssen. Einige Hersteller entwickeln möglicherweise De-facto-Standardimplementierungen, die sie untereinander teilen (Ihre analoge Basisklasse, die diese Schnittstelle implementiert), aber nicht alle. Einige Versionen sind möglicherweise langsamer als andere. Einige haben möglicherweise einen besseren Durchsatz, aber eine schlechtere Latenz oder umgekehrt. Einige verbrauchen möglicherweise mehr Batteriestrom als andere. Einige funktionieren möglicherweise nicht mit der gesamten Hardware, die mit USB-Anschlüssen kompatibel sein soll. Einige könnten erfordern, dass ein Kernreaktor angeschlossen wird, um zu arbeiten, der dazu neigt, seinen Benutzern eine Strahlenvergiftung zuzufügen.
Und das habe ich persönlich mit reinen Schnittstellen gefunden. In einigen Fällen können sie sinnvoll sein, z. B. um den Formfaktor eines Motherboards anhand eines CPU-Gehäuses zu modellieren. Formfaktor-Analogien sind in der Tat so gut wie zustandslos und funktionslos wie das analoge "Loch". Aber ich halte es oft für einen großen Fehler für Teams, das in jedem Fall als überlegen zu betrachten, nicht einmal als nahe.
Im Gegenteil, ich denke, weitaus mehr Fälle lassen sich mit ABCs besser lösen als mit Schnittstellen, wenn dies die beiden Möglichkeiten sind, es sei denn, Ihr Team ist so gigantisch, dass es eigentlich wünschenswert ist, über das analoge Äquivalent von 200 konkurrierenden USB-Implementierungen zu verfügen, anstatt über einen zentralen Standard pflegen. In einem früheren Team, in dem ich war, musste ich tatsächlich hart kämpfen, nur um den Codierungsstandard zu lockern, um ABCs und Mehrfachvererbung zu ermöglichen, und zwar hauptsächlich als Reaktion auf diese oben beschriebenen Wartungsprobleme.