意味(セマンティクス)と振る舞いとアルゴリズム

Twitter でちょっと話したのでまとめておく。

意味と振る舞いは区別するべきだが、形式的な区別はない

この議論はマルチパラダイムデザインで書かれてることがベースとなっているけど、意味(セマンティクス)と振る舞いの区別は曖昧だと著者自身が書いている。

振る舞いを、意味やセマンティクスとは区別しておくことが重要である。その違いは微妙で、残念なことに形式的な区別はない。しかし、その2つを区別しておくと分析がうまくいく。振る舞いは、実装と密接に結びついている。オブジェクトがどのように振る舞うかについては、気にかけることはあまりない。

(第2章 「共通性分析」 P. 60 )

これを見る限り、「振る舞い」というのはそれによって実際に起こること(≒実装)まで含めて言っているのであって、そのインターフェース(シグネチャ)だけのことを指しているのではなさそうである。

では、意味やセマンティクスとはインターフェースのことを指しているのかと言うと、それは十分性はあると思うけど必要条件ではないように思う。たとえば、メソッドのオーバーロードなどはインターフェースは違う(通常引数の型が異なる)が意味的には明らかに同一もしくはかなり近い振る舞いである。そもそも、それを型やシグネチャとして表現せずとも、同じ名前をつけるのであればそこに何らかの意味的同一性があると考えるのが自然であるし、構造的部分型やダックタイピングであればそのままプログラミングの世界にその同一性は現れてくる。

アルゴリズムの共通性

アルゴリズムの共通性とは、何ということはなくて、古くからあるサブルーチンのことを指している。ただ、抽象データ型を用いてデータ抽象を実現しようというアプローチをとる場合、こういうったサブルーチンはクラスの中にメソッドとして定義されるので振る舞いとの区別がつきにくいっていうだけだと思うし、継承を利用して動的にディスパッチすると振る舞い(のセマンティクス)は共通だけどアルゴリズムは可変性になるということが起こるっていうだけと思う。

著者の主張は、そういうことが起こるから分析の段階では共通性の次元としてセマンティクスとデータ構造とアルゴリズムを別々の軸で分析し、最初からオブジェクト(あるいはクラス)という概念を導入するべきではないと言っている。もちろん、分析の結果、データ構造、セマンティクスやそれに応じた名前、そして振る舞いとそのアルゴリズムのすべてに共通性があると認められた場合には解決領域としてオブジェクトやクラスを選択するべきだけど、最初からすべてをオブジェクトと捉えるようなオブジェクト指向分析/設計に対するアンチテーゼなのである。明示的にそのように書いてある。

おしまい。