【チュートリアル】 - 設計編

bn_atrb.gif (939 バイト)

2. モデル・図の作成
2.3 クラスの設計
jun 次は、クラスの情報をさらに詳細化し、属性と操作の設計について考えていこう。属性や操作については、C++やJavaの概念との違いはそれほどないんだよ。
<< クラスの設計 >>
◆属性の設計
  • 属性の可視性を指定する。
  • 属性の型やデフォルト値を決定する。
◆操作の設計
  • 操作の可視性を指定する。
  • 新しい操作を追加したり、操作に実装レベルの詳細情報を追加したりする。
    • 操作シグニチャとして、戻り値と引数のリストを指定する。

 

 

jun Chen君は「カプセル化」という言葉を知っているかな?
chen はい。オブジェクト指向の大きな特徴のひとつで、オブジェクトの内部情報には、そのオブジェクトのインターフェースを通してしかアクセスできないというものですよね。
jun そうだよ。UMLの表記法では、属性や操作に対する外部からのアクセスを制御するための可視性を指定することができるんだ。可視性を適切に設定することによって、カプセル化を行うことができるんだよ。属性や操作に対する可視性には3種類あって、次に示す記号を名前の前に付けて表すんだよ。
 
★ 可視性の種類と、それを表す記号(C++の場合)★
  public アクセス(+)   すべてのクライアントからアクセス可能
  protected アクセス(#) すべてのサブクラスからだけアクセス可能
  private アクセス(−)   そのクラス自身からだけアクセス可能

 

chen 外部インターフェースとしての操作に対する可視性はpublic、実装上の操作に対する可視性はprivateかprotectedと考えればいいのですか?
jun そうだよ。また、内部情報となっているすべての属性に対する可視性は、通常privateかprotectedになるということも分かるね?
chen はい。

ill_31

jun では、まず属性について考えてみよう。分析段階では、属性の名前だけを示していたよね。設計段階では、抜けている属性がないかをチェックして、それぞれの属性に対して、データ型デフォルト値(必要であれば)、そして可視性を指定しなければいけないんだよ。では、「顧客」クラスの属性についてはどうなるか分かるかな?
 

図2.3.1 Chen君が作成した「顧客」クラスの属性

attsample

 

 

chen すべての属性について、型と可視性を追加しました。ここでは、文字列操作をするためのStringクラスをライブラリとして導入し、型として定義しています。可視性については、すべてprivateにしています。
jun これでいいだろう。次は、操作について考えてみよう。分析段階では、ユースケースで表現された振る舞いを実現するために操作を定義したよね。設計段階では、その操作に実装レベルの詳細情報を追加したり、新しい操作を追加したりして、クラスを完成させるんだよ。
chen 実装レベルの情報とはどんなものですか?
jun 実装レベルの情報とは、操作の引数戻り値といった操作のシグニチャのことだよ。引数については分析段階でも少し示したので、ここでは型と戻り値を中心に決定しよう。では、操作シグニチャを定義して、クラス図とシーケンス図を更新してみよう。

19_tit_3

図2.3.2 Chen君が作成したシーケンス図(一部):注文商品の受け付けに関する部分を抜粋
seq1.gif (10456 バイト)

 

ill_24

図2.3.3 Chen君が作成したクラス図(一部):注文商品の受け付けに関する部分を抜粋
class2.gif (10087 バイト)

 

chen ここでは、注文に関連する部分を抜き出しています。それぞれの操作について、型や戻り値を定義しました。「注文商品」クラスの新規作成という操作の場合、引数の商品番号はString、個数の型はint、指定配送センターの型は配送センターになると思います。そして、この操作によって「注文商品」オブジェクトが生成されるので、戻り値の型は注文商品です。シーケンス図では、引数の型だけしか表示していません。
jun うん、よくできたね。ここでは、分かりやすくするために操作名などを日本語で表示しているが、実際は、この段階で開発言語に合わせた名前に変更するんだよ。C++のように日本語が使えない場合は、英文字の名前に変更しなければいけないんだ。
chen 分かりました。
jun また、クラスの操作には、いくつかの種類があるんだよ。今まで定義してきた操作は、インプリメンタ操作といって、そのクラスの基本的な機能を表すものなんだ。
 
★操作の種類★

 マネージャ操作

オブジェクトの生成や削除のための操作。C++では、コンストラクタやデストラクタにあたる。

 インプリメンタ操作 

クラスの基本的な機能や能力を提供。

 アクセス操作

属性の値へのアクセスをサポート。get/set操作。

 ヘルプ操作

クラスの操作によってのみ利用されるプライベートな操作。
chen なるほど。設計段階では、実装のための内部操作についても考えないといけないのですね。
jun そうだよ。図2.3.3には表示していないが、クラスごとにコンストラクタ、デストラクタをきちんと定義する必要があるよ。また、クラスの属性の可視性はすべてprivateにしていたよね。このうち、外部に公開する必要のある属性については、アクセス操作を提供するんだよ。
chen Jun先輩、外部からは、アクセス操作を通してしか属性にアクセスできないですよね。それなら、アクセス操作をうまく使って設計すれば、クラスの内部情報をカプセル化することができるというわけですね。
jun そのとおりだよ、Chen君。
 

bn_note_att.gif (1447 バイト)

 

jun 次は、関係の設計に入ろう。

 

Prev. Next Home Top