ホームページ > バックエンド開発 > Golang > vogen - golang の値オブジェクトジェネレーター

vogen - golang の値オブジェクトジェネレーター

DDD
リリース: 2024-12-29 14:41:11
オリジナル
214 人が閲覧しました

vogen - Value Object Generator in golang

導入

ドメイン駆動設計 (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 サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート