Index: [Article Count Order] [Thread]

Date:  Thu, 02 Feb 2006 02:41:53 +0900
From:  "a.nakamura" <********@*****.**.**>
Subject:  [oosquare-ml:04718] Re: UML での集合表現について
Sender:  *******************@**.*******.**.**
To:  オブジェクトの広場メーリングリスト <***********@**.*******.**.**>
Message-Id:  <***********.****.********@*****.**.**>
In-Reply-To:  <00a901c62677$e36998f0$********@********>
References:  <00a901c62677$e36998f0$********@********>
X-Mail-Count: 04718


お世話になっております。 A.中村です。

On Wed, 1 Feb 2006 00:06:18 +0900
菊地丞様 ****@*****.**.** wrote:

> さて、早速質問なのですが、UMLで集合表現を出来ないものかと
> 調べています。
> http://d.hatena.ne.jp/ahirasawa/20050629
> にあるように、
>  ・集合と部分集合の関係は継承で表現する。
> というのは納得できると思ったのですが、
> 和や差も何か表現方法があるのでしょうか。


原理的には有り得そうで、面白そうな話ではあるんですが、

いわゆるOOの一般的な形態
(各種実装言語もそうですし、UMLもそうですが)
としては、
集合(と見たときのClass)の和や差が取り扱えるようには
作られてはいない、

ってところだと思います。

そういう機能をサポートした言語を作ってみたい、とは
思ったりもしますが、
その言語で描ける世界は、JavaやRuby(?)やUMLで表現できる世界を
超越しちゃいそうです。

#そういや確か、サブクラスを作る文法が、
#「subclass名 = superclass名 + {子クラスの新規性質};」
#なんて書きかたになってる言語が、有ったような気がします。
#なんたって「+」ですよ「+」。泣かせるねえ(^^;



あと、単純に足し引きできるものなのか?って問題も有りますね。

ちょうどJavaのInterfaceを引き合いに出すと話しやすいんですが、
Interfaceだと足し算や引き算は考えることが
出来ちゃうかも知れません。
Interfaceをシグネチャの集合とみなすんです。

というのは、Interfaceの中身って奴は、
「同じシグネチャのメソッド」か「違うシグネチャのメソッド」か
のどちらかしかないからです。
衝突してれば単に同一のメソッドだとみなせばいいし、
衝突しなければ同一じゃないメソッドだとみなせばいい。
これなら差も簡単に考えられます。



が、実装(JavaでいえばClass)を含めると…
(なにを集合に見立てるにせよ)
話が途端にややこしくなりそうです。

Override(の中の実装)で、
「上位クラスの性質を実は否定しちゃってるクラス」
とか、幾らでも作れてしまって、
しかもそれは形式的に知る手段が無い。
(文脈にどっぷり依存というか、
JavaDocで語ることしか出来ないというか。)

そういやサブクラス化って、
「条件を絞り込む、つまり上位クラスのサブ集合を作る」サブクラスと、
「機能を拡張する」サブクラスとがあって、
しかも両方は排他的だとは限らず、
しかも形式的に区別つける手段も(大抵の言語でも、またUMLでも?)
用意されていないっすよね。



現実(?)的なOOPは、ピュアな集合の世界から
かけ離れたところを暴走している(^^;、という印象を持ってます。

暴走だから即ち悪いとは限らないのですが、
形式的に性質を調べる、などといった行儀の良い技が
安全に使えるとは限らないという点は、
「ソフトからなかなかバグが無くならない」理由の1つ
だったりするのではないかな、とは思っています。

#このへんは、純粋関数型言語とかの人たちが
#よく言ってるのと似たような話でしょうか…


-------------------------------------
オブジェクトの広場
http://www.ogis-ri.co.jp/otc/hiroba/