Adakah anda faham Reka Bentuk Dipacu Domain (DDD)? Saya masih belum dapat memahaminya sepenuhnya.
Baru-baru ini, saya telah menyelami buku mengenai Reka Bentuk Dipacu Domain (DDD). Dalam DDD, konsep Objek Nilai muncul. Objek Nilai terutamanya mempunyai ciri-ciri berikut (elemen yang tidak berkaitan dengan topik utama artikel ini sengaja ditinggalkan):
Untuk memenuhi spesifikasi di atas di Golang, pelaksanaannya perlu kelihatan seperti ini:
type Person struct { name string } func NewPerson(name string) Person { return Person{name: name} } func (o Person) Name() string { return o.name } func (o Person) Equal(other Person) bool { return o.Name() == other.Name() }
Terus terang, melaksanakan fungsi seperti ini adalah suatu kerumitan. Selain itu, menulis ujian unit untuk Getter() atau Equal() terasa sia-sia. Saya sering mendapati diri saya berharap, "Kalaulah Golang mempunyai sesuatu seperti kelas nilai atau kelas data Kotlin."
Pakej nao1215/vogen ialah perpustakaan yang menjana kod Objek Nilai secara automatik dengan kaedah New(), Getter dan Equal(). Nama itu bermaksud "Penjana Objek Nilai."
Dengan pustaka ini, anda menulis metadata untuk Objek Nilai di Golang dan berdasarkan metadata itu, kod dijana secara automatik. Inspirasi untuk spesifikasi ini datang daripada shogo82148/myddlmaker (perpustakaan yang menjana DB DDL daripada metadata).
Penggunaan biasa melibatkan penentuan metadata dalam value_object/gen/main.go dan menjalankan go generate ./... untuk menjana fail value_object/value_object.go. Ia juga mungkin untuk mengedarkan output merentas berbilang fail.
Di bawah ialah contoh pelaksanaan untuk value_object/gen/main.go.
package main import ( "fmt" "path/filepath" "github.com/nao1215/vogen" ) //go:generate go run main.go func main() { // Step 1: Create a Vogen instance with custom file path and package name. // By default, the file path is "value_objects.go" and the package name is "vo". gen, err := vogen.New( vogen.WithFilePath(filepath.Join("testdata", "example_output.go")), vogen.WithPackageName("vo_example"), ) if err != nil { fmt.Printf("Failed to create Vogen instance: %v\n", err) return } // Step 2: Append the ValueObject definition if err := gen.AppendValueObjects( vogen.ValueObject{ StructName: "Person", Fields: []vogen.Field{ {Name: "Name", Type: "string", Comments: []string{"Name is the name of the person."}}, {Name: "Age", Type: "int", Comments: []string{"Age is the age of the person."}}, }, Comments: []string{ "Person is a Value Object to describe the feature of vogen.", "This is sample comment.", }, }, // Use auto generated comments. vogen.ValueObject{ StructName: "Address", Fields: []vogen.Field{ {Name: "City", Type: "string"}, }, }, ); err != nil { fmt.Printf("Failed to append ValueObject: %v\n", err) return } // Step 3: Generate the code if err := gen.Generate(); err != nil { fmt.Printf("Failed to generate code: %v\n", err) return } }
Dalam vogen.New(), anda boleh menentukan laluan fail dan nama pakej untuk kod yang dijana, tetapi ini adalah pilihan. Jika ditinggalkan, fail value_objects.go akan dijana di bawah pakej vo secara lalai.
vogen.ValueObject() sepadan dengan metadata. Komen untuk struct dan medannya adalah pilihan. Jika diabaikan, output akan termasuk komen bahasa Inggeris yang tidak berjiwa. Untuk jenis, anda boleh menentukan Jenis Ditakrifkan (jenis yang ditentukan pengguna), tetapi dalam kes sedemikian, anda juga mesti menyediakan laluan modul. Memandangkan Jenis Ditakrifkan belum diuji lagi, saya sengaja meninggalkannya daripada kod contoh (ujian dirancang untuk kemudian).
Di bawah ialah kod yang dijana secara automatik menggunakan sampel di atas:
// Code generated by vogen. DO NOT EDIT. package vo_example import ( "fmt" ) // Person is a Value Object to describe the feature of vogen. // This is sample comment. type Person struct { // Name is the name of the person. name string // Age is the age of the person. age int } // NewPerson creates a new instance of Person. func NewPerson(name string, age int) Person { return Person{name: name, age: age} } // Name returns the name field. func (o Person) Name() string { return o.name } // Age returns the age field. func (o Person) Age() int { return o.age } // Equal checks if two Person objects are equal. func (o Person) Equal(other Person) bool { return o.Name() == other.Name() && o.Age() == other.Age() } // Address represents a value object. type Address struct { city string } // NewAddress creates a new instance of Address. func NewAddress(city string) Address { return Address{city: city} } // City returns the city field. func (o Address) City() string { return o.city } // Equal checks if two Address objects are equal. func (o Address) Equal(other Address) bool { return o.City() == other.City() }
Saya ingin tahu sama ada fungsi seperti pakej vogen akan menarik minat pengguna Golang.
Atas ialah kandungan terperinci vogen - Penjana Objek Nilai dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!