Mein Name ist keita69sawada.
Der Java-Programmierer hat (vorerst) versucht, die Go-Sprache zu berühren, gefolgt vom Erlernen der Go-Sprache.
Als ich es mit UML auf die gleiche Weise wie das Design von Java-Klassen entwarf, konnte ich mir nicht vorstellen, wie eine gemeinsame Verarbeitung (abstrakte Methode) realisiert werden sollte, da ** Go-Sprache keine "Erweiterungen" hat **. .. ..
Dann: "Implementieren wir ein einfaches Java-Klassendesign in der Sprache Go!" Dieser Artikel war uni-uni.
Ersetzen wir ein einfaches Beispiel durch Java-Erweiterungen mit der Sprache Go. Implementieren wir die "Quietsch" -Methode in den Klassen "Hund" und "Katze", die "Tier" erben.
Es ist keine strenge UML, aber ist es so?
Ich habe auf meine eigene Weise über diese Sorgen nachgedacht.
Ich habe die Struktur der Java-Quelldatei mit der Struktur der Quelldatei der Go-Sprache verglichen.
Wenn ein Java-Programmierer die Struktur der Quelldatei anhand des obigen Klassendiagramms festlegt, denke ich, dass es sich normalerweise um eine Klasse und eine Datei handelt.
Dateiorganisation
└─src
├─animal //Java Package Unit Ordner
│ Animal.java //Java-Klasseneinheit
│ Cat.java
│ Dog.java
│
└─main
Main.java
Es hat die gleiche Struktur wie die Java-Quelldateistruktur. Diesmal ** wage ** das gleiche.
Dateiorganisation
└─src
├─animal //Gehen Sie zum Paketeinheitenordner
│ Animal.go //go hat kein Konzept von Klasse
│ Cat.go
│ Dog.go
│
└─main
Main.go
Es gibt kein Konzept für Klassen in der Go-Sprache, daher müssen die drei Quelldateien (Animal.go, Cat.go, Dog.go) nicht aufgeteilt werden. ** (Die Pakete müssen jedoch identisch sein)
Zum Beispiel ist es grammatikalisch in Ordnung, sie wie folgt zu einer Datei zu kombinieren. (Es ist nur grammatikalisch ...)
Dateiorganisation
└─src
├─animal
│ Animal_Cat_Dog.go //Es ist grammatikalisch in Ordnung, sie in einer Quelldatei zu kombinieren
│
└─main
Main.go
Die ** meine eigene Antwort ** auf "Was soll ich mit der Quelldateidivision der Go-Sprache tun? (Klassenkonzept oder ...)" lautet wie folgt.
** Go-Sprachquelldateien sollten auf GitHub einfach zu verwalten sein (nicht widersprüchliche Details). ** **.
** Wenn im Voraus bekannt ist, dass die Anzahl ähnlicher und nicht funktionsfähiger Funktionen (in diesem Beispiel Tierarten (Affen, Füchse usw.)) zunimmt, erstellen Sie für jede Funktion eine Quelldatei. ** **.
** Da die Go-Sprache keine Vererbung hat, erstellen Sie eine Basisquelldatei (in diesem Beispiel "Animal.go") im Paketordner. ** **.
Wir suchen den besten Weg, also bitte kommentieren. (^ O ^) /
Schauen wir uns zunächst die Java-Quelle an. Tiere implementieren das Verhalten von Rinde mit einer abstrakten Methode.
Animal.java
package animal;
public abstract class Animal {
public abstract void bark();
}
Und die Quelle der Go-Sprache. Die Go-Sprache verfügt nicht über eine abstrakte Methode, sondern implementiert stattdessen das Verhalten von Rinde an der Schnittstelle.
** "Es gibt kein abstraktes Konzept eines Tieres (ein Ersatz für eine Klasse)" **. ..
Animal.go
package animal
type Barker interface {
Bark(string)
}
Es scheint auch, dass wenn der Anfang groß geschrieben wird, er zu einem öffentlichen Bereich wird.
Dies ist auch aus Java-Quelle. Katzenklasse hat eine Katzenstimme Es hat ein Rindenverhalten.
Cat.java
package animal;
public class Cat extends Animal {
private String voice = "Nya Nya";
public void bark() {
System.out.println(this.voice);
}
}
Als nächstes kommt die Sprache Go.
Da die Go-Sprache kein Klassenkonzept hat, ** definieren Sie eine Katze mit einer Struktur und deklarieren Sie sie als Datentyp vom Typ Katze. Der Datentyp kann jedoch keinen Wert ("voice = Nya Nya") wie die Java-Klasse haben.
Hier kommt die ** Java-Konstruktor-ähnliche Methode NewCat () **. Diese Methode gibt beim Erstellen einer Instanz des Datentyps (Cat) einen Wert ("Nya Nya") an.
Implementieren Sie dann Bark (), das in der in Animal.go definierten Schnittstelle deklariert ist. Der Punkt hier ist der Empfänger. ** Empfänger sind "methodendefiniert für Datentypen" **. Hier handelt es sich um eine Methode vom Datentyp (Typ Cat struct) (Bark ()).
Cat.go
package animal
import (
"fmt"
)
type Cat struct { //Strukturieren Sie die Katze(struct)Definiert in
voice string
}
func NewCat() *Cat { //Java-Konstruktor-ähnliche Methode
return &Cat{"Nya Nya"}
}
func (c Cat) Bark(){ //Empfänger
fmt.Println(c.voice)
}
Ausgelassen, weil es dasselbe ist wie Cat.
Schließlich Main. Dies ist auch aus Java. Erstellen Sie eine Instanz des konkreten Objekts von Cat, Dog, Sie rufen die in der Schnittstelle (Animal) definierte Methode (bark) auf.
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();
}
}
Als nächstes kommt die Sprache Go. Das Konvertieren eines konkreten Objekts (Katze oder Hund) in eine Schnittstelle (Baker) entspricht im Wesentlichen Java und ist daher leicht zu verstehen.
Main.go
package main
import (
"animal"
)
func main(){
var c animal.Barker = animal.NewCat()
var d animal.Barker = animal.NewDog()
c.Bark()
d.Bark()
}
Durch die Implementierung des gleichen Designs in Go-Sprache und Java-Sprache scheint es möglich zu sein, Java-Sprachdesign (Klassendesign) auf Go-Sprache anzuwenden. Da es jedoch Unterschiede bei den Sprachspezifikationen bei der Implementierung gibt, scheint es notwendig zu sein, das Implementierungsmuster wie dieses Mal zu lernen, um das Java-Sprachklassen-Design auf die Go-Sprache anzuwenden.
Die Java-Sprache eignet sich möglicherweise für große (große) Implementierungen, da Sie zwischen Klassen durch Erweiterungen und Implementierungen einschränken und deren Rollen klären können. .. Andererseits war ich der Meinung, dass die Go-Sprache für Anwendungen geeignet ist, die häufig geändert werden, da die Einschränkungen locker sind und die Abhängigkeit zwischen Objekten gering ist.
Recommended Posts