ソースコードには次のように書かれています。
struct RClass {
MRB_OBJECT_HEADER;
struct iv_tbl *iv;
struct kh_mt *mt;
struct RClass *super;
};
ひとまず RClass というクラスが存在すると考えましょう(図1)。
図1 struct RClass を UML クラス図に書く過程 その1 |
MRB_OBJECT_HEADER の実体は value.h で定義されていますが,ここでは属性の1つだなというぐらいに思うことにしましょう(図2)。
図2 struct RClass を UML クラス図に書く過程 その2 |
次の struct iv_tbl *iv; は別の構造体へのポインタです。構造体へのポインタが現れた場合には,次のような手順でクラス図を書きます。
- ある構造体へのポインタが現れたら,その構造体を表すクラスとの間に片方向の関連の線を引きます。
- その構造体を表すクラスが既出の場合には関連線を追加するだけです。
- 未出の場合には対応するクラスを新たに作って関連線を引きます。
- あとで登場した方の構造体を表すクラスの側の関連端のロール名を,元の構造体のメンバー変数名とします。
- あとで登場した方の構造体を表すクラスの側の関連端の多重度を,そのメンバー変数の個数とします。
RClass の struct iv_tbl *iv; について説明します。
- ある構造体へのポインタ (struct iv_tbl *iv; ) が現れたので,その構造体 (iv_tbl) を表すクラス iv_tbl との間に片方向の関連の線を引きます。
- この場合は,未出の場合なので,対応するクラス(iv_tbl)を新たに作って関連線を引きます(図3)。
- あとで登場した方の構造体(iv_tbl)を表すクラスの側の関連端のロール名を,元の構造体(RClass)のメンバー変数名(iv)とします(図4)。
- あとで登場した方の構造体(iv_tbl)を表すクラスの側の関連端の多重度を,そのメンバー変数の個数(1)とします(図5)。
図3 struct RClass を UML クラス図に書く過程 その3 |
図4 struct RClass を UML クラス図に書く過程 その4 |
図5 struct RClass を UML クラス図に書く過程 その5 |
この時の注意点としては,あとで登場した方の構造体を表すクラスから,元の構造体を表すクラスへの矢印や関連端のロール名,多重度がどうなっているかは,ソースコードを詳しく分析しないとわからないという点です。
たとえば,この例だと iv_tbl -> RClass の向きの関連が存在するかどうかは, iv_tbl の構造体を定義しているソースコードを見ないとわかりません。
さらに言えば,もし iv_tbl -> RClass となる関連が存在したとしても,その関連と,先ほど作成した iv の関連が対になるかどうかは,すべての関数のソースコードを読んで,対になるように一貫して管理されているかどうかを確認する必要があります。
続きを読み進めていきましょう。 struct kh_mt *mt; については先ほどと同じなので,わかりますよね? (図6)
図6 struct RClass を UML クラス図に書く過程 その6 |
その次の struct RClass *super; については次のような感じになります。
- ある構造体へのポインタ (struct RClass *super;) が現れたら,その構造体 (RClass) を表すクラスとの間に片方向の関連の線を引きます。
- その構造体(RClass) を表すクラスが既出の場合なので,関連線を追加するだけです。自分自身への関連である(自己参照している)点に注意してください(図7)。
- あとで登場した方の構造体 (RClass) を表すクラスの側の関連端のロール名を,元の構造体 (RClass) のメンバー変数名 (super) とします(図8)。
- あとで登場した方の構造体 (RClass) を表すクラスの側の関連端の多重度を,そのメンバー変数の個数 (1) とします(図9)。
|
|
|