Twitter でちょっと話したのでまとめておく。
インターフェースは振る舞いの共通性とアルゴリズムの可変性を扱うと思ってたけど、意味の共通性と振る舞いの可変性を扱うってのが正しそうな雰囲気〜〜〜〜
— 吉田あひる (@strtyuu) 2022年3月13日
アルゴリズムと振る舞いの関係性がわからなくなったのでもう終わり!死!
— 吉田あひる (@strtyuu) 2022年3月13日
興味深い考察ですね。振る舞いはあるオブジェクト(もしくは型)のインターフェース(シグネチャの一覧)、アルゴリズムはその実装と整理するとしっくりきませんかね?ジェネリクスは(ものにもよりますが)アルゴリズムの共通化のひとつとは言えると思います。
— やきにく (@a_suenami) 2022年3月13日
意味というのはそもそも低次の意味も高次の意味もあるので議論が難しい気がしますが、MPDで「名前」の共通性と呼ばれてるものが近いと思いますね。言語機能でいうとオーバーロードや型クラスが該当しそうです。いずれも同じ名前(≒意味)で異なる実装を持てます。
— やきにく (@a_suenami) 2022年3月13日
うわ〜〜〜ありがとうございます!!!
— 吉田あひる (@strtyuu) 2022年3月13日
MPDのp.60に「AsciiGraphicsWindowクラスもXWindowクラスもrefreshを行う責務があるが、その振る舞いは異なるだろう。(しかしクライアントからすると意味は同じである)」みたいな説明がありまして、そこを読む限りだと振る舞いがかなり実装に近い意味で使われて
るなーと感じてまして、アルゴリズムとは実装であるという説明だとそこらへんの整理ができなくて苦しんでおります!
— 吉田あひる (@strtyuu) 2022年3月13日
5回くらい読み直しましたけど、著者本人もその違いは微妙で形式的な区別はないって書いてるので、あまり気にせず字面通りの理解でいいんじゃないですかね… 書いてることを素直に受け取れば理解できるし、リスコフ置換原則に繋がってるので、そっちは普通に実装のプラクティスとして理解できますし。
— やきにく (@a_suenami) 2022年3月13日
オブジェクトのメソッドシグネチャからその内容(どのように振る舞うか≒内部実装)が想起できるものと、より意味的に定義されていて内部を強く隠蔽しているものが両方あるよねとは思うし、それをちゃんと分析して欲しいっていう主張じゃないかなと思いました。
— やきにく (@a_suenami) 2022年3月13日
意味と振る舞いは区別するべきだが、形式的な区別はない
この議論はマルチパラダイムデザインで書かれてることがベースとなっているけど、意味(セマンティクス)と振る舞いの区別は曖昧だと著者自身が書いている。
振る舞いを、意味やセマンティクスとは区別しておくことが重要である。その違いは微妙で、残念なことに形式的な区別はない。しかし、その2つを区別しておくと分析がうまくいく。振る舞いは、実装と密接に結びついている。オブジェクトがどのように振る舞うかについては、気にかけることはあまりない。
(第2章 「共通性分析」 P. 60 )
これを見る限り、「振る舞い」というのはそれによって実際に起こること(≒実装)まで含めて言っているのであって、そのインターフェース(シグネチャ)だけのことを指しているのではなさそうである。
では、意味やセマンティクスとはインターフェースのことを指しているのかと言うと、それは十分性はあると思うけど必要条件ではないように思う。たとえば、メソッドのオーバーロードなどはインターフェースは違う(通常引数の型が異なる)が意味的には明らかに同一もしくはかなり近い振る舞いである。そもそも、それを型やシグネチャとして表現せずとも、同じ名前をつけるのであればそこに何らかの意味的同一性があると考えるのが自然であるし、構造的部分型やダックタイピングであればそのままプログラミングの世界にその同一性は現れてくる。
アルゴリズムの共通性
アルゴリズムの共通性とは、何ということはなくて、古くからあるサブルーチンのことを指している。ただ、抽象データ型を用いてデータ抽象を実現しようというアプローチをとる場合、こういうったサブルーチンはクラスの中にメソッドとして定義されるので振る舞いとの区別がつきにくいっていうだけだと思うし、継承を利用して動的にディスパッチすると振る舞い(のセマンティクス)は共通だけどアルゴリズムは可変性になるということが起こるっていうだけと思う。
著者の主張は、そういうことが起こるから分析の段階では共通性の次元としてセマンティクスとデータ構造とアルゴリズムを別々の軸で分析し、最初からオブジェクト(あるいはクラス)という概念を導入するべきではないと言っている。もちろん、分析の結果、データ構造、セマンティクスやそれに応じた名前、そして振る舞いとそのアルゴリズムのすべてに共通性があると認められた場合には解決領域としてオブジェクトやクラスを選択するべきだけど、最初からすべてをオブジェクトと捉えるようなオブジェクト指向分析/設計に対するアンチテーゼなのである。明示的にそのように書いてある。
おしまい。