【モジュール分解・オブジェクト指向】分割と独立度〜オブジェクト指向の基礎

【モジュール分解・オブジェクト指向】分割と独立度〜オブジェクト指向の基礎
ハテオ君

システム開発に関しての勉強をしているが、モジュールとオブジェクト指向に関して全く理解できないんだよなぁ...。

今回はこの悩みを解決します!

今回の記事テーマ

システム開発で使われるモジュール分解・オブジェクト指向の基礎知識を徹底解説!

システムを開発するときにはさまざまな手法や工程を行いシステムを完成していきます。

その工程では、モジュール分解やオブジェクト指向という工程もよく使います。

今回はこのモジュール分解とオブジェクト指向に付いて分かりやすく解説していきますので、理解に苦しんでいる方は是非参考にしてください。

本日の記事内容

記事の最後には、今回の内容に関しての確認問題も用意していますので、インプットとアウトプットとしても是非活用してみてください。

元中卒の自分が、誰でも理解できるように解説していきます。

それでは早速見ていきましょう。

黄島 成

モジュール分割の基礎知識

モジュール分割の基礎知識

ソフトウェア方式設計では、サブシステムをプログラム単位に分割しますが、ソフトウェア詳細設計では、さらにモジュールと呼ばれる単位に分割・階層構造にし、モジュール間のインタフェースを明確にします。

モジュールは、ある機能を実現するソフトウェアの部品であり、ソフトウェアユニットとも呼ばれています。

モジュール分解図

モジュール単位に分割することで、モジュールごとに設計・作成・テストができるので作業を分担し、並行して進めやすいという特徴があります。

さらに、問題が起きてもモジュール単位でデバッグでき、モジュールの再利用も可能になります。

モジュール分割の手順

  • 最上位のモジュールの定義
  • モジュールの機能分析
  • モジュール分割技法の選択
  • モジュールの分割
  • インタフェースの定義
  • 分割すべきほかのモジュールの検討

 モジュール分割の留意点

  • モジュールの強度を強く、結合度を弱くすることによって、モジュールの独立性を高める。
  • 1モジュールが適切な大きさのステップ数になるようにする。
  • 1モジュールから呼び出す従属モジュールの数に制限を付ける。
  • モジュールからモジュールを呼び出す階層構造があまり深くならないようにする。
  • モジュール間のインタフェースが単純になるようにする。

2つのモジュール分割技法

モジュール分割技法には、データの流れに着目したプロセス中心設計と、データ構造に着目したデータ中心設計があります。

モジュール分解技法図

データの流れに注目する技法3つ

名称概要
STS分割法プログラムのデータの流れに着目して、入力データを処理する部分、出力データに変換する部分、出力データを処理する部分の3つに分割。
トランザクション分割法トランザクション(データの参照や更新のひとかたまりの処理単位)の種類ごとにモジュールを分割。
共通機能分割法共通な機能を1つにまとめ、共通モジュールとして独立させる。

データ構造に注目する技法2つ

名称概要
ジャクソン法入出力データの構造に着目してモジュールを分割。基本・連続・選択・繰り返しの4つの基本図式を使う。
ワーニエ法扱うデータの構造に着目して、入出力データの構造図を作成し、入力データの構造図を基にプログラム構造図を作成。データがいつ・どこで・何回使われるか分析し、順次・選択・繰り返しの3つの制御構造で表す。

モジュールの独立度

モジュールの独立度

モジュール分割においては、モジュール同士が適切に分割されていないと、切り離して作業を進めることができません。

そこで、どれくらいモジュールが独立しているか(モジュールの独立性)を測る尺度として、

・モジュール強度

・モジュール結合度

があります。順番に詳しく見ていきましょう。

モジュール強度

モジュール強度は、モジュール内の機能間の関連性の強さを表す概念です。

具体的には、モジュールがどれくらい単一の機能に特化して設計されているのかを表す指標です。

モジュール強度が強ければ強いほど独立性が高くなります。

モジュール強度の段階

名称概要強度独立性
機能的強度モジュール内のすべての機能が、単一機能を実行するために関連しあっている強い強い
情報的強度特定のデータ構造を扱う複数の機能が1つのモジュールにまとまっている
連絡的強度複数の逐次的な機能を実行し、モジュール内の機能間でデータを受け渡したり、同じデータを参照したりする
手順的強度複数の逐次的な機能が1つのモジュールにまとまっている
時間的強度ある時点で一括して実行できる機能が1つのモジュールにまとまっている
論理的強度関連した複数の機能を1つにまとめており、どの機能が実行されるかは、呼び出されるときの引数の値によって決定される
暗号的強度複数の全く関係のない機能を実行し、モジュール内の各機能の間に特別の関係が認められない弱い弱い

モジュール結合度

モジュール結合度は、モジュール間の結合の度合いを表す概念です。

具体的には、モジュール同士がどれだけ独立に関連して設計されている度合いを表す指標です。

モジュールの結合度が弱ければ弱いほど、独立性が高くなります。

モジュール結合度の段階

