Was wird als Code eines Drittanbieters angesehen?

15

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.

Songo
quelle
8
Kann der Abwähler bitte erklären, warum?
Songo
Ich habe von Software von Drittanbietern gehört, aber keinen Code von Drittanbietern. Die meisten Drittanbieter geben Ihnen ihren Quellcode nicht an.
Tulains Córdova

Antworten:

18

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.

M. Dudley
quelle
+1, um zu erklären, wann eine Hülle oder Fassade erforderlich sein kann.
Joshua Drake
Vielen Dank für die Antwort, aber in Bezug auf den letzten Absatz über Unit-Tests können Sie sich diese Frage ansehen , in der ich versuche, eine Klasse zu Unit-Testen, die direkt von einem Bibliotheks-Framework abhängig ist.
Songo
@Songo: Ihre Teststrategie sollte darin bestehen, einen Zend_MailSchein zu erstellen , den Sie an das zu testende LoggerObjekt ü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 zu Zend_Maileiner Schnittstelle wechseln und dann einen dünnen Wrapper erstellen, der die Schnittstelle implementiert und Zend_Mailalle ihre Aufrufe erbt oder nur delegiert.
M. Dudley
@emddudley na ja, aber ich suchte nach einer allgemeineren Lösung für das Problem in anderen Sprachen, die das Eingeben von Enten nicht unterstützen. Eigentlich war Ihre Lösung zum Umbrechen Zend_Mailmein 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?
Songo
@Songo: Ich denke, es ist sehr sprach- und bibliotheksspezifisch, und Sie müssen mit dem auskommen, was Ihre Plattform unterstützt. Manchmal kann es vorkommen, dass Sie beim Schreiben von Deckblättern stecken bleiben. Abhängigkeitsinjektion und Objektspott sind relativ neue Entwicklungen (2004?), Daher unterstützen sie nicht alle Sprachen und Bibliotheken sehr gut. Die "allgemeine Lösung", nach der Sie suchen, ist nur eine Denkweise: Wie können Sie Ihren Code für lose Kopplung und effektive Komponententests entwerfen?
M. Dudley
6

Das Ziel des Packens einer Bibliothek besteht darin, die Abhängigkeit Ihres eigenen Codes von dieser Bibliothek zu unterbrechen, um Folgendes zu ermöglichen:

  • Unit-Test - Sie müssen in der Lage sein, Ihren Code zu testen. Wenn Sie in einer Bibliothek nicht die Klassen verspotten oder Antworten erzwingen können, die Sie für Ihren Test benötigen, müssen Sie diese Bibliothek umschließen. Dies ist ein offensichtliches Problem und wahrscheinlich nicht der Fall, über den Sie sich wundern.
  • Ändern von Implementierungen - Als Autor des Codes müssen Sie wissen, welche Änderungen wahrscheinlich auf Sie zukommen und wie hoch die Kosten für die Vorbereitung dieser Änderungen im Vergleich zu ihrer Wahrscheinlichkeit sind. Können Sie von .NET zu JVM wechseln? Das ist schwierig und unwahrscheinlich. Es ist jedoch sehr wahrscheinlich, dass Sie in Zukunft die UI-Technologien oder XML-Engines ändern.

Das Isolieren von Bibliotheken und Frameworks von Drittanbietern ist nur eine Teilmenge des Isolierens von Änderungen.

Ben
quelle
Sehr guter Punkt über Unit-Tests. Ich sage nicht immer umbrechen, um Ihre Anwendung Unit-testen zu können, aber es ist eine gute Strategie, um Abhängigkeiten bei Bedarf zu entkoppeln.
Sergio Acosta
2

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.

Wyatt Barnett
quelle
2

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:

Bei der Computerprogrammierung ist eine Softwarekomponente eines Drittanbieters eine wiederverwendbare Softwarekomponente, die entwickelt wurde, um entweder frei vertrieben oder von einer anderen Stelle als dem ursprünglichen Anbieter der Entwicklungsplattform verkauft zu werden.

Patkos Csaba
quelle
1

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

Michael
quelle