バートランド・メイヤー(Bertrand Meyer)先生は、とにかく偉大です。局所的には、無理筋な例え話や強引な主張で僕らを笑わしてくれるのですが、全体としては実にまったく正しいことを言っています。
メイヤー先生の主張のなかでも、僕がもっとも影響を受けて、はてしなく役立っているのは「Command-Query分離の原則」です。オブジェクトやシステムのインターフェイス&実装を「CommandとQueryに分けろよ」という提案。Commandは値を持たず、副作用(つうか、主作用だけど)だけを持ちます。Queryは副作用を持たず値だけを返します。
Commandとは何であるか、Queryとは何であるか、副作用を持つ/持たないとは何であるか -- これらの概念は、日常直感に頼るだけではなくて、正確に定義することができます。
Queryが副作用を持たないことから、同じQueryを二度発行すると、同じ値が得られることが帰結します。一種のベキ等性です。これは、前もって一度Queryをしておくと、その後の同じQueryの値を(「以前と同じ値だ」と)予測できることを意味します。
もちろん、Queryの後でCommandを実行すると、その後も同じ値である保証はありません。このとき、とあるCommandの実行前の状況から、このCommand実行後に発行したQueryの値が予測できれば便利です。
「Command-Query分離の原則」に付帯する(あるいは「Command-Query分離の原則」が含意する)重要な条件は予測可能性です。それは次のことを意味します。
- オブジェクトやシステムの現在の状態をQueryにより十分に観測しておけば、与えられたCommand実行後の状態を予測できる。(実行後の状態もまた、Queryにより観測されるものとする。)
別な言い方をすると、オブジェクトやシステムには法則性があり、我々はその法則を書き下すことができて、法則に基づいて将来の変化を予見することができる、できなくてはならない、ということです。
一見は取るに足らないプラクティスに思える「Command-Query分離の原則」を実際に適用してみると、システムの予測可能性の問題が如実に見えてきます。そして、「おーそうか、メイヤー先生は、こういう問題に眼を向ける糸口として『Command-Query分離の原則』を提唱なさったのか」と感じるのです。「Command-Query分離の原則」は、すぐに実行できるプラクティスですが、「取るに足らない」ものなどではなくて、実に奥深く、工学と自然科学の本質に通じるものなのです。メイヤー先生は偉大だ。