Je l'ai écrit en langage Go pour comprendre le principe SOLID

À propos du principe SOLID

Quel est le principe SOLID?

--SRP (principe de responsabilité unique) --OCP (principe ouvert / fermé) --LSP (principe de remplacement de Riskov) --ISP (Principe de séparation d'interface) --DIP (principe d'inversion de dépendance)

C'est un acronyme pour.

Pourquoi le principe SOLID?

La raison d'appliquer SOLID est

――Résistant au changement --Facile à comprendre

Peut être mentionné. Dans ce qui suit, je vais aborder l'explication de chaque principe et le code.

À propos de chaque principe de SOLID

SRP (Principe de la responsabilité unique)

Explication

Le principe selon lequel il ne devrait pas y avoir de raisons multiples lors du changement d'un module, d'une classe, d'une fonction, etc. La raison est d'éviter que les événements suivants ne se produisent

code

mauvais exemple

Une interface a plusieurs responsabilités pour gérer les employés, stocker les données des employés.


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

Après amélioration

Créez des interfaces distinctes pour gérer les employés et stocker les données des employés afin que chacun ait une responsabilité.


type EmployeeWorkManage interface {
	calculatePay()
	reportHours()
}

type EmployeeDataManage interface {
	saveEmployee()
}

OCP (principe ouvert / fermé)

Explication

Le principe selon lequel il doit être ouvert aux extensions logicielles et fermé aux modifications De cette façon, vous pouvez faire évoluer votre système sans être affecté par les changements.

code

En créant une interface appelée Animal et en créant un type de chien ou une méthode de type de chat en fonction de celui-ci, la méthode d'aboiement peut être exécutée sans se soucier du type de chien ou de type de chat dans le processus principal. De plus, si vous souhaitez créer un nouvel oiseau, il vous suffit de l'ajouter en le rendant dépendant de l'interface Animal.


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("Miaou")
}

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

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

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

}

LSP (principe de remplacement de Riskov)

Explication

Objet de type S: o1 Objet de type T: o2 Le principe selon lequel S est une dérivée de T si, à un moment donné, le comportement de P ne change pas lorsqu'on utilise o1 au lieu de o2 pour le programme P défini à l'aide de T.

code

Puisque Go n'a pas d'héritage, il ne viole pas le principe de remplacement de Riskoff et n'est pas conscient (?)

ISP (Principe of Interface Separation)

Explication

Le principe de ne pas vous obliger à vous fier à des interfaces inutiles Regroupez uniquement les interfaces pertinentes et perdez la dépendance des méthodes inutilisées.

code

mauvais exemple

Si vous essayez de créer un humanoïde à partir de l'interface animale ci-dessous, vous devrez décrire la méthode de vol que vous n'utilisez pas.


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

Après amélioration

Séparez l'interface de l'interface oiseau pour les oiseaux et de l'interface humaine pour les humains. Ce faisant, vous n'avez pas à écrire de méthodes inutiles.

type BirdInterface interface {
	fly()
}

type HumanInterface interface {
	run()
	swim()
}

type Bird struct {}
type Human struct{}

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

func (h Human) run(){
	fmt.Println("Je vais courir ~")
}

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

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

	bird.fly()
	human.run()
}

DIP (principe d'inversion de dépendance)

Explication

Le principe de ne pas s'appuyer sur des modules concrets fréquemment modifiés (modules dans lesquels les implémentations de fonctions sont écrites) Évitez de vous fier au caractère concret modifiable et comptez sur une interface abstraite stable. Utilisez le modèle Abstract Factory pour faire référence à l'interface abstraite.

code

En s'appuyant sur Abstract Factory, la dépendance sera comme indiqué sur la figure, et les données de l'utilisateur peuvent être acquises sans se soucier ni de la base de données ni du texte.

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, "Anonyme"}
	}
}

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



référence

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/

finalement

D'une manière ou d'une autre, j'ai l'impression de comprendre le principe SOLID. Si vous avez des questions ou des suggestions, nous vous serions reconnaissants de bien vouloir les écrire dans les commentaires.

