web-dev-qa-db-ja.com

アプリケーションの疎結合モジュール間のデータ転送

複数のモジュールで構成されるPythonフレームワークを使用してDjangoで記述されたかなり大きなプロジェクトがあるとしましょう(Djangoは複数のアプリで構成されるプロジェクトですが、一般的に「モジュール」という用語を使用します。これは、(他の利点の中でも)保守を容易にするために低結合を実現するためです。

プロジェクトの実行中に、これらのモジュール間でデータがどのように移動されるかに興味があります。オブジェクトとして?または文字列として?

データがオブジェクトの形式でモジュール間で転送される場合(モジュール自体の内部の場合のように)、低結合を実現できません。その理由は、一方のモジュールがもう一方のモジュールにあるオブジェクトクラスに依存するためです。たとえば、別のモジュールに依存しているため、モジュールをまったく別のプロジェクトで簡単に再利用することはできません。

ただし、データが文字列の形式である場合は、低結合を実現できます。職務の分離が明確になり、トラブルシューティングは単一のモジュールに限定され、モジュールはまったく異なるプロジェクトで簡単に再利用できます。これは基本的に、APIがクライアントにデータを送信する方法です。

しかし、これは、プロジェクトのモジュール間のデータ転送に文字列を使用することによって、低結合を実現する適切な方法ですか(読み取り:アプリケーション)?

1
heapoverflow

この質問は見当違いのようです。

「疎結合モジュール間でデータを転送する」と言いますが、ほとんどすべての合理的な現実のケースでは、「理由のために」データを転送することになります。データ(オブジェクト)は送信者が理解する必要があり、受信者モジュールが理解する必要があります。これには本質的にモジュールの結合が含まれます。

(データの形式を理解せずにモジュールにデータを転送することが理にかなっているおもちゃのケースがあるかもしれませんが、これらのケースはまれであり、ほとんどが人工的/偽物です)。

通常、ほとんどのプログラミング言語でこれを行う最も自然な方法は、インターフェイス(呼び出しの受信者)を定義するモジュールに、その入力または出力として必要なオブジェクト(またはオブジェクトのインポート/参照)も定義させることです。モジュールインターフェイス。

はい、これは、呼び出し元が呼び出し元のモジュールをインポート(python)する必要があることを意味します(ただし、とにかく呼び出すにはそれを行う必要がありました)-はい、それはカップリングの形式です。しかし、その一方向性、そしてそれはあなたが達成しようとしていることに本当に本質的です。それを回避する便利な方法はありません。

もちろん、オブジェクトをJSONまたはXMLとして外部化し、「文字列」または「生のバイト」を渡すことができます。ただし、そのシリアル化されたデータをライター(呼び出し元)とリーダー(呼び出されるAPI)で適切にフォーマットする必要があります。これは同じ結合に相当します-言語機能(クラス)も活用しないだけです。

1
Lewis Pringle