Goで構造体で関数を渡すとうれしいか
Goで関数を関数オブジェクトとして構造体のフィールドにするとうれしいか
asRagi.iconうれしくなかった
code:.go
// A: 状態は関数をクロージャにすることで実現する(Bad)
type User struct {
UpdateUserName func(UserName) error
}
func NewUser() *User {
var userName UserName
return &User{
UpdateUserName: func(newUserName UserName) error {
userName = newUserName
}
}
}
// B: 素直に状態は構造体に明示的に持ってメソッドを生やす(Better)
type User struct {
name UserName
}
func (u *User) UpdateUserName(newUserName UserName) error {
u.name = newUserName
}
func NewUser() *User {
return &User{}
}
メリット
同パッケージ内からでも状態に直接アクセスされない
よくないポイント
状態がクロージャから参照されるのみのため実質的なフィールドがどこにいくつかあるのか見にくい
構造体のフィールドとして参照や状態を持ちたくなったとき,フィールドにメソッドと状態が混在する.
メソッドの利用状況がわかりにくい
ちゃんとメソッドとして実装すると利用箇所がIDEから特定でき自動的に利用数も表示してくれるが,構造体のフィールドはそうではない.
単に見にくい
素直にメソッドを生やす方がGoとしては当然主流