菊地さん。はじめまして。大村伸吾といいます。
> さて、早速質問なのですが、UMLで集合表現を出来ないものかと
> 調べています。
> http://d.hatena.ne.jp/ahirasawa/20050629
> にあるように、
> ・集合と部分集合の関係は継承で表現する。
> というのは納得できると思ったのですが、
> 和や差も何か表現方法があるのでしょうか。
>
(単にものの集まりとしての集合のことだと仮定して話をすすめます。)
この試みには非常にびっくりしました。
モデリングは何かを分類するための手段ととれますが、集合というのは
その
「分類する」行為のベースとなる概念であり、モデリングの結果登場する
クラスはインスタンスの集合を表していますから、そのクラスは既に集合
というクラスのインスタンスとなっています。
「集合」というのはモデリングという作業において、それは私達のなか
に、
普遍的に存在する物、すなわちJavaにおける, Class クラ
スのようなもの
(ちょっと違うのかな?)に相当するのではないのでしょうか?
そもそもそれぞれのクラスに対して属性(インターフェース)がそれぞれ
違うからモデリングしていくつかのクラスに分けるのであって、単に
物の集まりとしてであれば、すべて『集合』の一言でつきると思います。
この場合、特に、全体と部分を継承によって分けるのではなく、
クラスとしては『集合』というクラスだけでいいとおもいます。
すなわち、
「ある集合Aがある集合Bの部分集合である」
という包含関係というのは単に『集合』クラスのインスタンス
A,B同士の関係
であるという風にとらえるのがいいとおもいます。積集合も和集合も
単にメソッドとして提供するのが良いと思います。
(最初の企画に真っ向から反対してしまっているので、そんなことはわ
かっている
という場合はご容赦ください。読み飛ばしていただいて結構です)
ここからは補足説明ですが、
集合には
boolean equal(Set )
boolean isSubset(Set )
boolean isElement(Object)
Set produceSubset(Object[])
Set getUnion(Set)
Set getIntersection(Set)
.....(いろいろ)
とかいうメソッドが付いていて、
実装としてはFlyweightパターンのようにすべてオブジェクト
プールへ
のポインタのように表現すればよいとおもいます。
部分はいくもの全体の部分になり得ますので、簡単に全体と部分を
継承にしてしまうのは危ないと感じます。かなーりメタなレベルでは
「全体は部分を包含する」のは正しいですが:-P。
たとえば、ある「数人の小学生の集合」という集合の全体は「何年何
組」という
単位ですか?もしくは学校ですか?それとも日本の小学生全体ですか?
このように考えて行くと、この数人の小学生の集合の持つ全体は非常に
多く
存在します。これを一つ一つ継承で表現するのは非常に煩雑になるよう
に思います。
ですから、結局「何年何組」という集合も「数人の小学生の集合」も同
じ『集合』
クラスのインスタンス、そして上の例からわかるように全体集合と
思っていたものもなにかの部分になる可能性さえあるのですから、全体
集合すらも
『集合』クラスのインスタンスという風にとらえてしまうのが良いと思
います。
(ただ、例えば「何年何組」や「××小学校」にたいして集合操作とは
ちがった
操作(インターフェース)が必要な場合には個別にクラスを定義して
やる
ひつようがあります。このレベルのモデリングが通常のモデリングの
レベルの
モデリングだと思います。今回やったのは一つも二つもメタなレベルの
モデリングなのでしょうかね。)
--
.__________.. . . .. ._________S_H_I_N_G_O__..
O M U R A
Shingo Omura
Nagoya Institute of Technology
Dept. of Computer Sience and Engineering
Mail To : *********@*****.***
-------------------------------------
オブジェクトの広場
http://www.ogis-ri.co.jp/otc/hiroba/