名称概要強度独立性
データ結合データ項目だけをモジュール間の引数として渡す強い強い
スタンプ結合データ構造をモジュール間の引数として渡す
制御結合制御パラメタを引数として渡し、モジュールの実行順序を制御する
外部結合外部宣言したデータを関係するモジュールが参照する
共通結合共通域に定義したデータを関係するモジュールが参照する
内容結合他のモジュール内のデータを直接参照する弱い弱い

モジュール設計において「信頼性・保守性」を向上させるためには、モジュール強度を強く、結合度を弱くすることが重要となります。

オブジェクト指向の基礎知識

オブジェクト指向の基礎知識

C++やJavaは、オブジェクト指向という考え方に基づいた言語です。

オブジェクト指向とは、オブジェクトという概念に注目し、これをモジュール化に役立てる手法です。

具体的には、データ処理やシステム操作を手続きの流れとしてとらえるのではなく、「もの」及びその関係として捉えて設計し、開発を進めていく考え方です。

この処理対象となる「もの」をオブジェクトと言います。

オブジェクトとは、データ(属性)とそれに関するメソッド(手続き)を1つにまとめたものです。
ユーザはオブジェクトの内部を見ることができません(情報の隠蔽化)。

このように、 データとメソッドを1つにまとめた構造にすることを「カプセル化」と言います。

カプセル化

オブジェクト指向カプセル化図

オブジェクト指向では、カプセル化によって外部からのデータの直接アクセスを禁止しています。

また、外部からメッセージを送ること(メッセージバッシング)でメソッドを起動します。

メソッドはメッセージを受けるとデータに対して操作を行います。

オブジェクト指向カプセル化図」

カプセル化することで、オブジェクトの内部データ構造やメソッドの実装を変更しても、 その影響をほかのオブジェクトに及ぼしにくくなるという効果があります。

クラスとインスタンス

クラスト

クラスは、同一のデータ構造と同一のメソッドをもつオブジェクトをまとめて表現した設計図で、雛形(テンプレート)のようなものです。

インスタンスト

インスタンスは、クラスの設計図をもとに作られた個々のオブジェクトで、雛形(テンプ レート)から作られた実体のようなものです。

クラスから作られたインスタンスは、同一のデータ構造と同一のメソッドを持ちます。

例えば、たこ焼で考えた場合

たこ焼きは鋳型に小麦粉を流し込み、たこを入れて焼きますよね。そして1つの鋳型から、いくつものたこ焼きを作る事ができます。

この時の、たこ焼きの鋳型→「クラス」焼き上がった個々のたこ焼き→「インスタンス」に当たります。

このようなイメージで覚えておきましょう。

クラスの階層

クラスは階層構造になっており、上位クラスと下位クラスという上下関係があります。

クラス階層を導く手法としては、

  • 汎化-特化
  • 集約化-分解

などの操作があります。順番に見ていきましょう。

汎化-特化

汎化(抽象化)とは、下位クラスの共通部分を抽出して上位クラスを定義することです 。(その逆のことを特化と呼ぶ。)

クラスが汎化-特化の関係にあるとき、上位クラスを基底クラス(スーパクラス)、下位クラスを派生クラス(サブクラス)と言います。

汎化と特化では、「下位クラス is a 上位クラス」の関係が成り立ちます。

クラスの改装:汎化-特化図

あるクラスの下にサブクラスを定義するとき、上位クラスで定義されたデータとメソッドを下位クラスで引き継いで使うことが可能です。
これを「インヘリタンス(継承)」と呼ぶ。

あとで、下位のクラスを追加するとき、上位クラスを利用して書かれた業務プログラムにメソッドを追加するだけでよく、再利用できる部分が多くなります。

なお、上位クラスのメソッドを一部替えて使いたいときに、下位クラスでも同じ名前で内容を替えて 再度定義できます。
これを「オーバーライド」と呼ぶ

分解-集約化

分解と集約は、複合オブジェクトを扱うときに使用する手法です。

分解と集約では、「下位 クラス is part of 上位クラス」という関係が成立します。

オブジェクト指向:分解一集約化図

下位クラスは上位クラスの構成部品の一部なので、継承はありません。

ポリモルフィズム(多様性・多相性)

ポリモルフィズムは、同一メッセージを各オブジェクトに送っても、オブジェクトによって動作が異なる性質です。

オーバーライドで実現できます。

■ポリモルフィズム(多様性・多相性)

補足:会員管理システムの例

上記でオブジェクト指向を説明しましたが、今度は実際に会員管理に関するシステムを、オブジェクト指向の考え方で設計する例を見てみましょう。

オブジェクト指向:会員システムの例

クラス階層とメソッドを次のように表記するとします。

  • 会員の種別には、正会員と週末会員があります。
  • 正会員の入会金は5万円、週末会員の入会金は3万円です。
  • 入会時に、住所、氏名、生年月日などの管理情報をシステムに登録します。
  • 会員が退会した場合には、登録済みの管理情報を削除します。
  • 会員からは毎月会費を徴収します。
  • 会員には、主催のイベント情報を通知します。ただし、通知の時期は正会員には イベントの開催1ヶ月前、週末会員には2周間前とします。
  • 週末会員は、入会金の差額を払うと正会員への種別変更が可能です。

