isyumi_netブログ

isyumi_netがプログラミングのこととかを書くブログ

処理の流れを型で表現しよう

もしかしたらあなたは型をめんどくさいものだと感じているかもしれない。型宣言は動くようにするために仕方なくするものと思っていないだろうか。もしそうなら型を使って頭を整理する習慣について知ってほしい。きっとあなたは型を極力狭く定義したほうが捗ることに気付くだろう。

このコードは二つの数を掛け算するコードだ。掛け算する前の構造体のsumには0を入れてある。このコードは間違いなく動く。

type Sum struct {
Num1 int
Num2 int
Sum int
}

func sum() {
s := Sum{
Num1: 3,
Num2: 4,
Sum: 0,
}

s.Sum = s.Num1 + s.Num2

}

しかし、このように計算前の構造体と計算後の構造体を用意すればどうだろう。コードを読む人は一目で「ああ、ここまでは計算結果が出ていないんだな」ということが分かるし、計算する前の0という値を間違って使ってしまうこともなくなる。

type Operand struct {
Num1 int
Num2 int
}
type Result struct {
Num1 int
Num2 int
Sum int
}

func sum() {
s := Operand{
Num1: 3,
Num2: 4,
}

r = Result{
Num1: s.Num1,
Num2: s.Num2,
Sum: s.Num1 + s.Num2,
}

}

このように、処理の大雑把な流れを型で表現しよう。入ってくる値の型は何で出て行く型の価は何か、その中間はどんなデータ構造か。そして型と型を橋渡しするようにコードを書いていくと疲れにくい。