/home/by-natures/dev*

ソフトウェア開発者としての技術的なメモと、たまに普通の日記。

2018/11/06[2] オブジェクト初期化の引数が多くなってきた時の対処法

オブジェクトのフィールドが増えると初期化する時の手間も増えてきてしまい、Java ならビルダパターンなどで必須パラメータと任意パラメータをうまく分けられたのですが、Go言語ではどうしているのか検索しました:

stackoverflow.com

ベストアンサーではないけれど UpVote が一番ついているものを見てみると、functional options というアイデアがあって、可変長引数でメソッドを渡して、その中で任意パラメータを処理する方法です。詳しくは以下のブログで紹介されています。

Functional options for friendly APIs | Dave Cheney

例えば id のみ必須パラメータであとは任意にしたい場合は以下のように書けます。最後の可変長引数はメソッドであれば何でも渡せてしまうので、そのオブジェクト(上なら Foo)のフィールドは外部パッケージからは非公開になるようにしておいた方がよさそうです。

func NewFoo(id string, options ...func(*Foo)) Foo {
        foo := Foo{id: id}
        for _, option := range options {
                option(&foo)
        }
        return foo
}