icon

長文になっちゃったけどちょうどいいので、ほぼこのままChatGPTに聞いてみたら"Golangには、不変性を強制する組み込みのメカニズムがないため、不変性を保証することは困難です。"って言われちゃった。

type Account struct {
	balance int
}

func NewAccount(initialBalance int) (*Account, error) {
	if initialBalance < 0 {
		return nil, errors.New("初期残高は0以上である必要があります")
	}
	return &Account{balance: initialBalance}, nil
}
実は普段からやってるだけのこと 契約による設計: 不変条件編
やっぱこの記事に用に、structにして値については非公開fieldにして、packageも作って隠蔽する事で、New関数の使用を強制するしかないのかな。

って思ったけど、それをしてもゼロ値で不正なAccountが作られる事は同じか?どうだろ?

後さっき"structだけど値オブジェクトの様な"って書いたけど、structじゃなかったな。stringを元にしたカスタム型だった。

Web site image
実は普段からやってるだけのこと 契約による設計: 不変条件編
icon

Golangで、structだけど値オブジェクトの様なものを作った。作ったと言っても、structとNewする関数と、不正な値を検証するメソッドを持ってるだけだけど。

type FooId string

func NewFooId(s string) (FooId, error) {
	id := FooId(s)
	err := id.Verify()
	if err != nil {
		return id, err
	}
	return id, nil
}

func (id *FooId) Verify() error {
	// Verify something
}

せっかくtypeなのだし、HTTP handlerでNewして、usecaseには値オブジェクトを渡す様にしたんだけど、値渡しだったのでゼロ値のFooIdが発生してしまって困った。
FooIdが引数に渡された時点で、FooIdとしてvalidである事が確定される様にしたかったんだけどなぁ。

usecaseの方で
Do(fooId *FooId)で参照渡しにしておけば、nilが入ってnil pointerになるけど、値なのだから値渡しがしっくりくる。
かといって、usecaseにはstringで渡しておいて、usecaseの中で
NewFooId(str)するのもな。usecase内で完結してるなら、typeにせず検証関数だけあればいいじゃん感。

うーん、なんか納まりが悪いなぁ・・・

icon

Git で shallow clone するときに全ブランチの最新履歴を取得する

思い出すと助かる時がありそうなのでメモ

git clone --depth 1 --no-single-branch 

git fetch --depth 10
git fetch --unshallow

Web site image
Git で shallow clone するときに全ブランチの最新履歴を取得する
icon

今日は暑い日か

icon

ドキュメント \| Rium Metaverse

ワールド制作が、UnityじゃなくてBlenderなのか。どんな感じなのかちょっと気になるな

Web site image
ドキュメント | Rium Metaverse
icon

Rium Metaverse

そういえば今月頭の3月1日に出たRium、VRは無いっぽいからスルーしたけどそういえばどんなかwebサイトだけ見に行ったら、clusterをかなり意識してそうな感じだった。
というか開いた時一瞬cluster開いたっけ?って思った。

Web site image
おすすめ | Rium Metaverse
Attach image
icon

Googleの検索結果がスパムに汚染されてもう何年もたつけど全然改善しそうにないし、今なら国産検索サイトもワンチャンあったりしないのかな?
というか何でもいいからGoogleとBing以外の選択肢が欲しい。

icon

Googleの過剰なフィルタへの反発と、もう何年もスパムに汚染されてて役に立つ度も下がってたから、DuckDuckGoに乗り換えてたけど、検索ワールド3つ位で技術的な事を調べてると、渋い顔になりながら結局Googleでも検索する事がやっぱ多い・・・
Googleに戻っても何も解決しないしって事で、startpage.comにしてみるかなぁ。検索自体はGoogleに頼ってるらしいけど、トラッキングしないって言うからにはフィルタリングの影響はないだろうし