操作の実装 ページの先頭へ

操作を実装するには次のことを実行します。

  • アルゴリズムを選択します。
  • アルゴリズムに最適なデータ構造を選択します。
  • 必要に応じて新クラスと新操作を定義します。
  • 操作をコーディングします。
アルゴリズムの選択

操作の中には単純で、操作とその仕様から実装できるものが多数あります。

重要なアルゴリズムが必要となるのは、1 つは、仕様が与えられている複雑な操作を実装するため、もう 1 つは、簡単だが効率が悪いアルゴリズムが定義として与えられている操作を最適化するためです。

アルゴリズムに最適なデータ構造の選択

アルゴリズムの選択には、作業を行うデータ構造を選択する作業もあります。実装データ構造の多くは配列、リスト、キュー、スタック、セット、バッグ、そしてこれらのバリエーションなどのコンテナー・クラスです。 ほとんどのオブジェクト指向言語とプログラミング環境では、この種の再利用可能コンポーネントを備えたクラス・ライブラリーが提供されています。

必要に応じて新クラスと新操作を定義

中間結果の保持などのために新規クラスを見つける場合もあります。複雑な操作を分割するために、新しい低レベルの操作をクラスに追加する場合もあります。多くの場合、これらの操作はクラスにとってプライベートで、クラス外からは見えません。

操作のコーディング

インターフェース文から始まる操作のコードを書きます。 該当するプログラミング・ガイドラインに従ってください。

状態の実装 ページの先頭へ

属性の値を参照することにより、オブジェクトの状態を実装できる場合があります。表現には特別なものはありません。 属性値が変化すると、このようなオブジェクトの状態遷移は暗黙のうちに行われます。振る舞いの変化は条件文を使ってプログラムします。  この解決法は、複雑な振る舞いには満足のいくものではありません。通常、構造の複雑化を招き、状態が追加されたり、振る舞いが変化するにしたがって、変更が困難になるからです。

設計要素 (またはその構成要素) の振る舞いが状態に依存する場合、通常、設計要素を構成するモデル要素の振る舞いを記述するステートチャート図が 1 つ以上存在します。 このステートチャート図は、実装作業中の重要な入力として役立ちます。

ステートチャート図に示した状態マシンで、オブジェクトの状態を明示し、移行と必要な振る舞いを明確に表現します。 状態マシンは、次に示すいくつかの方法で実装できます。

  • 単純な状態マシンの場合、可能な状態を列挙する属性を定義し、着信メッセージの振る舞いを選択するときの属性を使用します。 たとえば、Java または C++ の switch 文でそうします。この解決法は、 複雑な状態マシンには十分に対応しないため、実行時のパフォーマンスが悪くなる可能性があります。 この方法の例は、第 4 章 4.4.3 の [DOUG98] を参照してください。
  • さらに複雑な状態マシンの場合、状態パターンを使用できます。状態パターンの説明については、[GAM94] を参照してください。 [DOUG98]、第 6 章 6.2.3 の「State Pattern」でも、この方法を説明しています。
  • 変更のしやすさという基準を重視する非常に複雑な状態マシンの場合、表形式の作業方法が役立ちます。 この方法では、表内の各状態ごとに項目があります。ここでは、各項目は、 入力を後続の状態および関連付けられた移行アクションに割り当てます。 この方法の例については、[DOUG98]、第 6 章 6.2.3 の「State Table Pattern」を参照してください。

並行サブ状態を持つ状態マシンは、アクティブ・オブジェクト (個々の並行サブ状態に対応) に状態管理を委譲することで実装可能です。並行サブ状態は、独立した計算 (独立してはいるが、相互作用する場合もある) を表現するからです。各サブ状態は、以上のいずれかの手法を使用して管理できます。

委譲を使用した実装の再利用 ページの先頭へ

クラス、またはクラスの部品が既存のクラスを再利用して実装可能な場合、継承ではなく、委譲を使用します。

委譲とは、クラスを他のクラスの助けを借りて実装することをいいます。クラスは、変数を使用して、 他のクラスのオブジェクトを参照します。操作を呼び出すと、その操作は、実際の実行のために、 再利用されるクラスの参照先のオブジェクトの操作を呼び出します。 そのため、責任は他のクラスに委譲されます。

関連の実装 ページの先頭へ

単方向の関連は、オブジェクト参照を含む属性である、ポインターとして実装されます。 多重度が 1 であれば、1 つのポインターとして実装されます。 多重度がの場合、ポインターのセットになります。 の関連端に順序がある場合は、セットの代わりにリストを使用できます。

双方向の関連は、両方向の属性として実装しますが、単方向の関連の手法を使用します。

限定子付き関連は、限定オブジェクトの中に (Smalltalk 言語の Dictionary クラスなど) 参照表として実装します。 参照表の中のセレクター値は限定子であり、ターゲットの値は別のクラスのオブジェクトです。

限定子の値を順序に従ってアクセスする必要がある場合、限定子をソートされた配列またはツリー状にそろえることができます。 この場合には、アクセス時間は log N に比例します。ここで、N は限定子の値の数です。

限定子をコンパクトな有限セットから引き出す場合は、限定子の値は整数の範囲にマッピングでき、関連は配列として効率的に実装できます。 このアプローチは、関連がまばらなときよりも、密に関連している方が、有限セットには理想的です。

ほとんどのオブジェクト指向言語とプログラミング環境では、異なる種類の関連を実装する再利用可能コンポーネントがあるクラス・ライブラリーを備えています。

属性の実装 ページの先頭へ

属性は、組み込みの基本タイプまたは既存クラスとして使用するか、新規クラスを定義することによって実装します。 多くの場合、新規クラスを定義する方が柔軟性は高くなりますが、不必要な間接性が導入されることになります。 たとえば、従業員の社会保障番号は、文字列型の属性としても、新規クラスとしても実装できます。

属性を実装する他の方法の図

属性を実装するほかの方法。

次の例に示すように、新規クラスに属性のグループを結合する場合もあります。 どちらの実装も正解です。

Point クラスへ実装する Line の属性

Point クラスへの関連として実装する Line の属性。

Rational Unified Process   2003.06.15