ドメイン駆動設計 (DDD) について理解していますか?まだ完全には理解できていません。
最近、ドメイン駆動設計 (DDD) に関する本を読んでいます。 DDD では、Value Object という概念が登場します。値オブジェクトには主に次の特性があります (この記事の主要なトピックに関係のない要素は意図的に省略されています):
Golang で上記の仕様を満たすには、実装は次のようにする必要があります。
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() }
率直に言って、この種の機能を実装するのは面倒です。さらに、Getter() または Equal() の単体テストを作成することは無意味に思えます。 「Golang に Kotlin の値クラスやデータ クラスのようなものがあればいいのに」と思うことがよくありました。
nao1215/vogen パッケージは、New()、Getter、および Equal() メソッドを使用して値オブジェクト コードを自動的に生成するライブラリです。名前は「Value Object Generator」の略です。
このライブラリを使用すると、Golang で値オブジェクトのメタデータを記述し、そのメタデータに基づいてコードが自動的に生成されます。この仕様のインスピレーションは、shogo82148/myddlmaker (メタデータから DB DDL を生成するライブラリ) から来ています。
一般的な使用法には、value_object/gen/main.go でメタデータを定義し、 go generated ./... を実行して value_object/value_object.go ファイルを生成することが含まれます。出力を複数のファイルに分散することも可能です。
以下は、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 } }
vogen.New() では、生成されたコードのファイル パスとパッケージ名を指定できますが、これらはオプションです。省略した場合、デフォルトで vo パッケージの下に value_objects.go ファイルが生成されます。
vogen.ValueObject() はメタデータに対応します。構造体とそのフィールドのコメントはオプションです。省略した場合、出力には魂のない英語のコメントが含まれます。型については、定義型 (ユーザー定義型) を指定できますが、その場合はモジュール パスも指定する必要があります。定義された型はまだテストされていないため、サンプル コードからは意図的に省略しています (テストは後で計画されています)。
以下は、上記のサンプルを使用して自動生成されたコードです:
// 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() }
vogen パッケージのような機能が Golang ユーザーにとって興味深いものであるかどうかを知りたかったのです。
以上がvogen - golang の値オブジェクトジェネレーターの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。