[PYTHON] Zusammenfassung von Kapitel 2 der Einführung in Entwurfsmuster, die in Java gelernt wurden

Lange nicht gesehen. Es ist weiß. Neulich kennen leitende Ingenieure das Entwurfsmuster nicht! ?? Danach erhielt ich eine "Einführung in Designmuster, die in Java gelernt wurden", geschrieben von Hiroshi Yuki, und entschied mich zu studieren. Selbst wenn ich das Buch lese, kann ich mich nicht daran erinnern, deshalb habe ich beschlossen, es als Memorandum zu schreiben. Ich werde mein Bestes geben, damit ich das Rennen beenden kann. Darüber hinaus gibt es ein Beispielprogramm in "Einführung in in Java-Sprache erlernte Entwurfsmuster", das wir jedoch aus urheberrechtlichen Gründen weglassen werden. Bitte verstehe.

Letztes Mal habe ich einen Artikel über "Iteratormuster" geschrieben. Der vorherige Artikel ist unten. https://qiita.com/sirajirasajiki/items/55269e5d6c6e158de16e

Dieses Mal möchte ich das "Adaptermuster" beschreiben. Darüber hinaus gibt es ein Beispielprogramm in "Einführung in in Java-Sprache erlernte Entwurfsmuster", das wir jedoch aus urheberrechtlichen Gründen weglassen werden. Bitte verstehe.

Kapitel 2 Adapterabdeckung und Wiederverwendung

Ich denke, in Japan werden Elektrogeräte verwendet. Wenn Sie dieses elektrische Produkt in Übersee verwenden, ist die Spannung unterschiedlich, daher denke ich, dass ich einen Konverter für die Steckdose mitbringen werde. Auf diese Weise kann der bereits gelieferte Artikel nicht so verwendet werden, wie er ist, indem er in eine verwendbare Form konvertiert wird. Es wird gesagt, dass ein solches Konvertierungsmuster ein Adaptermuster genannt wird. "Einführung in in Java gelernte Entwurfsmuster"

Entwerfen Sie Muster, um den "Unterschied" zwischen "was bereits bereitgestellt ist" und "was Sie brauchen" zu überbrücken.

Es gab eine Beschreibung, die sagte. Dieses Adaptermuster wird auch als Wrapper-Muster bezeichnet.

Warum brauchst du so ein Muster?

Es gab eine Beschreibung in "Einführung in in Java-Sprache erlernte Entwurfsmuster", aber ich denke, es gibt eine Meinung, dass Sie diese zusätzlich erstellen können, wenn es eine erforderliche Methode gibt. Wenn Sie jedoch alle Methoden von Grund auf neu erstellen, erhöht sich der Zeit- und Arbeitsaufwand für das Testen erheblich.

Angenommen, Sie haben eine Methode, die Unixtime abruft und als int zurückgibt, und Sie möchten eine neue Methode, die Unixtime als Zeichenfolge zurückgibt. In einem so einfachen Beispiel ist das Umwandeln des Rückgabewerts der Methode als Zeichenfolgentyp in Ordnung. Nehmen wir jedoch an, Sie haben eine neue Methode erstellt, die die Zeit als Zeichenfolgentyp zurückgibt. Wenn bei dieser neu erstellten Methode ein Fehler auftritt, können Sie nicht nur an dem Teil erkennen, der die Zeit abruft, an dem Teil, der mit dem Zeichenfolgentyp umgewandelt wird, oder an dem Teil, bei dem der Fehler aufgetreten ist. ?? Wenn Sie jedoch eine Methode verwenden, die eine vorhandene Unixtime abruft und als int-Typ zurückgibt und eine neue Methode erstellt, die die Zeit als Zeichenfolgentyp zurückgibt und ein Fehler auftritt, wird die vorhandene Methode für den Fehler in dem Teil verwendet, der die Zeit erhält. Ich habe bestätigt, dass dies nicht der Fall ist, daher ist es leicht zu erkennen, dass das Casting von int zu string fehlschlägt. Wenn Sie eine Methode erstellen, müssen Sie nur die vorhandene Methode aufrufen, damit sie einfach implementiert werden kann. Auf diese Weise ist es durch Verwendung des Adaptermusters möglich, den Montageaufwand zu verkürzen und die Fehlerursachen zu verringern, die während der Montage auftreten.

Betrachten wir auch den Rückgabewert einer Methode, die eine vorhandene Unixtime abruft und als int-Typ zurückgibt, sodass sie als Zeichenfolgentyp umgewandelt wird. Wie unter "Einführung in in Java-Sprache erlernte Entwurfsmuster" erwähnt, ist es auch in diesem Fall besser, das Adaptermuster zu verwenden. Der Grund dafür ist, dass die vorhandene Implementierung geändert wird. Sie müssen daher den Teil, der diese Methode verwendet, erneut testen, sodass selbst eine kleine Änderung viel Testaufwand erfordert und verschwendet wird.

