[GO] Entwurfsmuster, das mit "Ich kann das aufgrund von Sprachspezifikationen tun" beginnt ①-Basics-

Am Anfang

Verschiedene Leute haben Artikel über GoF-Designmuster geschrieben, und ich lerne immer. Auf der anderen Seite richten sich diese Artikel jedoch an hochrangige Personen wie "Es gibt solche Vorzüge, wenn diese Klasse entworfen wird" und "Die herkömmliche Methode hat solche Probleme", diejenigen, die die Annahmen in gewissem Maße teilen können. Ich hatte den Eindruck, dass es sich um einen Artikel handelt, und erstens verstehen Anfänger wie ich nicht: "Ich kann aufgrund der Sprachspezifikationen so schreiben", "Wenn Sie eine Klasse wie diese entwerfen, funktioniert das Programm so." Ich glaube nicht, dass ich einen Artikel finden kann, der sich auf "was zuerst getan werden kann" konzentriert.

Dieses Mal habe ich also Designmuster in Java-Sprache gelernt als Thema verwendet und zuerst unter dem Gesichtspunkt "Java kann dies aufgrund der Sprachspezifikationen tun" entworfen. Schauen wir uns das Muster an.

Es mag vom Thema abweichen, aber da das hier behandelte Thema im Grunde Java ist, kann es bereits in anderen Sprachen angegeben werden (zum Beispiel Pythons __iter__) oder umgekehrt kann oder kann es nicht in anderen Sprachen durchgeführt werden. Trotzdem werde ich ein Beispiel für etwas geben, das nur mit einem ziemlich ausgeklügelten Schreibstil möglich ist (z. B. C ++ - Abhängigkeitsinjektion?). In diesem Sinne gibt es nicht mehr ein allen Sprachen gemeinsames Entwurfsmuster, und es kann Entwurfsmuster für jede Sprache geben. Ich bin jedoch mit verschiedenen Programmen nicht so vertraut und habe nicht die Fähigkeit, Entwurfsmuster in anderen Sprachen zu diskutieren. Daher werde ich nicht näher auf diesen Artikel eingehen. Ich werde nur "Ich kann es tun" vorstellen. Das ist eine lange Einführung, aber fangen wir an.

Grundkenntnisse ① Über die Arten von Variablen

Die im GoF-Entwurfsmuster behandelten Variablen können grob in die folgenden drei Typen unterteilt werden. Zusätzlich werden die Vor- und Nachteile von jedem wie folgt betrachtet.

Variable Wie benutzt man verdienen デverdienen
Ganzzahliger Typ (int,Boolescher Wert usw.) 8 8 8
Offizielle Klasse oder Grundtyp
(double,String etc.)
5 6 3
Selbstgemachte Klasse 2 3 3

Grundkenntnisse ② Umgang mit Variablen

Es gibt vier Möglichkeiten, mit Variablen innerhalb einer Methode umzugehen: Der Bereich, der behandelt werden kann, und die Punkte, die bei der Handhabung zu beachten sind, werden beschrieben. In Bezug auf die zu beachtenden Punkte habe ich das Gefühl, dass dies nicht zum Hauptthema des Artikels gehört, aber andererseits bin ich der Meinung, dass der Wert des Entwurfsmusters nur sichtbar wird, wenn ich die Merkmale verstehe, und werde es daher vorerst veröffentlichen.

Variablentyp Handhabbare Reichweite wichtiger Punkt
Lokale Variablen In der Methode Dies ist die am meisten empfohlene Verwendung. Wenn Sie jedoch eine große Klasse jedes Mal dynamisch mit einer neuen Klasse sichern, können sich die Berechnungskosten erhöhen. Wenden Sie sich daher an die Leistung.
Mitgliedsvariablen Innerhalb einzelner Instanzen
staticWenn Sie hinzufügen, werden alle Klassen gemeinsam genutzt.
Es ist eine globale Variable, deren Zugriff begrenzt ist. Erstellen Sie sie daher nicht unnötig. Verwenden Sie niemals Zählervariablen.
Streit Funktion Benutzerseite Versuchen Sie, den Status in der Funktion nicht so weit wie möglich zu ändern (falls beigefügt).const修飾子を付ける).また,複数ステータスを持つような大きなクラスをStreitにするのはなるべくやめましょう.
Rückgabewert Funktion Benutzerseite Geben Sie es wie das Argument nicht in einer sehr großen Klasse zurück.

