Ich habe es in der Sprache Go geschrieben, um das SOLID-Prinzip zu verstehen

Über das SOLID-Prinzip

Was ist das SOLID-Prinzip?

--SRP (Single Responsibility Prinzip) --OCP (offenes / geschlossenes Prinzip)

Es ist eine Abkürzung für.

Warum SOLID Prinzip?

Der Grund für die Anwendung von SOLID ist

--Resistent gegen Veränderung --Einfach zu verstehen

Kann erwähnt werden. Im Folgenden werde ich auf die Erläuterung der einzelnen Prinzipien und des Codes eingehen.

Über jedes Prinzip von SOLID

SRP (Prinzip der Einzelhaftung)

Erläuterung

Das Prinzip, dass es beim Ändern eines Moduls, einer Klasse, einer Funktion usw. keine mehrfachen Gründe geben sollte. Der Grund besteht darin, das Auftreten der folgenden Ereignisse zu verhindern

Code

schlechtes Beispiel

Eine Schnittstelle hat mehrere Verantwortlichkeiten für die Verwaltung von Mitarbeitern und die Speicherung von Mitarbeiterdaten.


type EmployeeWorkManage interface {
	calculatePay()
	reportHours()
	saveEmployee()
}

Nach der Verbesserung

Erstellen Sie separate Schnittstellen für die Verwaltung von Mitarbeitern und die Speicherung von Mitarbeiterdaten, sodass jeder eine Verantwortung trägt.


type EmployeeWorkManage interface {
	calculatePay()
	reportHours()
}

type EmployeeDataManage interface {
	saveEmployee()
}

OCP (offenes / geschlossenes Prinzip)

Erläuterung

Das Prinzip, dass es für Software-Erweiterungen geöffnet und für Änderungen geschlossen sein muss Auf diese Weise können Sie Ihr System skalieren, ohne von Änderungen betroffen zu sein.

Code

Durch Erstellen einer Schnittstelle mit dem Namen Tier und Erstellen einer Hundetyp- oder Katzentypmethode kann die Rindenmethode ausgeführt werden, ohne sich im Hauptprozess um den Hundetyp oder den Katzentyp zu kümmern. Wenn Sie einen neuen Vogel erstellen möchten, müssen Sie ihn nur hinzufügen, indem Sie ihn von der Tieroberfläche abhängig machen.


package main
import(
	"fmt"
)

type Animal interface {
	bark()
	eat()
}

type Dog struct {}

type Cat struct {}

func (d Dog) bark(){
	fmt.Println("Bow-wow")
}

func (d Dog) eat(){
	fmt.Println("Bakubaku")
}

func (c Cat) bark(){
	fmt.Println("Miau")
}

func (c Cat) eat(){
	fmt.Println("Mushamsha")
}

func main(){
	dog := Dog{}
	cat := Cat{}

	animals := []Animal{dog, cat}
	
	for _, animal := range animals {
		animal.bark()
	}

}

LSP (Riskovs Ersatzprinzip)

Erläuterung

Objekt vom Typ S: o1 T-Objekt: o2 Das Prinzip, dass S eine Ableitung von T ist, wenn sich irgendwann das Verhalten von P nicht ändert, wenn o1 anstelle von o2 für das mit T definierte Programm P verwendet wird.

Code

Da Go keine Vererbung hat, verstößt es nicht gegen das Ersatzprinzip von Riskoff und ist nicht bewusst (?)

ISP (Prinzip der Schnittstellentrennung)

Erläuterung

Das Prinzip, Sie nicht zu zwingen, sich auf unnötige Schnittstellen zu verlassen Gruppieren Sie nur relevante Schnittstellen und verlieren Sie die Abhängigkeit nicht verwendeter Methoden.

Code

schlechtes Beispiel

Wenn Sie versuchen, einen Humanoiden aus der Tierschnittstelle zu erstellen, wie unten gezeigt, müssen Sie die Flugmethode beschreiben, die Sie nicht verwenden.


type AnimalInterface interface {
	fly()
	run()
	swim()
}

Nach der Verbesserung

Trennen Sie die Schnittstelle von Bird Interface für Vögel und Human Interface für Menschen. Auf diese Weise müssen Sie keine unnötigen Methoden schreiben.

type BirdInterface interface {
	fly()
}

type HumanInterface interface {
	run()
	swim()
}

type Bird struct {}
type Human struct{}

func (b Bird) fly(){
	fmt.Println("Fliege! !!")
}

func (h Human) run(){
	fmt.Println("Ich werde laufen ~")
}

func (h Human) swim(){
	fmt.Println("Schwimmen ~")
}

func main(){
	bird := Bird{}
	human := Human{}

	bird.fly()
	human.run()
}

DIP (Dependency Reversal Principle)

Erläuterung

Das Prinzip, sich nicht auf konkrete Module zu verlassen, die häufig geändert werden (Module, in denen Funktionsimplementierungen geschrieben sind) Vermeiden Sie es, sich auf veränderbare Konkretheit zu verlassen, und verlassen Sie sich auf eine stabile abstrakte Schnittstelle. Verwenden Sie das Abstract Factory-Muster, um auf die abstrakte Schnittstelle zu verweisen.

Code

Wenn Sie sich auf Abstract Factory verlassen, ist die Abhängigkeit wie in der Abbildung gezeigt, und die Benutzerdaten können erfasst werden, ohne sich um DB oder Text kümmern zu müssen.

Untitled Diagram.png


package main
import(
	"fmt"
)

type User struct {
	id int
	name string
}

type AbstractFactory interface {
	getData() User
}

type DbManage struct {}

