OOAD-オブジェクトモデル

オブジェクトモデルは、ソフトウェアアプリケーションの要素をオブジェクトの観点から視覚化します。この章では、オブジェクト指向システムの基本的な概念と用語について説明します。

オブジェクトとクラス

オブジェクトとクラスの概念は本質的に相互にリンクされており、オブジェクト指向パラダイムの基盤を形成します。

オブジェクト

オブジェクトは、物理的または概念的な存在を持つ可能性のあるオブジェクト指向環境の実世界の要素です。各オブジェクトには-があります

  • システム内の他のオブジェクトからそれを区別するアイデンティティ。

  • オブジェクトの特性プロパティと、オブジェクトが保持するプロパティの値を決定する状態。

  • オブジェクトの状態の変化に関して、オブジェクトによって実行される外部から見えるアクティビティを表す動作。

オブジェクトは、アプリケーションのニーズに応じてモデル化できます。オブジェクトには、顧客や車などの物理的な存在が含まれる場合があります。または、プロジェクト、プロセスなどの無形の概念的存在。

クラス

クラスは、共通の動作を示す同じ特性を持つオブジェクトのコレクションを表します。それから作成できるオブジェクトの青写真または説明を提供します。クラスのメンバーとしてのオブジェクトの作成は、インスタンス化と呼ばれます。したがって、オブジェクトはクラスのインスタンスです。

クラスの構成要素は次のとおりです。

  • クラスからインスタンス化されるオブジェクトの属性のセット。一般に、クラスのオブジェクトが異なれば、属性の値にも多少の違いがあります。属性は、クラスデータと呼ばれることがよくあります。

  • クラスのオブジェクトの動作を表す一連の操作。操作は、関数またはメソッドとも呼ばれます。

Example

2次元空間で幾何学的図形の円を表す単純なクラスCircleを考えてみましょう。このクラスの属性は次のように識別できます-

  • x座標、中心のx座標を示します
  • y座標、中心のy座標を示します
  • a、円の半径を示す

その操作のいくつかは次のように定義できます-

  • findArea()、面積を計算するメソッド
  • findCircumference()、円周を計算するメソッド
  • scale()、半径を増減するメソッド

インスタンス化中に、少なくとも一部の属性に値が割り当てられます。オブジェクトmy_circleを作成する場合、x-coord:2、y-coord:3、a:4などの値を割り当てて、その状態を表すことができます。ここで、スケーリング係数2のmy_circleで操作scale()を実行すると、変数aの値は8になります。この操作により、my_circleの状態が変化します。つまり、オブジェクトは特定の動作を示します。

カプセル化とデータ隠蔽

カプセル化

カプセル化は、クラス内で属性とメソッドの両方をバインドするプロセスです。カプセル化により、クラスの内部の詳細を外部から隠すことができます。これにより、クラスの要素は、クラスによって提供されるインターフェイスを介してのみ外部からアクセスできます。

データの隠蔽

通常、クラスは、そのデータ(属性)がそのクラスメソッドによってのみアクセスでき、直接の外部アクセスから隔離されるように設計されています。オブジェクトのデータを分離するこのプロセスは、データ隠蔽または情報隠蔽と呼ばれます。

Example

クラスCircleでは、属性をクラスの外部から非表示にし、クラスデータにアクセスするための2つのメソッドをクラスに追加することで、データの非表示を組み込むことができます。

  • setValues()、x-coord、y-coord、およびaに値を割り当てるメソッド
  • getValues()、x-coord、y-coord、およびaの値を取得するメソッド

ここで、オブジェクトmy_circleのプライベートデータには、Circleクラス内にカプセル化されていないメソッドから直接アクセスすることはできません。代わりに、メソッドsetValues()およびgetValues()を介してアクセスする必要があります。

メッセージパッシング

どのアプリケーションでも、調和のとれた方法で相互作用する多数のオブジェクトが必要です。システム内のオブジェクトは、メッセージパッシングを使用して相互に通信できます。システムにobj1とobj2の2つのオブジェクトがあるとします。obj1がobj2にそのメソッドの1つを実行させたい場合、オブジェクトobj1はオブジェクトobj2にメッセージを送信します。

メッセージパッシングの特徴は次のとおりです。

  • 2つのオブジェクト間で受け渡されるメッセージは、通常、単方向です。
  • メッセージパッシングにより、オブジェクト間のすべての相互作用が可能になります。
  • メッセージパッシングには、基本的にクラスメソッドの呼び出しが含まれます。
  • さまざまなプロセスのオブジェクトがメッセージパッシングに関与する可能性があります。

継承

継承は、その機能を拡張および改良することにより、既存のクラスから新しいクラスを作成できるようにするメカニズムです。既存のクラスは基本クラス/親クラス/スーパークラスと呼ばれ、新しいクラスは派生クラス/子クラス/サブクラスと呼ばれます。サブクラスは、スーパークラスで許可されている場合に限り、スーパークラスの属性とメソッドを継承または派生させることができます。さらに、サブクラスは独自の属性とメソッドを追加したり、スーパークラスのメソッドを変更したりできます。継承は「is-a」関係を定義します。

Example

哺乳類のクラスから、人間、猫、犬、牛などの多くのクラスを導き出すことができます。人間、猫、犬、牛はすべて、哺乳類の独特の特徴を持っています。さらに、それぞれに固有の特性があります。牛は「哺乳類」であると言えます。

