オブジェクトと処理の関連



00650/00650 VFF15672 T's-Neko オブジェクトと処理の関連 (10) 96/09/09 12:59 00638へのコメント こんばんは。まさーる さん。 〉 1) 政治家に「国会議員である」メソッドを加えてダウンキャストを避ける 〉 2) ○島さんが政治家から国会議員にダウンキャストする 〉 3) ○田さんが政治家から国会議員にダウンキャストする 2),3) について。 政治家の例では、 ・「○島さんの関係のある政治家の中から、○田さんに現役の国会議員を紹介する」 処理でしたね。それには、 ・「政治家の候補を得る」処理と、 ・「現役の国会議員か判断する(ダウンキャストする)」処理の、 2種類があります。 まず、「現役の国会議員か判断する(ダウンキャストする)」処理に注目すると、 ダウンキャストすること自体は、1) のように(#649参照)、スーパークラスの 「キャストする」メソッドや、メタの「dynamic_cast」が行うので、その意味では、 3) ですね。「政治家の候補を得る」処理も同様に考えて、○島さんが処理します。 では、ダウンキャストする(トリガする)のは、誰なんでしょうか? 今回のケースでは、「〜を紹介する」処理が、ダウンキャストすると考えます。 オブジェクトではなく処理がトリガします。 全体的に考えると、次の図のようになります。 『 ○ 島 さ ん 』-----『 ○ 田 さ ん 』   |    |   |    |   |    |   |    |   |  --<〜を紹介する>--  |   | |         | |   | ◇         ◇ | <候補を得る>    <ダウンキャストする>    『』は、オブジェクト    <>は、処理    ----は、関連    --◇は、所有関連、◇が子 この図では、オブジェクトと処理を同等に扱っています。つまり、 「処理」は、オブジェクトに含まれるのではなく、オブジェクトと 関連していると考えています。(Martin/Odell 本を参照) で、ダウンキャストをトリガする「〜を紹介する」処理は、○島さんと ○田さんのどちらのメソッドにする方がいいだろうと考ると思います。 しかし、それは、○島さんと○田さんの2つと関連しているのに、 C++などほとんどのオブジェクト指向言語では1つしか関連でき ないから起きる問題です。だからと、放棄するわけにはいかないので、 どちらかのメソッドにします。この場合、特にどちらの関連に優劣が あるわけではありませんから、どちらでも構わないと思います。 ちなみに、僕は、ドキュメントの整理の一部に、このような関連の構造を 役立てています。 -----------> written by T's-Neko 9.9.1996
01564/01564 VFF15672 T's-Neko 操作からオブジェクトの関連構造を推測する ( 6) 98/08/05 08:38 01557へのコメント 小林 浩一 さん、こんばんは。T's-Neko です。(^o^)o > ヤコブソンのいうインタフェースは,Javaのinterfaceとは意味が >異なります.単に,システム境界の外部とのインタフェースという意味で >使われていると思います.オブジェクトの役割に対する名称なのです. > ま,紛らわしいのは確かで,それでUMLでは境界オブジェクトに名称を >変更したのでしょう. なるほど。 そのインターフェイスは、アプリ特有ですからね。 >max(a, b)なんかは,a.max(b)ではかなり不自然という気がします そうかな? 文字列の比較メソッドと同じような不自然だから、 慣れればそうでもないと思うけど。 「1つのオブジェクトに対する操作」のみ、という限定は パターン認識には有効だけどね。 でも、実際、「2つのオブジェクトの間の関連的な操作」という 認識がこの場合あるわけでしょ。それを、Java という そういった記述をサポートしない言語では、 (意味を踏まえた)記述どおりの解釈をしていたら 持たないわな。そこで、記述に翻訳的な意味、 つまり、max は2項演算子だと思い込んだら これが意外とすんなり受け入れられるよね。(かな?) そのコツは、メソッドの第1引数がオブジェクトかどうかということ。 多態性を持ったメソッドの内容を推測するときと似てるよね。 逆に C言語では、第1引数がオブジェクトであると翻訳するし。 まとめると、操作は意識上次のように分類される。 ・A.オブジェクトの属性や状態に対する操作 ・B.オブジェクトと所属関係にあるオブジェクト(単・複)に対する操作 ・C.オブジェクトと対等関係にあるオブジェクトとの操作(n項操作) ・X.イベント・ハンドラ まぁ、ある操作が人によって別のタイプに分類されることもあるし、 複数のタイプを兼ねることもあるけどね。 でも、こうやってオブジェクトの関連構造を踏まえることで、 どういう操作なのかという理解が深まることは確かです。 (今回の max は、どう考えても C タイプだよね。) で、これらの意味と記述を一致させるとこうなると思う。 ・A. (obj).(基本型); or (obj).(基本型) = (基本型); ・B. (obj).(obj); or (obj).(obj).method(); or (obj).method(); ・C. any = func(any); or func(any,any,...) ・X. (obj).handle(...); or (obj).handle(...) = [message]; ただし、any は、obj + 基本型。 でも、実際これらすべてサポートすると、前述した 「人によって別のタイプに分類される」問題があるんだよね。 だから却下。 >やっぱり世の中は主体のある操作ばかりではないのかな,と思うわけです. というわけで、C タイプをクラスに所属させない(グローバル)か というと、やっぱり、所属させた方がいいと思います。いや、 分類させるといった方がいいかな。n項操作のうちの1つのクラスに 分類させるのが現実解ですけど。 まぁ、ソースブラウザに、指定クラスを引数に持つ操作を検索する 機能があればいいけどね。ロボット型サーチエンジン見たく。 --- Neko.

This text copyed from Niftyserve.