Mon nom est keita69sawada.
Le programmeur Java a essayé de toucher le langage Go (pour le moment), suivi par l'étude du langage Go.
Quand je l'ai conçu avec UML de la même manière que la conception de classe Java, je ne pouvais pas imaginer comment réaliser un traitement commun (méthode abstraite) car il n'y a pas d '"étend" en ** Go language **. .. ..
Ensuite, "Implémentons une conception de classe Java simple en langage Go!" Cet article était uni-uni.
Remplaçons un simple exemple par des extensions Java par le langage Go. Implémentons la méthode "squeal" dans les classes "dog" et "cat" qui héritent de "animal".
Ce n'est pas un UML strict, mais est-ce que c'est comme ça?
J'ai pensé à ces inquiétudes à ma manière.
J'ai comparé la structure du fichier source Java avec la structure du fichier source du langage Go.
Lorsqu'un programmeur Java décide de la structure du fichier source en regardant le diagramme de classes ci-dessus, je pense qu'il s'agit généralement d'une classe et d'un fichier.
organisation des fichiers
└─src
├─animal //dossier d'unité de package java
│ Animal.java //unité de classe Java
│ Cat.java
│ Dog.java
│
└─main
Main.java
Il a la même structure que la structure du fichier source Java. Cette fois ** osez ** la même chose.
organisation des fichiers
└─src
├─animal //aller dans le dossier d'unité de package
│ Animal.go //go n'a pas de concept de classe
│ Cat.go
│ Dog.go
│
└─main
Main.go
Il n'y a pas de concept de classes dans le langage Go, il n'est donc pas nécessaire de ** diviser les trois fichiers sources (Animal.go, Cat.go, Dog.go). ** (Cependant, les packages doivent être les mêmes)
Par exemple, il est grammaticalement correct de les combiner en un seul fichier comme suit. (C'est juste grammaticalement ...)
organisation des fichiers
└─src
├─animal
│ Animal_Cat_Dog.go //Il est grammaticalement acceptable de les combiner en un seul fichier source
│
└─main
Main.go
La ** ma propre réponse ** à "Que dois-je faire avec la division du fichier source du langage Go? (Concept de classe ou ...)" est la suivante.
** Les fichiers source de la langue Go doivent être faciles à gérer (détails non conflictuels) sur GitHub. ** **
** S'il est connu à l'avance que le nombre de fonctions similaires et non fonctionnelles (dans cet exemple, les types d'animaux (singes, renards, etc.)) augmentera, créez un fichier source pour chaque fonction. ** **
** Puisque le langage Go n'a pas d'héritage, créez un fichier source de base ("Animal.go" dans cet exemple) dans le dossier du package. ** **
Nous recherchons le meilleur moyen, alors veuillez commenter. (^ O ^) /
Jetons d'abord un coup d'œil à la source Java. Les animaux mettent en œuvre le comportement de l'écorce avec des méthodes abstraites.
Animal.java
package animal;
public abstract class Animal {
public abstract void bark();
}
Et la source du langage Go. Le langage Go n'a pas de méthode abstraite, donc implémente à la place le comportement de bark à l'interface.
** "Il n'y a pas de concept abstrait d'animal (un substitut à une classe)" **. ..
Animal.go
package animal
type Barker interface {
Bark(string)
}
Aussi, il semble que lorsque le début est capitalisé, il devient une portée publique.
Cela provient également de la source Java. La classe de chat a une voix de chat Il a un comportement d'aboiement.
Cat.java
package animal;
public class Cat extends Animal {
private String voice = "Nya Nya";
public void bark() {
System.out.println(this.voice);
}
}
Vient ensuite le langage Go.
Puisque le langage Go n'a pas le concept de classes, ** définissez un chat avec une structure et déclarez-le comme type de données de type cat. Cependant, le type de données ne peut pas avoir de valeur ("voice = Nya Nya") comme la classe Java.
Voici la ** méthode de type constructeur Java NewCat () **. Cette méthode donne une valeur ("Nya Nya") lors de la création d'une instance du type de données (Cat).
Ensuite, implémentez Bark () déclaré dans l'interface définie dans Animal.go. Le point ici est le récepteur. ** Les récepteurs sont «définis par la méthode pour les types de données» **. Ici, c'est une méthode de type de données (type Cat struct) (Bark ()).
Cat.go
package animal
import (
"fmt"
)
type Cat struct { //Structurer le chat(struct)Défini dans
voice string
}
func NewCat() *Cat { //Méthode de type constructeur Java
return &Cat{"Nya Nya"}
}
func (c Cat) Bark(){ //receveur
fmt.Println(c.voice)
}
Omis car il est identique à Cat.
Enfin, Main. Cela vient également de Java. Créer une instance de l'objet concret de Cat, Dog, Vous appelez la méthode (bark) définie dans l'interface (Animal).
Main.java
package main;
import animal.Cat;
import animal.Dog;
import animal.Animal;
public class Main {
public static void main(String[] args) {
Animal c = new Cat();
Animal d = new Dog();
c.bark();
d.bark();
}
}
Vient ensuite le langage Go. La conversion d'un objet concret (Cat ou Dog) à une interface (Baker) est fondamentalement la même que Java, donc c'est facile à comprendre.
Main.go
package main
import (
"animal"
)
func main(){
var c animal.Barker = animal.NewCat()
var d animal.Barker = animal.NewDog()
c.Bark()
d.Bark()
}
En implémentant la même conception en langage Go et en langage Java, il semble possible d'appliquer la conception du langage Java (conception de classe) au langage Go. Cependant, comme il existe des différences dans les spécifications du langage lors de l'implémentation, il semble qu'il soit nécessaire d'apprendre le modèle d'implémentation comme cette fois afin d'appliquer la conception de la classe de langage Java au langage Go.
Le langage Java peut convenir aux grandes (grandes) implémentations car il vous permet de contraindre entre les classes via des extensions et implémentations et de clarifier leurs rôles. .. D'un autre côté, j'ai senti que le langage Go convient aux applications fréquemment modifiées car les restrictions sont lâches et la dépendance entre les objets est faible.
Recommended Posts