2

保守可能なアプリケーションのための疎結合、高い結束

何度も聞く鬨の声です。コンポーネントを疎結合する方法については、多くのアドバイスがあります。

  • インターフェイスに基づいて、すべての依存関係を注入します
  • イベントを使用する
  • 運行バスを利用する

しかし、結束力を高めるための具体的な提案を実際に聞いたことがないように感じます。誰か提供するものはありますか?

そこから回答を始めることができますが、特定の状況についてもアドバイスをお願いしたいと考えています。


私はかなり疎結合の C# Windows フォーム MVP アプリケーションを持っています。このアプリケーションは、そのコンポーネントの多くをインターフェイスに基づいており、コンストラクターを介してそれらを注入し、制御の反転コンテナー (Castle Windsor) を使用してすべてを組み立てます。

非常によく設計されていると言えます。すでにいくつかの大きな変更要求を受けており、それらを非常に簡単に処理しました。私は全体的に非常に満足していますが、特にまとまりがないというしつこい疑いを手放すことはできません. これは、唯一の開発者である私にとっては問題ではありませんが、アプリケーションを初めて使用する人にとってはかなり混乱する可能性があるのではないかと心配しています.

例を挙げましょう。このアプリケーションは、会社 A が出荷トラックに製品を充填して処理するために使用されています。これは、OutgoingTransactionInfoオブジェクト、OutgoingTransactionInfoControl (実際に情報を入力するため)、OutgoingTransactionValidator、およびOutgoingTransactionPersisterがあることを意味します。アプリを本番環境に置いて、着信トランザクションも処理するように要求されました。これらには、さまざまな情報が添付され、さまざまな検証が行われ、さまざまな方法で永続化されます。その後、B 社はトランザクション処理にもアプリケーションを使用したいと考えました。アイデアは似ていますが、情報、検証、永続性、およびおそらく他のいくつかのコンポーネントが異なります。

私のアプリケーションには優れたテスト スイートがあり、緩いので、これらの要求に非常に簡単に対応することができました。ただし、誤って無効な状態に構成するのは簡単すぎることを認識しています。たとえば、 IncomingTransactionValidatorで検証しながらOutgoingTransactionInfoオブジェクトを使用するように配線できます。違いが微妙な場合、エラーはしばらくの間検出されないことさえあります。

何か提案はありますか?そのようなリスクを軽減するためにどのような手法を使用していますか?

4

4 に答える 4

3

まとまりとは、無関係なものをモジュール (クラスなど) にまとめないことを意味します。あなたの説明から、あなたはこれをうまくやっているようです。適切なテスト (あなたも行っているようです) により、リスクを抑えることができます。

おそらく型システム (ジェネリック/テンプレート) を使用して、情報とそのバリデーターが適合することを確認し、コードを節約したり、コードをより均一にしたりすることができます (ただし、追加された複雑さに見合うだけの価値があることを確認してください)。

そうでなければ、良い仕事を続けてください。

于 2009-09-10T15:39:37.693 に答える
1

これは、2009 年の Mountain West Ruby Conference での、Ruby の観点からの結合と結合の問題に関する Jim Weirich による興味深いプレゼンテーションです。さまざまな程度と、それらが適切な場合とそうでない場合を扱います。

于 2009-09-10T16:49:30.550 に答える
1

システムの各コンポーネントが 1 つの責任に集中すると、非常にまとまりのあるシステムが実現します。ことわざにあるように、「1 つのことを正しく行う」。クラスが「やりすぎ」ていると感じたら、それぞれが 1 つのことを担当する 2 つ以上のクラスにリファクタリングできます。これは疎結合につながります。責任がそれぞれ特定のクラスにローカライズされているため、クラスは相互に非常に個別の相互作用を行う可能性が高くなります。

配線の問題に対する簡単な提案: OutgoingAbc クラスは、一緒に配線されたときに OutgoingXyz を受け取っていることを確認し、間違った型の場合は例外をスローできませんでしたか?

于 2009-09-10T15:36:01.930 に答える
1

頭に浮かぶことの1つは、可視性を制御することです。(Java 用語で話しますが、その概念は他の言語にも当てはまると思います)。OutgoingTransactionValidatorを「見る」ことができるものは何ですか? my.org.outgoingパッケージの外で見えることは合法ですか?

そのため、何かを public に宣言しないことで誤配線を制御できます。

この概念をさらに一歩進めると、OSGi では、バンドルがエクスポートするパッケージとバンドルが使用するパッケージを明示的に宣言できるため、依存関係がより明確になり、制御されます。

于 2009-09-10T15:41:58.597 に答える