Inspiriert von dieser Frage Verwenden Sie Bibliotheken von Drittanbietern - verwenden Sie immer einen Wrapper? Ich wollte wissen, was die Leute eigentlich als Bibliotheken von Drittanbietern betrachten.
Beispiel aus PHP:
Wenn ich eine Anwendung mit Zend Framework erstelle, sollte ich Zend Framework-Bibliotheken als Code von Drittanbietern behandeln?
Beispiel aus C #:
Wenn ich eine Desktop-Anwendung erstelle, sollte ich dann alle .Net-Klassen als Code eines Drittanbieters behandeln?
Beispiel aus Java:
Soll ich alle Bibliotheken im JDK als Bibliotheken von Drittanbietern behandeln?
Einige Leute sagen, wenn eine Bibliothek stabil ist und sich nicht oft ändert, muss man sie nicht einpacken. Ich verstehe jedoch nicht, wie man eine Klasse testen kann, die von einem Code eines Drittanbieters abhängt, ohne ihn zu umbrechen.
Antworten:
Bei Ihren Beispielen handelt es sich ausschließlich um Code von Drittanbietern, Sie sollten jedoch keine Wrapper dafür schreiben. Es sind große, ausgereifte Projekte mit stabilen und gut geplanten APIs.
Wrapper müssen eine Abstraktionsebene zwischen Ihrem Code und der Bibliothek bereitstellen. Sie benötigen diese Abstraktion nur, wenn Sie feststellen, dass eine Bibliothek keine guten APIs für das, was Sie gerade tun, bereitstellt. Dann können Sie den Wrapper erstellen, um Ihren eigenen Code zu vereinfachen und die Tatsache zu verbergen, dass die API-Aufrufe umständlich sind.
Ihr Code kann getestet werden, wenn Sie die Abhängigkeitsinjektion verwenden. In Ihren Komponententests können Sie die Bibliotheksabhängigkeit durch ein Scheinobjekt ersetzen, um den zu testenden Code zu isolieren.
quelle
Zend_Mail
Schein zu erstellen , den Sie an das zu testendeLogger
Objekt übergeben. Unterstützt PHP nicht Duck Typing? Wenn ja, sollte es nicht trivial sein, ein Scheinobjekt zu erstellen ...? Ich kenne PHP nicht wirklich, aber Sie können sich Beispiele aus PHP-Spottbibliotheken ansehen, um zu sehen, wie das normalerweise gemacht wird. In Sprachen, die das Eingeben von Enten nicht unterstützen, müssten Sie meines Erachtens zuZend_Mail
einer Schnittstelle wechseln und dann einen dünnen Wrapper erstellen, der die Schnittstelle implementiert undZend_Mail
alle ihre Aufrufe erbt oder nur delegiert.Zend_Mail
mein erster Gedanke, aber wie Sie in meinem ursprünglichen Beitrag sehen können, bevor ich ihn bearbeitete, habe ich eine Schnittstelle und einen Umbruch verwendet, die es implementieren. Der einzige existierende Zweck des Wrappers ist jedoch, dass ich seine Schnittstelle verspotten kann. Ist das in Sprachen üblich, die das Tippen von Enten nicht unterstützen? Ich meine, ich baue unendlich viele Wrapper?Das Ziel des Packens einer Bibliothek besteht darin, die Abhängigkeit Ihres eigenen Codes von dieser Bibliothek zu unterbrechen, um Folgendes zu ermöglichen:
Das Isolieren von Bibliotheken und Frameworks von Drittanbietern ist nur eine Teilmenge des Isolierens von Änderungen.
quelle
Ich würde Mitglieder der Standardbibliothek nicht als Code von Drittanbietern behandeln - sie sind schließlich Standard und es wird davon ausgegangen, dass sie auf der von Ihnen verwendeten Plattform verfügbar und funktionsfähig sind.
Was so etwas wie Zend betrifft, denke ich, dass man es nicht einpacken würde - Sie müssten wahrscheinlich das Programm neu schreiben, wenn Sie ein anderes Framework verwenden würden. Um ehrlich zu sein, würde ich nicht viel einpacken, was keine ernsthafte externe Konfigurationsabhängigkeit ist oder wenn ich nicht wirklich vorhabe, dieses Teil austauschbar zu machen.
quelle
Ich würde Bibliotheken, die von einer bestimmten Programmiersprache bereitgestellt werden, nur als Teil der Sprache betrachten.
Als Drittanbieter betrachte ich alle Bibliotheken, die von einer anderen Entität bereitgestellt werden, als Erweiterung oder als separates Tool von der Programmiersprache selbst.
Wenn ich Ihr Beispiel nehme, würde ich Zend als eine dritte Partei betrachten. Ich würde meine Anwendung auch so konstruieren, dass meine Kerngeschäftslogik nicht von Zend abhängt.
Wikipedia definiert Komponenten von Drittanbietern als:
quelle
Im strengsten Sinne ist jedes Beispiel, das Sie angegeben haben, Code von Drittanbietern. Es sollte jedoch nicht der gesamte Code von Drittanbietern umgebrochen werden. Alle Bibliotheken von Drittanbietern sollten eingeschlossen werden. Frameworks können per Definition nicht verpackt werden, da sie Bestandteil Ihres Codes werden. Aus diesem Grund würden Sie Ihre Protokollbibliothek umschließen, jedoch nicht das .NET Framework oder das Zend Framework. Sie können Ihren Code nicht wirklich von .NET trennen - sie sind miteinander verflochten. Gute Frameworks haben natürlich Schnittstellen, mit denen Sie programmieren können, sodass Sie das Problem bis zu einem gewissen Grad umgehen können.
Siehe auch: /programming/148747/was-ist-der- Unterschied- zwischen-einem- Framework-und-einer-Bibliothek
quelle