Imaginantia

思ったことを書きます

条件分岐と関数合成

次のプログラムを考える。

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());
}

なるほどシンプルになったし最小限の記述である。だが時間が失われた。手続き的な記述という気持ちが抜け落ちている気がする。


なにか、この問題を的確に表現できる文法はないものか。