From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=)
Date: 2001-07-29T00:14:07+09:00
Subject: [ruby-list:30736] Re: UML クラス図と Ruby の記述についての対応
けいじゅ@日本ラショナルソフトウェアです.
In [ruby-list :30734 ] the message: "[ruby-list:30734] UML クラス図と
Ruby の記述についての対応 ", on Jul/28 14:32(JST) Ken-ichi HASHIMOTO
writes:
>橋本@福井県在住です。
> はじめまして、初めてruby-listにメールを出します。
>
> さて、本題ですが、「UMLクラス図」と「Rubyのクラス定義」について
> どのように対応しているか?ということです。
> <背景>
> UnixのX上(またはWin32上)で動作するUML図もかけるDiaというドローソフト
> があります。
> また、dia2codeとよばれている、diaの保存形式から C++/Java/(C?)のソースを
> 生成してくれるツールもあります。
> それぞれ ソース公開されGPLだったと記憶しています。
> # 補足: 他の高いTOOL(例:バラ)などは、逆もできるなど利点がありますが
> # 個人ユースの場合、クラス図 -> ソースの機能だけでも有用です。
そういう会社のものです.
> <対応>
> <クラス図>
> +---------+
> | Person |
> +---------+
> +---------+
> +---------+
> クラス図>
>
> class Person
>
> end
>
> 対応>
> <対応>
> <クラス図>
> +----------+
> | Person |
> +----------+
> |+name |
> |-age |
> +----------+
> |+inc_age()|
> |-do_hoge()|
> +----------+
> クラス図>
>
> class Person
> @name
> attr_accessor :name
> @age
Rubyのインスタンス変数は、UMLで言うところのprotected(#)な属性になります.
UMLで言うところのprivate(-)は今のところありません. 現在ruby-dev MLで議論
中ですね.
> def inc_age()
> # TODO
> end
> def do_hoge()
> # TODO
> end
> private :do_hoge
これもRubyで言うところのprivateは、UMLで言うとことのprotected(#)に近いで
すね。UMLで言うとことのprivate(-)なメソッドは今のところありません.
>
> 対応>
> <対応>
> <クラス図>
> +---------+
> | Base |
> +---------+
> +---------+
> +---------+
> △
> |
> +---------+
> | Dived |
> +---------+
> +---------+
> +---------+
> クラス図>
>
> class Dived < Base
>
> end
>
> 対応>
> <対応>
> <クラス図>
> +---------+
> |<>|
> +---------+ | My_mixin|
> | Base | +---------+
> +---------+ +---------+
> +---------+ +---------+
> +---------+ △
> △ |
> | +−−−−−−−+
> | |
> +---------+
> | Dived |
> +---------+
> +---------+
> +---------+
> クラス図>
>
> module My_mixin
> end
>
> class Dived < Base
> include My_mixin
>
> end
個人的には、moduleのステレオタイプを<>に、includeを汎化に
<>ステレオタイプ付けようと提案しています。
>
> 対応>
> <対応>
> <クラス図>
> +----------+
> | Person |
> +----------+
> |+name | -age +----------+
> +----------+◇--------→| Date |
> |+inc_age()| 1 +----------+
> |-do_hoge()| +----------+
> +----------+ +----------+
下の意図とすると、ロール名のついている関連端が逆ですね。Date側にageでは
ないですか? あと, -ageではなく#ageでしょうね. 理由は属性の時と同じです.
> クラス図>
>
> class Person
> @name
> attr_accessor :name
> @age # refarence to Date
> def inc_age()
> # TODO
> end
> def do_hoge()
> # TODO
> end
> private :do_hoge
> end
>
> 対応>
>
> もしかして、UMLクラス図とはうまく対応しないのでしょうか?
立石さんのメイルにもありますが、目的は何でしょう?
1. UMLで表現されたものをRubyに落としたい
2. Rubyでプログラムするうえで、設計レベルをUMLで表現したい? つまり、
Rubyで表現できることすべての設計レベルの記述をUMLで行いたい?
1はそんなに難しくないと思いますが、2は難しいと思います. 実際、自分が作っ
たRubyのプログラムをUMLで表現することは難しいことが多いです。
理由はいくつかあって:
1. Rubyの変数には型がない。UMLでは、属性は型がなくても良いですが、関連は必然的に
型を決めなくてはいけない。
2. Rubyは動的な言語。例えば、動的にメソッドが定義できる。あと,
obj.extendもある
3. Rubyには、特異メソッドがある。UMLにはない。
4. moduleのネストクラス。UMLでもネストクラスの概念はありますが、それを直
接表現できない。
__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju@rational.com <<---