次のプログラムを考える。
C f(){ A a = g(); bool flag = true; if(!a.valid){ a = h(); flag = false; } B b(a, flag); return C(b); }
結構ありうるシチュエーションだとおもう。
このプログラムの中で、 flag
は本質的ではない。というのは b
の構築自体は条件分岐の中で行えるからである。
しかし直接条件分岐の中に取り入れるとスコープに狭まれる。だから外で宣言するしかない。
b
を前方宣言して各条件分岐で代入するのは、それはそれで本質的ではない。宣言されたその b
は不要になるからである。
各条件分岐の中で C
を構築するのも本質的ではない。 b
は「同じもの」なので、 C
の構築は1度書けば十分なはずである。
さて、これを表現する正しいプログラムは何か?
1つの解、現実的な解は処理を分離することである。 B
の構築と C
の構築が一緒にあることが問題である、という考え。
B calcB(){ A a = g(); if(a.valid) return B(a, true); a = h(); return B(a, false); } C f(){ return C(calcB()); }
なるほどシンプルになったし最小限の記述である。だが時間が失われた。手続き的な記述という気持ちが抜け落ちている気がする。
なにか、この問題を的確に表現できる文法はないものか。