モジュールとサンプル間の結合
モジュール間の結合とは、モジュール間の相互依存の度合いを指します。さまざまな結合タイプは、次のようなモジュール間の関係を表します。
-
結合なし: 2 つ以上のモジュール間に相互依存性はなく、相互に独立しています。各モジュールは、他のモジュールに影響を与えることなく、独立して開発、テスト、保守できます。
-
コモンカップリング: 複数のモジュールが同じものを共有しますグローバルデータまたは、相互に直接的または間接的な依存関係を持つストレージ領域。このタイプの結合により、モジュール間の結合が増加する可能性があり、1 つのモジュールへの変更が他のモジュールの動作に影響を与える可能性があります。
ModuleA と ModuleB という 2 つのモジュールがあるとします。両方とも、特定のカウント値を記録するためにグローバル変数 count を使用する必要があります。共通結合の場合、これら 2 つのモジュールはグローバル変数 count に直接アクセスして変更します。
モジュールA モジュール:
# ModuleA.py def increment_count(): global count count += 1 def get_count(): return count
モジュールBモジュール:
# ModuleB.py def decrement_count(): global count count -= 1 def print_count(): print("Count:", count)
この例では、ModuleA と ModuleB は両方ともグローバル変数 count に依存しており、直接アクセスして変更します。 count の値をどこかで変更すると、他のモジュールによる count の動作に影響を与えます。グローバル変数を共有するこの方法により、モジュール間の結合が強化され、1 つのモジュールを変更すると、他のモジュールに予期しない影響が及ぶ可能性があります。
-
データ結合: モジュールはデータを共有することによって通信および対話しますが、それらの間には直接の関数呼び出しや制御関係はありません。データ結合の程度は、共有されるデータの量とデータの複雑さによって異なります。このタイプの結合では、明確に定義されたインターフェイスとデータ構造を通じてモジュール間の依存関係を軽減できます。モジュールは、グローバル変数に直接アクセスするのではなく、 パラメータを渡すことによってデータを共有します。データ結合の使用例を次に示します。
モジュールA モジュール:
# ModuleA.py def increment_count(count): return count + 1
モジュールBモジュール:
# ModuleB.py def decrement_count(count): return count - 1 def print_count(count): print("Count:", count)
この例では、ModuleA と ModuleB はグローバル変数カウントに直接依存しなくなり、関数パラメーターを通じてデータを共有します。各モジュールはカウントパラメータを受け取り、変更された値を返します。このようにして、各モジュールは、他のモジュールの動作に直接影響を与えることなく、カウントのコピーを独立して処理できます。モジュール間の依存関係がより明確になり、制御可能になり、結合が軽減されます。
この例を通じて、パブリック カップリングとデータ カップリングの違いがわかります。パブリック結合では、共有グローバル変数を介してモジュール間の通信が実現され、1 つのモジュールを変更すると他のモジュールに影響を与える可能性があります。データ結合ではパラメータを渡すことでデータを共有します。各モジュールには独自のコピーがあります。1 つのモジュールのパラメータを変更しても、他のモジュールには直接影響しません。データ結合方法はより柔軟で、独立性があり、保守可能です。
-
スタンプカップリング: モジュールはタグまたは識別子を渡すことによって相互に通信します。 1 つのモジュールによって生成された出力は、他のモジュールによって入力マーカーとして使用される場合がありますが、この結合方法は弱く、モジュール間の関係は比較的緩やかです。
タグの結合を説明する簡単な例を次に示します。
ModuleA と ModuleB という 2 つのモジュールがあるとします。 ModuleA は、一部のデータを処理し、その処理結果に特定のマークを付ける役割を果たします。 ModuleB は、これらのタグに基づいてさまざまな操作を実行します。
モジュールA モジュール:
# ModuleA.py def process_data(data): # 处理数据 processed_data = perform_some_processing(data) # 打上标记 tagged_data = add_tag(processed_data, "tag1") return tagged_data
モジュールBモジュール:
# ModuleB.py def perform_action(data, tag): if tag == "tag1": # 执行特定操作 perform_operation1(data) elif tag == "tag2": # 执行其他操作 perform_operation2(data) else: # 执行默认操作 perform_default_operation(data)
この例では、ModuleA が入力データを処理し、特定のタグをデータに追加します。次に、ModuleB は、このマークに基づいてさまざまな操作を実行することを決定します。 ModuleBはタグの値を判断して対応する演算ロジックを選択することで、ModuleAとの連携を実現します。このタグを介した通信方法がタグ結合です。
-
制御カップリング: モジュールは制御情報 (関数呼び出し、パラメーター転送など) を通じて通信します。モジュールは、別のモジュールの関数やメソッドを直接呼び出したり、パラメータを制御することで別のモジュールの動作を制御したりできます。
制御結合を説明する簡単な例を次に示します。
ModuleA と ModuleB という 2 つのモジュールがあるとします。 ModuleA は、特定の計算を実行し、計算結果に基づいて ModuleB の実行を制御する責任があります。
モジュールA モジュール:
# ModuleA.py def perform_calculation(data): result = perform_some_calculation(data) if result > 0: ModuleB.do_something() else: ModuleB.do_something_else()
モジュールBモジュール:
# ModuleB.py def do_something(): # 执行某些操作 ... def do_something_else(): # 执行其他操作 ...
この例では、ModuleA が計算結果に基づいて ModuleB の動作を制御します。計算結果が 0 より大きい場合、ModuleA は ModuleB の
do_something()
関数を呼び出し、それ以外の場合はdo_something_else()
関数を呼び出します。 ModuleA は、ModuleB のさまざまな関数を呼び出すことで、実際には ModuleB の実行プロセスをある程度制御します。この制御結合方法により、ModuleA と ModuleB の間に直接の関数呼び出し関係が作成され、ModuleA が ModuleB の動作をアクティブに制御します。このタイプの結合により、モジュール間の依存関係が増加し、モジュールの独立性と再利用性が低下する可能性があります。
-
外部カップリング: モジュールは、外部環境またはグローバル変数を共有することによって相互に通信します。複数のモジュールが同じ外部リソースに依存しており、1 つのモジュールを変更すると他のモジュールの動作に影響を与える可能性があるため、このタイプの結合には危険が伴います。
外部結合の例を次に示します。
ModuleA と ModuleB という 2 つのモジュールがあるとします。 ModuleA はユーザー入力の処理を担当し、ModuleB は処理結果をユーザーに表示する責任を負います。
モジュールA モジュール:
# ModuleA.py def process_input(input_data): # 处理用户输入 processed_data = perform_some_processing(input_data) ModuleB.display_output(processed_data)
モジュールBモジュール:
# ModuleB.py def display_output(output_data): # 显示处理结果给用户 ...
この例では、ModuleA は ModuleB の
display_output()
関数を呼び出して処理結果を ModuleB に渡し、ModuleB は結果をユーザーに表示する役割を果たします。 ModuleA と ModuleB の間の結合は、互いの内部実装の詳細を知ることなく、 パブリック インターフェイス関数display_output()
に基づいています。この外部結合方式により、モジュール間の通信が比較的独立しており、拡張やメンテナンスが容易になります。外部カップリングと制御カップリングの違いは、制御カップリングはモジュールの特定の動作と実装の詳細に依存するのに対し、外部カップリングは定義されたインターフェイスとデータ構造を通じて通信し、互いの内部実装の詳細に依存しないことです。
-
コンテンツの結合: 特定の実装の詳細はモジュール間で共有され、あるモジュールは別のモジュールの内部ロジックまたはデータ構造に直接依存します。このタイプの結合は最も強力で、モジュール間の依存関係が非常に高く、1 つのモジュールへの変更が他のモジュールに広範囲に影響を与える可能性があります。
コンテンツ結合の例を次に示します。
ModuleA と ModuleB という 2 つのモジュールがあるとします。 ModuleA は、一部のデータを処理し、ModuleB の内部データに直接アクセスして変更する責任があります。
モジュールA モジュール:
# ModuleA.py def process_data(data): # 处理数据 processed_data = perform_some_processing(data) ModuleB.data = processed_data
モジュールBモジュール:
# ModuleB.py data = None # 内部数据 def display_data(): # 显示数据给用户 ...
この例では、ModuleA は ModuleB の
data
変数に直接アクセスして変更し、処理結果を提供します。次に、ModuleB は独自の関数display_data()
を通じてユーザーにデータを表示します。 ModuleA と ModuleB の間の結合は、互いの内部データと実装の詳細に基づいており、強い依存関係があります。コンテンツの結合によりモジュール間の依存関係が増加し、モジュールの独立性や再利用性が低下する可能性があることに注意してください。モジュール間の通信方法を設計するときは、コードの保守性とスケーラビリティを向上させるために、過度のコンテンツ結合を避け、外部結合などのより緩やかな結合方法を使用することを優先する必要があります。