Es gab eine Beschreibung in "Einführung in in Java-Sprache erlernte Entwurfsmuster", aber wenn die Funktionen weit voneinander entfernt sind, bleibt keine andere Wahl, als eine neue Klasse zu erstellen. Das Bild ist wie folgt.

Aus einer Stromquelle mit 100 Volt Wechselstrom kann kein Leitungswasser erzeugt werden.

Adaptermustertyp

Es gibt zwei Arten dieses Adaptermusters. -Adaptermuster nach Klasse (unter Verwendung der Vererbung) -Adaptermuster nach Instanz (mit Übertragung) Ich möchte jedes Muster für das Beispiel beschreiben.

Beispiel

Wir erstellen einen Wrapper, der einen Zeichenfolgentyp mithilfe einer Klasse zurückgibt, die über eine Methode verfügt, die die Unixtime der Zeit abruft, zu der die Instanz erstellt wurde, und sie als int-Typ zurückgibt.

Adaptermuster nach Klasse

Klassen Diagramm

class.png

Dieses Klassendiagramm wird als PlantUML bezeichnet. Der PlantUML-Code, den ich geschrieben habe, befindet sich auf dem GitHub unten. Lesen Sie daher bitte Read Me, bevor Sie ihn verwenden. Der entsprechende Dateiname lautet class.txt. https://github.com/sirajirasajiki/design_pattern_uml/blob/master/adapter/class.txt

Einzelheiten zur Installation und Verwendung von PlantUML finden Sie im Anhang unten.

In Python basierend auf dem Klassendiagramm implementiert

Der unten implementierte Code ist verfügbar. Implementiert in Python 3.7. https://github.com/sirajirasajiki/design_pattern_python/tree/master/Adapter/class_case

Adaptermuster nach Instanz

Klassen Diagramm

Der Unterschied zum Adaptermuster in Abhängigkeit von der Klasse besteht darin, dass GetTime in GetTimeStr unterschiedlich verwendet wird. instance.png

Dieses Klassendiagramm wird als PlantUML bezeichnet. Der PlantUML-Code, den ich geschrieben habe, befindet sich auf dem GitHub unten. Lesen Sie daher bitte Read Me, bevor Sie ihn verwenden. https://github.com/sirajirasajiki/design_pattern_uml/blob/master/adapter/instance.txt

In Python basierend auf dem Klassendiagramm implementiert

Der unten implementierte Code ist verfügbar. Implementiert in Python 3.7. https://github.com/sirajirasajiki/design_pattern_python/tree/master/Adapter/instance_case

Zusammenfassung

Es stellte sich heraus, dass das Adaptermuster die Abweichung absorbiert, wenn sich das gewünschte Format von der vorhandenen Klasse unterscheidet.

Kapitel 2 Impressionen

Durch das Erstellen einer neuen Klasse unter Verwendung einer vorhandenen Implementierung kann die Anzahl der Schritte im Vergleich zum Erstellen einer neuen reduziert werden. Wenn in der neuen Implementierung ein Fehler auftritt, kann der Bereich der Fehlerursachen reduziert werden, sodass ich dachte, dass die Implementierung einfach wäre. Es war. Selbst eine einfache Änderung, die den Rückgabetyp ändert, führt dazu, dass der Test wiederholt wird, wenn die Änderung an der vorhandenen Implementierung vorgenommen wird. Ich verstehe daher, dass dieses Adaptermuster in solchen Fällen verwendet werden sollte. Es war.

Nachtrag Ich habe gehört, dass es besser ist, einen Wrapper zu erstellen, als einen Adapter. Von nun an werde ich sagen, dass ich einen Wrapper erstellen werde.

Schließlich

Wenn etwas nicht stimmt, wäre ich Ihnen dankbar, wenn Sie darauf hinweisen könnten! appendix

Nächster Artikel

https://qiita.com/sirajirasajiki/items/53e1d2aea166190f9a6f

Seite über PlantUML

Die folgenden Sites wurden bei der Installation von PlantUML berücksichtigt. https://qiita.com/kohashi/items/1d2c6e859eeac72ed926 Die folgenden Seiten wurden beim Schreiben von PlantUML berücksichtigt. https://qiita.com/ogomr/items/0b5c4de7f38fd1482a48

Änderungsprotokoll

2020/2/28 Teilweise aktualisierte Eindrücke und Beispiele. 2020/3/5 Der Anfangsteil wurde korrigiert.

Recommended Posts

