2010年12月17日
川俣晶の縁側ソフトウェア技術雑記 total 10057 count

メイヤー先生は偉大だ・ステート集約型プログラミングとCommand-Query分離の原則

Written By: 川俣 晶連絡先

「びっくりたまげることってあるものだね」

「どういうこと?」

「おいらが1人で、勝手にたまげただけ、だけどね」

「何があったんだ?」

「ステート集約型プログラミングというものを考えた。[完全版] 究極のC#プログラミング ~新スタイルによる実践的コーディングという本にも載ってる」

「うん」

「趣旨は、変化する値と、変化しない手順そのものを分離しましょうということだ」

「それで?」

「これを見てくれ」

「メイヤー先生が既に主張していた原則と同じってことだね」

「そうだ。ずっと見落としていた」

「どうして見落とすの?」

「うん。いい質問だ。実はメイヤー先生は構造的な意味で必然的に見落とされていたんだ」

「どういう意味?」

「まず第1に、オブジェクト指向の99%はほとんど意味のない宗教であったと考えよう」

「それは事実なのかい?」

「事実かどうかは別として、守るべき規範が多すぎてそれらを守ってはとうていプログラミングできなかった」

「いつ頃の話?」

「1990年代前半だな」

「かなり古いね」

「C++全盛期だ。Java出現前だ」

「それで?」

「たとえば当時の主張として、多重継承を使うべきだとか、再利用性を重視せよとか、いろいろあった。しかし、多重継承にはいろいろ問題があり、再利用性を意識するとどこまで不要な機能を実装して備えればいいのかが不明瞭だ。備えすぎると過剰な時間を食うし、それでも実際に再利用すると足りない機能が出てきた」

「そうか」

「そこで、あるとき決心してオブジェクト指向の思想は一切考えないことにした。最小でシンプルなコードを書けばそれで良いと思った」

「それっきり縁が切れたの?」

「いや。別にエクストリーム・プログラミングとか、テスト駆動開発とか、見るべきものはあったから個別には評価していたよ」

「でも、大半は無視してたってことだね?」

「夢想的な方法論をいくら聞いてもコードは書けないからね。当たり前の分かりやすい構造でモデルを作りましょうと言っても、結果として無駄の多いコードになったらコードが分かりにくくなって生産性が落ちるだけだし。やはり、まず書くことが第1だ。書いてダメならまた書く。書けば問題点も明確になる。論よりソースだ」

「それとメイヤー先生ってどういう関係があるの?」

「だからさ。メイヤー先生というのは、オブジェクト指向入門という本も書いているオブジェクト指向の大家なんだよ」

「ええっ!?」

「おいらがオブジェクト指向だと思っていた方法論というのは、値をオブジェクトの内部に隠蔽する方法論だ。ステート集約型プログラミングというのは、値を取り出して分離する方法論であり、その思想に逆らうもので、反オブジェクト指向的だと思っていた」

「なんと」

「だから、オブジェクト指向の世界から得るものは別に何も想定していなかったので、誰が何を言っているかも別に調べていない」

「事前調査は本当ならやった方がいいね」

「そうだ。ネットの世界は先行研究を調べるという思想が希薄で、とっくに実行例のあるアイデアを新しいと主張することも多い。しかし、おいらが大学生の時はまず卒論に取りかかる前に先行研究を調べろと指導を受けた。だから、調べることは当たり前だ。問題は、全くの分野違いだと誤認して、そこまで調べなかったことにある」

「それだけ?」

「まあ、経験則から導き出した方法論だから、調査が甘いのは致し方がない。そこは十分ではなかったよ。でも、どんなに熱心に調べても結局は見落とした可能性がある」

「分野違いという誤認だね」

余談 §

「しかし、それとは別にメイヤー先生に対する評価というものがある」

「どういう評価?」

「実はオブジェクト指向入門って手元にある古い本なんだけどさ。多重継承の使い方や意味合いとか、以前の受け取り方とはかなり違った意味合いが見えてくる感じだ」

「どのへんが?」

「1つに多重継承は技術的な問題を発生させるから、無い方がいいというのも1つの正論だ今時のオブジェクト指向プログラミング言語はほとんど多重継承を備えていない。C#もJavaもね」

「うん」

「でも、実装の混迷を取っ払って言うと、思想的には多重継承はあった方がいいと思う」

「どうして?」

「使いたいクラスは継承して使う、という方法論を採ると、無制限に公開されたシンボルを減らすことができるからだ。開発環境が提示する候補リストに出てくるキーワードが減って目的の名前を探しやすくなるし、構造もすっきりする」

「そうか。でも、今の言語はそこまで気が利いてないね」

「多重継承を本格的に行うと些末な矛盾が噴き出して地獄だからな。気を利かせたつもりで地獄に行くのは嫌なんだろう」

「でも、C++にはまだ多重継承があるけどいいのかな?」

「いいんだろう。C++で本格的に開発をしている世界は超天才揃いだから。ああいう凄い才能があれば、ひょいひょいと地獄を飛び越えてコードが書けるのだろう」