Ich habe mich in letzter Zeit mit "organisierterer" Programmierung befasst und gelernt, dass ich auf eine Schnittstelle programmieren sollte, nicht auf eine Implementierung. Wäre es in diesem Sinne besser, ein Projekt in Schnittstellen zu "skizzieren", bevor Sie, wo möglich, die Implementierung dafür schreiben?
Und wenn dies der Fall ist, sollte ich im Fall der Verwendung von Bibliotheken von Drittanbietern (z. B. Lidgren) diese ebenfalls in Schnittstellen einschließen und durch IOC-Container auflösen, oder ist es in Ordnung, sie für die Schnittstellen verfügbar zu machen?
Antworten:
Leider werden Sie feststellen, dass dies oft auf persönliche Vorlieben zurückzuführen ist.
Was Sie bisher beschrieben haben, scheint jedoch gut zu sein. Wenn Sie möchten (und ich empfehle es), können Sie den folgenden Ansatz verwenden:
Sie konzentrieren sich darauf, mehr "organisierten" Code zu schreiben. Das Befolgen von TDD hilft Ihnen dabei.
Einige zusätzliche Punkte:
quelle
Ja, Sie sollten eher gegen Schnittstellen als gegen bekannte Implementierungen programmieren, und ja, Sie sollten Schnittstellen zuerst konstruieren, anstatt sie aus Ihrem eigenen Code hervorgehen zu lassen.
Die Gründe für beide Empfehlungen sind weitgehend die gleichen: Bei der Computerprogrammierung geht es hauptsächlich um menschliche Faktoren. Viele finden das überraschend, aber denken Sie daran: Es gibt nahezu unendlich viele verschiedene Möglichkeiten, um dasselbe Computerproblem zu lösen, das gleichermaßen gut funktioniert. Fast alle von ihnen sind für jeden, der sie nicht geschrieben hat (oder in der Tat kurze Zeit später an den Autor), völlig unverständlich.
Daraus folgt, dass es beim guten Software-Engineering hauptsächlich darum geht, den gewünschten Effekt (korrekte Berechnung mit angemessener Effizienz) so zu erzielen, dass später mit dem Quellcode gearbeitet werden kann. Schnittstellen und APIs sind ein wesentlicher Bestandteil dieser Disziplin: Sie ermöglichen es Ihnen, ein Problem auf einer Beschreibungsebene gleichzeitig zu betrachten. Dies ist weitaus einfacher als das gleichzeitige Nachdenken über Geschäftskonsistenzregeln und über die Implementierung verknüpfter Listen. Daher ist es besser, eine solche Trennung von Bedenken zwangsweise durchzusetzen als es dem Client-Programmierer zu ermöglichen, Ihren Code nach Belieben zu verwenden.
Dies ist schwer zu glauben für viele Cowboy-Programmierer, die davon überzeugt sind, dass sie alles verstehen, was sie schreiben, viel besser als durchschnittliche Denker sind und die Komplexität bewältigen können, die "weniger" Programmierern Schwierigkeiten bereitet. Sich der eigenen kognitiven Grenzen nicht bewusst zu sein, ist ein äußerst verbreitetes Phänomen - deshalb sind Best Practices in der Code-Organisation so wichtig (und werden so oft ignoriert).
Um es zu wiederholen: Schnittstellen und API-Barrieren sind größtenteils gut , auch wenn Sie nur mit sich selbst zusammenarbeiten. Was externe Bibliotheken betrifft, sehe ich kein Problem darin, sie zu verwenden, wenn sie eine gut durchdachte API mitbringen, solange Sie nicht damit rechnen, diese Bibliothek gegen eine andere auszutauschen. Andernfalls kann eine Wrapper- oder Antikorruptionsschicht eine sehr gute Idee sein.
quelle
IBlah
implementiert vonBlah
oderBlah
implementiert vonBlahImpl
. Ich mag nicht beide, und neigen dazu , verwenden ,Blah
um implementiertOralBlah
,WrittenBlah
oderASLBlah
. Aber wie immer ist es wichtiger, sich an Ihre vorhandene Codebasis und Ihre Erwartungen zu halten, als an einen allgemeinen Standard.Warum nicht Test Driven Development / Design (TDD) untersuchen, anstatt nur auf Schnittstellen zu programmieren?
Viele Leute denken, TDD sei eine Testpraxis, aber tatsächlich ist es ein Entwurfsansatz, bei dem Sie Tests darüber informieren lassen, wie Ihr Code über Tests verwendet wird (zunächst über Komponententests, aber auch über Integrationstests).
Das Programmieren an Schnittstellen ist eine wichtige Waffe in Ihrem Toolset, aber wie die meisten Dinge ist es nicht immer die passende Lösung / Technik / Praxis, da es nicht immer benötigt wird. Sie sollten an Schnittstellen programmieren, an denen Sie müssen.
Wenn Sie TDD verwenden, müssen Sie herausfinden, wo solche Schnittstellen wichtig sind und wo es, ehrlich gesagt, keine Rolle spielt. Und am Ende sollten Sie ziemlich viele Unit-Tests in Ihrer Codebasis haben.
Für die Verwendung von Bibliotheken von Drittanbietern empfehle ich dringend, diese gegebenenfalls in Ihre eigenen Abstraktionen zu packen. und nicht die Kunden Ihrer API "wissen" lassen.
Viel Glück!
[edit: habe Megaflights Antwort gesehen - stimme vollkommen zu]
quelle
Ich denke, es ist übertrieben. Wenn der Benutzer Ihrer API nicht gezwungen werden muss, etwas auf eine bestimmte Weise zu implementieren / zu verwenden, würde ich es weglassen. Schnittstellen sind Verträge. Wenn ich sie nicht benötige, warum sollte ich dann einen geben?
Ich denke, die Leute überbeanspruchen Schnittstellen. Sie fügen eine Komplexitätsebene hinzu, die in den meisten Fällen nicht benötigt wird.
quelle
Programmieren gegen einen Vertrag ist fast immer eine gute Idee. Dieser Vertrag muss keine Schnittstelle sein, sondern kann von einer Klasse erfüllt werden. Meiner Meinung nach sind die Schnittstellen zusammen mit DI aufgrund von Bedenken in Bezug auf Komponententests und Spott-Frameworks etwas überlastet.
Ich persönlich bevorzuge es, Schnittstellen nur dann einzubringen, wenn ich höchstwahrscheinlich mehr als eine Implementierung eines Vertrags haben oder haben könnte. Schnittstellen eignen sich hervorragend für Repositorys, in denen ich den Datenzugriff abstrahieren möchte, aber wahrscheinlich weniger für meine Standard-Geschäftslogik, die wahrscheinlich relativ unflexibel ist.
Das Fehlen einer Schnittstelle kann insbesondere Puristen Probleme beim Testen von Einheiten bereiten. Aber ich bin daran interessiert, die externen Abhängigkeiten meiner Programme zu verspotten, nicht die internen Abhängigkeiten. Ich möchte, dass meine Tests eine Validierung des Codes durchführen und nicht die Codestruktur wiedergeben.
quelle