Zusammenfassung von Kapitel 2 der Einführung in Entwurfsmuster, die in Java gelernt wurden
Kapitel 4 Zusammenfassung der Einführung in Entwurfsmuster, die in Java gelernt wurden
Zusammenfassung von Kapitel 3 der Einführung in Entwurfsmuster, die in Java gelernt wurden
Zusammenfassung von Anfang bis Kapitel 1 der Einführung in Entwurfsmuster, die in der Java-Sprache gelernt wurden
Zusammenfassung der Prototypmuster der Einführung in Entwurfsmuster, die in Java gelernt wurden
Singleton-Musterzusammenfassung der Einführung in Entwurfsmuster, die in Java gelernt wurden
[Von Zeit zu Zeit aktualisiert] Zusammenfassung der Entwurfsmuster in Java
Mit Java & PHP erlernte Entwurfsmuster (Zusammenfassung)
[Kapitel 5] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 6] Einführung in Scicit-Learn mit 100 Klopfen Sprachverarbeitung
[Kapitel 3] Einführung in Python mit 100 Klopfen Sprachverarbeitung
Entwurfsmuster in Python: Einführung
[Kapitel 2] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 4] Einführung in Python mit 100 Klopfen Sprachverarbeitung
Einführung in die in C Language Part 1 Server Edition erlernte Socket-API
Einführung in die Überprüfung der Wirksamkeit Kapitel 1 in Python geschrieben
Einführung in die Überprüfung der Wirksamkeit Kapitel 3 in Python geschrieben
100 Sprachverarbeitung Knock UNIX-Befehle in Kapitel 2
Zusammenfassung zum Importieren von Dateien in Python 3
100 Sprachverarbeitung Klopfen Sie auf reguläre Ausdrücke, die Sie in Kapitel 3 gelernt haben
Zusammenfassung der Verwendung von MNIST mit Python
100 Sprachverarbeitung klopft Morphologische Analyse in Kapitel 4 gelernt
Einführung in die Überprüfung der Wirksamkeit Kapitel 2 in Python geschrieben
Verstehen Sie Entwurfsmuster, indem Sie Implementierungen in JavaScript und Java vergleichen. [Von Zeit zu Zeit aktualisiert]
Zusammenfassung der Tools, die zum Analysieren von Daten in Python benötigt werden
Einführung in die Python-Sprache
[Einführung in Python] Zusammenfassung der Funktionen und Methoden, die häufig in Python vorkommen [Problemformat]
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Builder-Muster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Adaptermuster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Strategiemuster
Einführung in die Statistik Die University of Tokyo Press Kapitel 2 Übungen
Zusammenfassung zum Schreiben von in gRPC verwendeten .proto-Dateien
Einführung in die Socket-API in C Language 2nd Client Edition
[Einführung in cx_Oracle] Übersicht über cx_Oracle
Versuchen wir das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" - Kapitel 3 Schritt 10 Memo "Details und Verbesserung des neuronalen Netzes"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 2 Schritt 06 Memo "Identifier"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 2 Schritt 02 Memo "Vorverarbeitung"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 2 Schritt 07 Memo "Evaluation"
Einführung in die Socket-API in C-Sprache 3. TCP-Server / Client Nr. 1
So implementieren Sie Java-Code im Hintergrund von Red Hat (Linux ONE)
[Python] PCA-Scratch im Beispiel "Einführung in die multivariate Analysemethode"
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Muster der Vorlagenmethode
Ich habe versucht, in 3 Jahren 5 Muster der Analysebasis zu erstellen
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Fassadenmuster
Einführung in die in C-Sprache gelernte Socket-API 4. UDP Server / Client Edition Nr. 1
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" - Kapitel 4 Schritt 14 Memo "Hyperparametersuche"
Zusammenfassung des Schreibens von if-Anweisungen (Scala, Java, Rust, C-Sprache, C ++, Go-Sprache, PHP, Perl, Python, Ruby)
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 2 Schritt 04 Memo "Feature Extraction"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 4 Schritt 15 Memo "Datenerfassung"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" - Kapitel 3 Schritt 08 Memo "Einführung in neuronale Netze".
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 2 Schritt 05 Memo "Feature Quantity Conversion"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 3 Schritt 11 Memo "Worteinbettungen"
Leicht verständliche Erklärung der Python-Webanwendung (Django) auch für Anfänger (4) [Einführung in Routing-Einstellungen und MTV-Entwurfsmuster]
Zusammenfassung der Verwendung von pandas.DataFrame.loc
100 Sprachverarbeitung Knock Kapitel 1 in Python
[Einführung in Python3 Tag 13] Kapitel 7 Zeichenfolgen (7.1-7.1.1.1)
Zusammenfassung der Verwendung von pyenv-virtualenv
[Einführung in Python3 Tag 14] Kapitel 7 Zeichenfolgen (7.1.1.1 bis 7.1.1.4)
Einführung in Protobuf-c (C-Sprache ⇔ Python)
Einführung einer datengesteuerten Controller-Entwurfsmethode
Zusammenfassung verschiedener Operationen in Tensorflow