💨

モジュールの解説【モジュール設計】

2023/02/07に公開

モジュールを知るだけでそのプログラムが良い(保守面という意味で)かどうかの判断がつくようになるのです。
(モジュール強度等に至ってはOOPの設計に輸入されているほどです。)

モジュール

モジュールの意味を調べてみると『プログラムを構成するひとまとまりの部品』といった非常に抽象的な概念のような説明がなされていると思います。
また設計手法、思想やプログラミング言語によってモジュールと呼ばれる対象が微妙に異なってきます。

しかしモジュールには、モジュール設計によって以下の条件を満たすように要求されます。

・モジュールの独立性

ここで言う独立性とは、複数のモジュールがお互い影響を与えないことを指します。

独立性を担保する二つの指標

モジュールの良さ(独立性)を評価するには、以下の二つの指標がよく上げられます。
・モジュール強度 → 強いのが良い
・モジュール結合度 → 弱いのが良い

モジュール強度

表の上ほど強い。

機能的強度 全ての要素が一つの機能を実行する
情報的強度 特定のデータに対し複数の機能
連絡的強度 各機能が同一データを扱いながら、手順的
手順的強度 手順的に前後の機能をまとめる
時間的強度 実行するタイミングでまとめられている
論理的強度 関連性があり、引数などによりどの処理を行うか選択するような構造で複数の機能をまとめた状態
暗号的強度 関連のない機能でまとめられている。

OOPのクラスに対応させると...

オブジェクト指向でモジュールに該当するのは「クラス」

神クラス → 暗号的強度
単一責任の原則に沿って作成されたクラス → 機能的強度

SOLID原則に従って設計すると良いモジュールへとなるわけですね。

モジュール結合度

表の上ほど弱い

データ結合 処理に必要なデータだけを単一のパラメータとして受け渡し
スタンプ結合 処理に必要なデータだけをデータ構造として受け渡し
制御結合 モジュールが外部のデータによって、制御している。
外部結合 外部宣言した部分のみ、各モジュールで共有
共通結合 共通域に定義したデータを各モジュールが参照
内容結合 ほかのモジュール内のデータを直接参照

※共有結合と外部結合の違いはぱっと見わかりづらい。共有結合の場合、二つのモジュールが同じグローバルデータ(変数)を共有する。一方外部結合は外部の共通データを介して情報を交換する関係を指す。共有結合の場合は、グローバルデータがいつどこで書き換わったのかわかりにくくなるのでよろしくない。

制御結合の例

関数get_teacher_nameは引数の値によって制御が変わる。

from enum import Enum


class Subject(Enum):
    SCIENCE = 1
    MUSIC = 2


def get_teacher_name(subject:Subject):
    if subject is Subject.MUSIC:
        return "サトウ"
    if subject is Subject.SCIENCE:
        return "タナカ"

構造化設計におけるモジュール分割技法

構造化設計自体は1980年台に特に栄えたそう..

STS分割 Source,Transform,Sinkに分割
TR分割 トランザクションの種別ごとに分割
共通機能分割 共通した機能をまとめて、別のモジュールにする
ワーニエ法
ジャクソン法

Discussion