言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Class と Set

物事をシンプルにするために考えてみたこと。
操作には定義域や値域といったものがある。つまり、ある操作の対象と結果、これは prolog 的に見るとどちらも引数でしかないのだが、これらはある範囲の集合に属する。実際は Smalltalk なんかだと、特にどんな値を返しても良いわけだけど、実用的には最低限共通のプロトコルを持つ値を返さないと後の処理が出来ない。ここで静的に望んだ範囲の値がやってくるかどうかを見るのが型検査の考え方。

プログラム言語で言う所の型は、記憶容量とその使い方を指定する事がルーツになっているが、数学的な型の意味はむしろ集合だ。集合とは、あるオブジェクトが含まれている何か。と言う事は、クラスと集合を同一視してもいいんじゃないかな?と言うのが僕の思いつき。集合とクラスを同一視する事によって、概念がすっきりし、きめ細かな検査が出来る。

良くある Set の実装では、含まれる要素への参照を全て持っているだろう。従って、そのままでは『実数全体の集合』などという物を表現できない。逆にいうと、集合の最小限のプロトコルでは要素全てに適用するような操作は必要無い。集合全てに何かが適用できる(map や foreach が使える)というのは、クラスで言うとシングルトンを適用するような有限個の要素が含まれる場合のみ可能な操作だ。

今のプログラミング言語の多くは Class を使うのに勇気を必要とする。Class は名前空間を汚染し、読むべきコードを増やす。しかしもっと気軽に Class を使えるようになれば、本当に記述するべきドメイン一つ一つに違うクラスを割り当てる事が出来る。ID番号を振る必要も無いし、フラグとして Bool を使うのは禁止。値域を検査する必要も無くなる。

メモ

  • Integer 型は、それが本当に整数を表現する場合以外は使わない。画面の縦位置は VerticalPosition 横位置は HorizonalPosition でそれぞれ違う型。名前空間の汚染にどう対処するか?
  • Set = Class に動的に要素を追加できてややこしくないだろうか?
  • コードの再利用、委譲、継承はどのように行うべきだろうか?
  • むしろ仕様記述になってしまうかも。