Recommended Posts

Je l'ai écrit en langage Go pour comprendre le principe SOLID
Je t'ai écrit pour regarder le signal avec Go
Notez que je comprends l'algorithme des moindres carrés. Et je l'ai écrit en Python.
J'ai écrit la file d'attente en Python
J'ai écrit la pile en Python
J'ai écrit le code pour écrire le code Brainf * ck en python
Tri sélect écrit en C
J'ai écrit l'aile coulissante dans la création.
Pour la première fois dans Numpy, je vais le mettre à jour de temps en temps
Notez que je comprends l'algorithme du classificateur Naive Bayes. Et je l'ai écrit en Python.
J'ai écrit "Introduction à la vérification des effets" en Python
Je veux afficher la progression en Python!
Je n'ai pas compris le redimensionnement de TensorFlow, alors je l'ai résumé visuellement.
django geodjango auquel j'ai fait référence quand je suis resté coincé dans le tutoriel (édition)
J'ai essayé de représenter graphiquement les packages installés en Python
Je veux bien comprendre les bases de Bokeh
Je veux écrire en Python! (3) Utiliser des simulacres
Python: peut être répété en lambda
Je veux utiliser le jeu de données R avec python
Je veux remplacer les variables dans le fichier de modèle python et le produire en masse dans un autre fichier
Ce que j'ai fait quand j'étais en colère de le mettre avec l'option enable-shared
[Introduction] J'ai essayé de l'implémenter moi-même tout en expliquant pour comprendre la dichotomie
J'ai écrit un outil CLI en langue Go pour afficher le flux de balises de Qiita dans CLI
J'ai essayé de bien le comprendre en implémentant l'algorithme Adaboost en machine learning (+ j'ai approfondi ma compréhension du calcul de tableaux)
J'ai écrit le fonctionnement de base de Seaborn dans Jupyter Lab
J'ai essayé de résumer le code souvent utilisé dans Pandas
J'ai essayé d'illustrer le temps et le temps du langage C
Le livre de PyTorch était difficile à comprendre, alors je l'ai complété
J'ai écrit un script pour obtenir un site populaire au Japon
J'ai essayé de résumer les commandes souvent utilisées en entreprise
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
Je n'arrive pas à me connecter à la page d'administration avec Django 3
J'ai écrit le fonctionnement de base de Numpy dans Jupyter Lab.
Je veux rendre le type de dictionnaire dans la liste unique
Je comprends Python en japonais!
Je veux aligner les nombres valides dans le tableau Numpy
Je veux connaître la légende du monde des technologies informatiques
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
Une histoire à laquelle j'étais accro en spécifiant nil comme argument de fonction dans Go
J'ai écrit un script qui divise l'image en deux
Je ne voulais pas écrire la clé AWS dans le programme
Gratter la liste des magasins membres Go To EAT dans la préfecture de Fukuoka et la convertir en CSV
Je ne pouvais pas comprendre facilement Fence Repair of Arimoto, donc je vais le suivre en détail.
Partie 1 J'ai écrit la réponse au problème de référence de l'écriture hors ligne en temps réel en Python
Gratter la liste des magasins membres Go To EAT dans la préfecture de Niigata et la convertir en CSV
J'ai essayé de décrire le trafic en temps réel avec WebSocket
[Linux] Je souhaite connaître la date à laquelle l'utilisateur s'est connecté
J'ai écrit des commandes Django pour faciliter le débogage des tâches Celery
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
J'ai écrit une fonction pour charger le script d'extension Git en Python
Développement LINEbot, je souhaite vérifier le fonctionnement dans l'environnement local
J'ai écrit un script pour extraire les liens de pages Web en Python
Je veux créer un fichier pip et le refléter dans le menu fixe
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
Je veux faire de la deuxième ligne le nom de la colonne dans pandas
Je veux réussir le test G dans un mois Jour 1
Créez une fonction pour obtenir le contenu de la base de données dans Go