継承の種類

  • Single Inheritance −サブクラスは単一のスーパークラスから派生します。

  • Multiple Inheritance −サブクラスは複数のスーパークラスから派生します。

  • Multilevel Inheritance −サブクラスはスーパークラスから派生し、スーパークラスは別のクラスから派生します。

  • Hierarchical Inheritance −クラスにはいくつかのサブクラスがあり、各サブクラスには後続のサブクラスがあり、ツリー構造を形成するためにいくつかのレベルが続きます。

  • Hybrid Inheritance −格子構造を形成するための、複数レベルとマルチレベルの継承の組み合わせ。

次の図は、さまざまなタイプの継承の例を示しています。

ポリモーフィズム

ポリモーフィズムはもともとギリシャ語で、複数の形をとる能力を意味します。オブジェクト指向パラダイムでは、ポリモーフィズムは、操作対象のインスタンスに応じて、さまざまな方法で操作を使用することを意味します。ポリモーフィズムにより、内部構造が異なるオブジェクトに共通の外部インターフェイスを持たせることができます。継承を実装する場合、ポリモーフィズムは特に効果的です。

Example

それぞれがメソッドfindArea()を持つ2つのクラスCircleとSquareを考えてみましょう。クラス内のメソッドの名前と目的は同じですが、内部実装、つまり面積の計算手順はクラスごとに異なります。クラスCircleのオブジェクトがそのfindArea()メソッドを呼び出すと、操作はSquareクラスのfindArea()メソッドと競合することなく円の領域を検索します。

一般化と専門化

一般化と特殊化は、サブクラスがスーパークラスから継承するクラス間の関係の階層を表します。

一般化

一般化プロセスでは、クラスの共通の特性が組み合わされて、より高いレベルの階層のクラスが形成されます。つまり、サブクラスが組み合わされて、一般化されたスーパークラスが形成されます。これは、「is – a – kind –of」の関係を表します。たとえば、「車は一種の陸上車両」、「船は一種の水上車両」などです。

専門分野

特殊化は、一般化の逆のプロセスです。ここでは、オブジェクトのグループの特徴的な機能を使用して、既存のクラスから特殊なクラスを形成します。サブクラスはスーパークラスの特殊バージョンと言えます。

次の図は、一般化と特殊化の例を示しています。

リンクと関連付け

リンク

リンクは、オブジェクトが他のオブジェクトとコラボレーションするための接続を表します。Rumbaughは、それを「オブジェクト間の物理的または概念的な接続」と定義しています。リンクを介して、1つのオブジェクトがメソッドを呼び出したり、別のオブジェクトをナビゲートしたりできます。リンクは、2つ以上のオブジェクト間の関係を示しています。

協会

アソシエーションは、共通の構造と共通の動作を持つリンクのグループです。関連付けは、1つ以上のクラスのオブジェクト間の関係を表します。リンクは、関連付けのインスタンスとして定義できます。

協会の学位

関連付けの程度は、接続に関係するクラスの数を示します。学位は、単項、二項、または三元の場合があります。

  • A unary relationship 同じクラスのオブジェクトを接続します。

  • A binary relationship 2つのクラスのオブジェクトを接続します。

  • A ternary relationship 3つ以上のクラスのオブジェクトを接続します。

アソシエーションのカーディナリティ比率

バイナリアソシエーションのカーディナリティは、アソシエーションに参加しているインスタンスの数を示します。カーディナリティ比率には、次の3つのタイプがあります。

  • One–to–One −クラスAの単一のオブジェクトは、クラスBの単一のオブジェクトに関連付けられています。

  • One–to–Many −クラスAの単一のオブジェクトは、クラスBの多くのオブジェクトに関連付けられています。

  • Many–to–Many −クラスAのオブジェクトは、クラスBの多くのオブジェクトに関連付けられ、逆に、クラスBのオブジェクトはクラスAの多くのオブジェクトに関連付けられる場合があります。

集約または構成

集約または構成は、クラス間の関係であり、これにより、クラスは他のクラスのオブジェクトの任意の組み合わせで構成できます。これにより、オブジェクトを他のクラスの本体内に直接配置できます。集約は「一部」または「持っている」関係と呼ばれ、全体からその一部にナビゲートする機能があります。集約オブジェクトは、1つ以上の他のオブジェクトで構成されるオブジェクトです。

Example

「車にはモーターがある」という関係では、車はオブジェクト全体または集合体であり、モーターは車の「一部」です。集計は-を表す場合があります

  • Physical containment −たとえば、コンピューターはモニター、CPU、マウス、キーボードなどで構成されています。

  • Conceptual containment −例として、株主は–シェアを持っています。

オブジェクトモデルの利点

オブジェクト指向に関するコアコンセプトを確認したので、このモデルが提供する利点に注目する価値があります。

オブジェクトモデルを使用する利点は次のとおりです。

  • ソフトウェアの開発を迅速化するのに役立ちます。

  • メンテナンスが簡単です。モジュールでエラーが発生した場合、ソフトウェアの他の部分がまだ稼働している間に、プログラマーはその特定のモジュールを修正できます。

  • 比較的手間のかからないアップグレードをサポートします。

  • オブジェクト、デザイン、および機能の再利用を可能にします。

  • 特に複雑なシステムの統合において、開発リスクを軽減します。