Grundkenntnisse ③ Mitgliedsvariable / Funktionsmodifikator

Qualifikation Modifizierbar Wie benutzt man
static Mitgliedsvariablen/Funktion 2
public Mitgliedsvariablen/Funktion 2
plivate Mitgliedsvariablen/Funktion 2
protected Mitgliedsvariablen/Funktion 2
@Override Mitgliedsfunktion 2
abstract Mitgliedsfunktion Ah
final Mitgliedsfunktion Ah

Grundkenntnisse ④ Klassenmodifikator

Qualifikation Einfügeposition Wie benutzt man
extends Nach der Klassendeklaration Dies ist ein Modifikator zum Erben der folgenden Klasse. ist-Seien wir uns der Beziehung von a bewusst. Es kann nur eine Klasse geerbt werden.
abstract Vor der Klassendeklaration Dies ist ein Modifikator, der verhindert, dass Sie eine Instanz einer Klasse mit abstract erstellen. Sie können dies ohne es erben, aber fügen Sie es bei Bedarf hinzu, um Fehler zu reduzieren.
final Vor der Klassendeklaration Klassen mit final können nicht vererbt werden. Es ist kein Problem, wenn Sie dies auch nicht hinzufügen, aber fügen wir es der allerletzten Klasse hinzu, die Sie nicht überschreiben möchten.
implements Nach der Klassendeklaration Ein Modifikator zum Implementieren der Schnittstelle. können-Seien wir uns der Beziehung von do bewusst. Im Gegensatz zu Extends können mehrere Schnittstellen implementiert werden (Mehrfachvererbung).
inteface Anstelle der Klassendeklaration Eigentlich ist es kein Klassenmodifikator, aber es ist gut angeordnet, also hier. Ein Typ, der anstelle einer Klasse geschrieben werden kann und nur Methoden definieren kann. Der Unterschied zur abstrakten Klasse besteht darin, dass Sie keine Elementvariablen definieren können.

Sie können dies tun. (2) Dynamisches Umschalten von Methoden mithilfe der Vererbung

baseA.java


public class baseA {
	public void func() {}
}

A.java


public class A extends baseA {
	public void func() {System.out.println("A");}
}

A_.java


public class A_ extends baseA {
	public void func() {System.out.println("A_");}
}

Main.java


public class Main {
	public static void main(String[] args) {
		
		baseA a;				
		a = new A();
		a.func();
		
		baseA a_;
		a_= new A_();
		a_.func();
	}
}

Ausführungsergebnis


A
A_

Ich kann das nicht tun. ① Rufe eine Methode auf, die nicht in der übergeordneten Klasse implementiert ist

Kommentieren Sie die in der vorherigen baseA implementierte Funktion aus.

baseA.java


public class baseA {
	//public void func() {}
}

Dann wird dies aber kompiliert

OK.java


A a;				
a.func();

Dies führt zu einem Kompilierungsfehler.

NG.java


baseA a;				
a = new A();
a.func();

Seitdem im Schöpfungsprozess

Es tut mir leid, ich habe einen Entwurf veröffentlicht, der aufgrund eines Betriebsfehlers gerade erstellt wurde. Nach der Überprüfung scheint es, dass es nach der Veröffentlichung nicht mehr verfasst werden kann, daher werde ich den Artikel so schnell wie möglich fertigstellen. Bis dahin wird es für alle ein Chaos sein, aber danke für Ihre Zusammenarbeit.

Recommended Posts

Entwurfsmuster, das mit "Ich kann das aufgrund von Sprachspezifikationen tun" beginnt ①-Basics-
Formatübersicht der Formate, die mit gensim serialisiert werden können
Ich habe die Vorbehandlung untersucht, die mit PyCaret durchgeführt werden kann
Ich habe ein Plug-In erstellt, das "Daruma-san Fell" mit Minecraft ausführen kann