このシステムを先程の表記法に従って図示したものが次の図です。

オブジェクト指向:会員システムの例②

会員クラスで定義している各種メソッドを、正会員や週末会員のクラスでは定義していません。

このように、オブジェクト指向ではクラス階層の上位クラスで定義したデータやメソッドを下位クラスが引き継ぐことができます。
これが「インヘリタンス」です。

また、システム要件⑥を満足するためには、正会員クラスと週末会員クラスのインスタンスが受ける「メッセージ」イベント情報を「通知する」は、同じメッセージ名でも処理内容が異なります。
これが「ポリモルフィズム」です。

今回のまとめ&確認問題

【モジュール分解・オブジェクト指向】分割と独立度〜オブジェクト指向の基礎「まとめ&確認問題

モジュール分解・オブジェクト指向については上記内容で以上となります。

それではまず今回の内容をまとめていきましょう。

まとめ

  • ソフトウェア詳細設計では、モジュールと単位に分割・階層構造にし、モジュール間のインタフェースを明確にする
  • モジュール強度は、モジュール内の機能間の関連性の強さを表す概念
  • モジュール結合度は、モジュール間の結合の度合いを表す概念
  • オブジェクト指向とは、オブジェクトという概念に注目し、これをモジュール化に役立てる手法

今回の確認問題「アウトプット用」

確認問題

システム確認問題⑧

「次へ」で問題スタート!

①解説

【問題①】

モジュールの独立性を高めるには、モジュール結合度を低くする必要がある。モジュール間の情報の受渡し方法のうち、モュール結合度が最も低いものはどれか。

:共通域に定義したデータを関係するモジュールが参照する。
不正解× 共通結合
:制御パラメタを引数として渡し、モジュールの実行順序を制御する。
不正解× 制御結合
:データ項目だけをモジュール間の引数として渡す。
正解○
:必要なデータを外部宣言して共有する
不正解× 外部結合

【解説】

モジュール結合度は、モジュール間の結合の度合いを表す概念です。

具体的には、モジュール同士がどれだけ独立に関連して設計されている度合いを表す指標です。

モジュールの結合度が弱ければ弱いほど、独立性が高くなります。

名称概要強度独立性
データ結合データ項目だけをモジュール間の引数として渡す強い強い
スタンプ結合データ構造をモジュール間の引数として渡す
制御結合制御パラメタを引数として渡し、モジュールの実行順序を制御する
外部結合外部宣言したデータを関係するモジュールが参照する
共通結合共通域に定義したデータを関係するモジュールが参照する
内容結合他のモジュール内のデータを直接参照する弱い弱い

つまり答えは「」となる。

②解説

【問題②】

オブジェクト指向の基本概念の組合せとして、適切なものはどれか。
:仮想化,構造化,投影,クラス
不正解× 構造化と投影が誤り
:具体化,構造化,連続,クラス
不正解× 構造化と連続が誤り
:正規化,カプセル化,分割,クラス
不正解× 正規化と分割が誤り
:抽象化,カプセル化,継承,クラス
正解○

【解説】

オブジェクト指向とは、オブジェクトという概念に注目し、これをモジュール化に役立てる手法です。

具体的には、データ処理やシステム操作を手続きの流れとしてとらえるのではなく、「もの」及びその関係として捉えて設計し、開発を進めていく考え方です。

オブジェクト指向の基本概念である、抽象化、具体化、カプセル化、継承、クラス、多様性については以下の通りです。

つまり答えは「」となる。

③解説

【問題③】

オブジェクト指向におけるカプセル化を説明したものはどれか。

:同じ性質をもつ複数のオブジェクトを抽象化して、整理すること
不正解× 抽象化の説明
:基底クラスの性質を派生クラスに受け継がせること
不正解× インヘリタンス(継承)の説明
:クラス間に共通する性質を抽出し、基底クラスを作ること
不正解× 汎化の説明
:データとそれを操作する手続を一つのオブジェクトにして、データと手続の詳細をオブジェクトの外部から隠蔽すること
正解○

【解説】

データとメソッドを1つにまとめた構造にすることを「カプセル化」と言います。

カプセル化によって外部からのデータの直接アクセスを禁止しています。

また、外部からメッセージを送ること(メッセージバッシング)でメソッドを起動します。

カプセル化することで、オブジェクトの内部データ構造やメソッドの実装を変更しても、 その影響をほかのオブジェクトに及ぼしにくくなるという効果があります。

つまり答えは「」となる。

最後まで読んでいただきありがとうございました!

今回の内容が、役に立ったな!と思ったらシェア&ブクマ登録よろしくお願いします。

また、質問や問い合わせに関しては、コメント欄かお問い合わせフォームを活用ください。

それではまたお会いしましょう。

黄島 成

-システム