func (db DbManage) getData() User {
	return User{1, "DB TARO"}
}

type TextManage struct {}

func (text TextManage) getData() User {
	return User{2, "TEXT JIRO"}
}

func getUserData(manageType string) User {
	var manageFactry AbstractFactory
	switch manageType {
	case "DB":
		manageFactry = DbManage{}
		return manageFactry.getData()
	case "TEXT":
		manageFactry = TextManage{}
		return manageFactry.getData()
	default:
		return User{3, "Anonym"}
	}
}

func main(){
	user := getUserData("DB")
	fmt.Println(user.id, user.name)
}



Referenz

https://labs.septeni.co.jp/entry/2017/02/21/164127 https://maroyaka.hateblo.jp/entry/2017/05/22/165355 https://qiita.com/shunp/items/646c86bb3cc149f7cff9 https://golangvedu.wordpress.com/2017/01/31/golang-design-pattern-abstract-factory-and-factory-method/

Schließlich

Irgendwie habe ich das Gefühl, das SOLID-Prinzip zu verstehen. Wenn Sie Fragen oder Anregungen haben, würden wir uns freuen, wenn Sie diese in die Kommentare schreiben könnten.

Recommended Posts

Ich habe es in der Sprache Go geschrieben, um das SOLID-Prinzip zu verstehen
Ich habe dir geschrieben, dass du das Signal mit Go sehen sollst
Beachten Sie, dass ich den Algorithmus der kleinsten Quadrate verstehe. Und ich habe es in Python geschrieben.
Ich habe die Warteschlange in Python geschrieben
Ich habe den Stack in Python geschrieben
Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben
Schriftliche Auswahlsortierung in C.
Ich habe den Gleitflügel in der Schöpfung geschrieben.
Zum ersten Mal in Numpy werde ich es von Zeit zu Zeit aktualisieren
Beachten Sie, dass ich den Algorithmus des maschinell lernenden Naive Bayes-Klassifikators verstehe. Und ich habe es in Python geschrieben.
Geschrieben "Einführung in die Effektüberprüfung" in Python
Ich möchte den Fortschritt in Python anzeigen!
Ich habe die Größenänderung von TensorFlow nicht verstanden und sie daher visuell zusammengefasst.
django geodjango Ich habe mich darauf bezogen, als ich im Tutorial feststeckte (Bearbeitung)
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Ich möchte die Grundlagen von Bokeh vollständig verstehen
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Python: Kann in Lambda wiederholt werden
Ich möchte R-Datensatz mit Python verwenden
Ich möchte die Variablen in der Python-Vorlagendatei ersetzen und in einer anderen Datei in Massenproduktion herstellen
Was ich getan habe, als ich wütend war, es mit der Option enable-shared einzufügen
[Einführung] Ich habe versucht, es selbst zu implementieren, während ich erklärte, um die Dichotomie zu verstehen
Ich habe ein CLI-Tool in der Sprache Go geschrieben, um Qiitas Tag-Feed in CLI anzuzeigen
Ich habe versucht, es sorgfältig zu verstehen, während ich den Algorithmus Adaboost beim maschinellen Lernen implementiert habe (+ ich habe mein Verständnis der Array-Berechnung vertieft)
Ich habe die Grundoperation von Seaborn im Jupyter Lab geschrieben
Ich habe versucht, den in Pandas häufig verwendeten Code zusammenzufassen
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
PyTorchs Buch war schwer zu verstehen, deshalb habe ich es ergänzt
Ich habe ein Skript geschrieben, um eine beliebte Seite in Japan zu bekommen
Ich habe versucht, die im Geschäftsleben häufig verwendeten Befehle zusammenzufassen
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Ich kann mich mit Django 3 nicht auf der Admin-Seite anmelden
Ich habe die Grundoperation von Numpy im Jupyter Lab geschrieben.
Ich möchte den Wörterbuchtyp in der Liste eindeutig machen
Ich verstehe Python auf Japanisch!
Ich möchte die gültigen Zahlen im Numpy-Array ausrichten
Ich möchte die Legende der IT-Technologiewelt kennenlernen
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Eine Geschichte, nach der ich süchtig war, als ich in Go nil als Funktionsargument angab
Ich habe ein Skript geschrieben, das das Bild in zwei Teile teilt
Ich wollte den AWS-Schlüssel nicht in das Programm schreiben
Verschrotten Sie die Liste der Go To EAT-Mitgliedsgeschäfte in der Präfektur Fukuoka und konvertieren Sie sie in CSV
Ich konnte die Zaunreparatur von Arimoto nicht leicht verstehen, daher werde ich sie im Detail verfolgen.
Teil 1 Ich habe die Antwort auf das Referenzproblem geschrieben, wie man in Python in Echtzeit offline schreibt
Verschrotten Sie die Liste der Go To EAT-Mitgliedsspeicher in der Präfektur Niigata und konvertieren Sie sie in CSV
Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu beschreiben
[Linux] Ich möchte das Datum wissen, an dem sich der Benutzer angemeldet hat
Ich habe Django-Befehle geschrieben, um das Debuggen von Sellerie-Aufgaben zu vereinfachen
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Ich habe eine Funktion zum Laden des Git-Erweiterungsskripts in Python geschrieben
LINEbot-Entwicklung möchte ich den Betrieb in der lokalen Umgebung überprüfen
Ich habe ein Skript geschrieben, um Webseiten-Links in Python zu extrahieren
Ich möchte eine Pipfile erstellen und im Docker wiedergeben
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Ich möchte die zweite Zeile zum Spaltennamen in Pandas machen
Ich möchte den G-Test in einem Monat Tag 1 bestehen
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen