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 <<---