Object-oriented-analysis-design-ooad-object-oriented-model
OOAD-オブジェクトモデル
オブジェクトモデルは、ソフトウェアアプリケーションの要素をオブジェクトの観点から視覚化します。 この章では、オブジェクト指向システムの基本概念と用語について説明します。
オブジェクトとクラス
オブジェクトとクラスの概念は本質的に相互にリンクされており、オブジェクト指向のパラダイムの基盤を形成します。
対象
オブジェクトは、物理的または概念的に存在する可能性のあるオブジェクト指向環境の現実世界の要素です。 各オブジェクトには-
- システム内の他のオブジェクトと区別するID。
- オブジェクトの特性プロパティと、オブジェクトが保持するプロパティの値を決定する状態。
- 状態の変化に関して、オブジェクトによって実行される外部から見えるアクティビティを表す動作。
オブジェクトは、アプリケーションのニーズに応じてモデル化できます。 オブジェクトには、顧客、自動車などの物理的な存在が含まれる場合があります。または、プロジェクト、プロセスなどの無形の概念的存在
クラス
クラスは、共通の動作を示す同じ特性プロパティを持つオブジェクトのコレクションを表します。 それから作成できるオブジェクトの設計図または説明を提供します。 クラスのメンバーとしてのオブジェクトの作成は、インスタンス化と呼ばれます。 したがって、オブジェクトはクラスのインスタンスです。
クラスの構成要素は-
- クラスからインスタンス化されるオブジェクトの属性のセット。 一般に、クラスの異なるオブジェクトには、属性の値に多少の違いがあります。 多くの場合、属性はクラスデータと呼ばれます。
- クラスのオブジェクトの動作を表す一連の操作。 操作は、関数またはメソッドとも呼ばれます。
例
2次元空間の幾何学的図形の円を表す単純なクラスCircleを考えてみましょう。 このクラスの属性は次のように識別できます-
- x-coord、中心のx座標を示します
- y座標、中心のy座標を示す
- a、円の半径を示す
その操作のいくつかは次のように定義することができます-
- findArea()、面積を計算するメソッド
- findCircumference()、円周を計算する方法
- scale()、半径を増減する方法
インスタンス化中に、少なくともいくつかの属性に値が割り当てられます。 オブジェクトmy_circleを作成すると、x-coord:2、y-coord:3、a:4などの値を割り当てて、その状態を表すことができます。 さて、操作scale()がスケーリング係数2のmy_circleで実行されると、変数aの値は8になります。 この操作により、my_circleの状態が変化します。つまり、オブジェクトは特定の動作を示しました。
カプセル化とデータの非表示
カプセル化
カプセル化は、クラス内で属性とメソッドの両方をバインドするプロセスです。 カプセル化により、クラスの内部詳細を外部から隠すことができます。 クラスが提供するインターフェイスを介してのみ、外部からクラスの要素にアクセスできます。
データ隠蔽
通常、クラスは、そのクラスメソッドによってのみデータ(属性)にアクセスでき、外部からの直接アクセスから隔離されるように設計されています。 オブジェクトのデータを隔離するこのプロセスは、データ非表示または情報非表示と呼ばれます。
例
クラスCircleでは、クラスの外部から属性を非表示にし、クラスデータにアクセスするためのクラスにさらに2つのメソッドを追加することで、データの非表示を組み込むことができます。
- setValues()、x-coord、y-coord、およびaに値を割り当てるメソッド
- getValues()、x-coord、y-coord、およびaの値を取得するメソッド
ここでは、オブジェクトmy_circleのプライベートデータに、クラスCircle内にカプセル化されていないメソッドから直接アクセスすることはできません。 代わりに、メソッドsetValues()およびgetValues()を使用してアクセスする必要があります。
メッセージの受け渡し
どのアプリケーションでも、調和のとれた方法で相互作用する多くのオブジェクトが必要です。 システム内のオブジェクトは、メッセージパッシングを使用して相互に通信できます。 システムにobj1とobj2の2つのオブジェクトがあるとします。 obj1がメソッドの1つをobj2に実行させる場合、オブジェクトobj1はオブジェクトobj2にメッセージを送信します。
メッセージパッシングの機能は次のとおりです-
- 2つのオブジェクト間でのメッセージの受け渡しは通常、単方向です。
- メッセージの受け渡しにより、オブジェクト間のすべての対話が可能になります。
- メッセージの受け渡しには、本質的にクラスメソッドの呼び出しが含まれます。
- 異なるプロセスのオブジェクトがメッセージの受け渡しに関与する可能性があります。
継承
継承は、その機能を拡張および改良することにより、既存のクラスから新しいクラスを作成できるようにするメカニズムです。 既存のクラスは基本クラス/親クラス/スーパークラスと呼ばれ、新しいクラスは派生クラス/子クラス/サブクラスと呼ばれます。 サブクラスは、スーパークラスで許可されている場合、スーパークラスの属性とメソッドを継承または派生できます。 また、サブクラスは独自の属性とメソッドを追加し、スーパークラスのメソッドを変更できます。 継承は、「is – a」関係を定義します。
例
クラス哺乳類から、人間、猫、犬、牛などの多くのクラスを派生させることができます。 人間、猫、犬、牛はすべて哺乳類の特徴を持っています。 さらに、それぞれに固有の特性があります。 牛は哺乳類であると言えます。
継承の種類
- Single Inheritance -サブクラスは、単一のスーパークラスから派生します。
- Multiple Inheritance -サブクラスは複数のスーパークラスから派生します。
- マルチレベル継承-サブクラスはスーパークラスから派生し、スーパークラスは別のクラスなどから派生します。
- 階層的継承-クラスには複数のサブクラスがあり、各サブクラスには後続のサブクラスがあり、ツリー構造を形成するために複数のレベルで継続します。
- ハイブリッド継承-ラティス構造を形成するための複数およびマルチレベルの継承の組み合わせ。
次の図は、さまざまなタイプの継承の例を示しています。
多型
ポリモーフィズムはもともとギリシャ語で、複数の形式を取る能力を意味します。 オブジェクト指向のパラダイムでは、ポリモーフィズムとは、操作対象のインスタンスに応じて、さまざまな方法で操作を使用することを意味します。 多態性により、異なる内部構造を持つオブジェクトが共通の外部インターフェイスを持つことができます。 ポリモーフィズムは、継承を実装するときに特に効果的です。
例
それぞれがメソッドfindArea()を持つ2つのクラス、CircleとSquareを考えてみましょう。 クラス内のメソッドの名前と目的は同じですが、内部実装、つまり面積を計算する手順はクラスごとに異なります。 CircleクラスのオブジェクトがfindArea()メソッドを呼び出すと、SquareクラスのfindArea()メソッドと競合することなく、操作によって円の領域が検出されます。
一般化と専門化
汎化と特殊化は、サブクラスがスーパークラスから継承するクラス間の関係の階層を表します。
一般化
一般化プロセスでは、クラスの共通の特性が結合されて、より高いレベルの階層でクラスが形成されます。つまり、サブクラスが結合されて、一般化されたスーパークラスが形成されます。 それは「----種類-」関係を表します。 たとえば、「車は陸上車両の一種」または「船は一種の水上車両」です。
特化
専門化は、一般化の逆のプロセスです。 ここでは、オブジェクトのグループの特徴を使用して、既存のクラスから特殊なクラスを形成します。 サブクラスはスーパークラスの特殊バージョンであると言えます。
次の図は、一般化と特殊化の例を示しています。
リンクと関連付け
Link
リンクは、オブジェクトが他のオブジェクトと共同作業するための接続を表します。 ルンボーは、それを「オブジェクト間の物理的または概念的な接続」と定義しています。 リンクを介して、1つのオブジェクトがメソッドを呼び出したり、別のオブジェクトをナビゲートしたりできます。 リンクは、2つ以上のオブジェクト間の関係を表します。
協会
関連付けは、共通の構造と共通の動作を持つリンクのグループです。 関連付けは、1つ以上のクラスのオブジェクト間の関係を表します。 リンクは、関連付けのインスタンスとして定義できます。
協会の程度
関連度は、接続に関係するクラスの数を示します。 学位は単項、二項、三項のいずれかです。
- *単項関係*は、同じクラスのオブジェクトを接続します。
- *バイナリ関係*は2つのクラスのオブジェクトを接続します。
- *三項関係*は、3つ以上のクラスのオブジェクトを接続します。
関連付けのカーディナリティ比
バイナリアソシエーションのカーディナリティは、アソシエーションに参加しているインスタンスの数を示します。 カーディナリティ比には3つのタイプがあります。
- 1対1 -クラスAの単一オブジェクトは、クラスBの単一オブジェクトに関連付けられます。
- * 1対多*-クラスAの単一のオブジェクトは、クラスBの多くのオブジェクトに関連付けられます。
- 多対多-クラスAのオブジェクトはクラスBの多くのオブジェクトに関連付けられ、逆にクラスBのオブジェクトはクラスAの多くのオブジェクトに関連付けられます。
集約または構成
集約または合成は、クラスを他のクラスのオブジェクトの任意の組み合わせで構成できるクラス間の関係です。 オブジェクトを他のクラスの本体内に直接配置できます。 集約は、「一部」または「有」関係と呼ばれ、全体からその部分にナビゲートする機能を備えています。 集合オブジェクトは、1つ以上の他のオブジェクトで構成されるオブジェクトです。
例
「自動車にはモーターがあります」という関係では、自動車はオブジェクト全体または集合体であり、モーターは自動車の「一部」です。 集約が示す場合があります-
- 物理的封じ込め-例、コンピューターはモニター、CPU、マウス、キーボードなどで構成されます。
- 概念的封じ込め-例、株主は共有しています。
オブジェクトモデルの利点
オブジェクトの向きに関する中核となる概念を検討したので、このモデルが提供する利点に注目する価値があります。
オブジェクトモデルを使用する利点は次のとおりです-
- ソフトウェアの開発を迅速化するのに役立ちます。
- 保守が簡単です。 モジュールがエラーを発生させた場合、ソフトウェアの他の部分がまだ稼働している間にプログラマーがその特定のモジュールを修正できるとします。
- 比較的手間のかからないアップグレードをサポートします。
- オブジェクト、デザイン、機能の再利用が可能になります。
- 特に複雑なシステムの統合において、開発リスクを軽減します。