3

私は Eclipse で ObjectAid を使用して、最新の Java プロジェクトの UML クラス図を生成しています。現在、このような状況がいくつかあり、2 つのインターフェース間に依存関係があり、インターフェースの 1 つの実装の 1 つがあります。 . ここに、foo私が使用しているグラフィックライブラリがあります。

前の例では、 はオブジェクトを画面にFooCanvas描画し、とそのインターフェイスである の両方が、メソッドへの引数としてオブジェクトを受け取ります。ITextureFooCanvasICanvasITexture

この依存関係を引き起こすキャンバス クラスのメソッドは次のとおりです。

void drawTexture(ITexture texture, float x, float y);

さらに、Java のジェネリックを使用してメソッド シグネチャのバリエーションを試しました。

<T extends ITexture> void drawTexture(T texture, float x, float y);

この結果、インターフェイスと実装クラスの間の依存関係のみがあり、テクスチャ上のキャンバス オブジェクトによる依存関係がないクラス ダイアグラムが作成されました。これがより理想的かどうかはわかりません。

インターフェイスと実装の両方の別のインターフェイスへの依存関係は予想されるパターンですか、それともインターフェイスの依存関係から実装を「分離」しておくことが一般的ですか、または可能ですか? それとも、一般的な方法が理想的な解決策ですか?

4

1 に答える 1

3

あなたの問題は、間違った問題に対処しようとしているということです。オブジェクト指向設計の主要なポイントの 1 つは、他のコードを変更したり壊したりせずに特定の実装をどれだけ変更できるかという点での堅牢性と柔軟性です。

特定のパターンが理想的かどうかを尋ねようとしていますか? しかし問題は、「理想」とは何か? スコット・マイヤーズの記事から引用します非メンバー関数がカプセル化を改善する方法: カプセル化に関しては、少ない方が良い場合があります。この記事は C++ に関するものですが、彼が実行しようとしていた概念は言語に関係なく適用されます。

カプセル化は手段であり、目的ではありません。カプセル化について本質的に望ましいことは何もありません。カプセル化が役立つのは、それが私たちのソフトウェアに関心のある他のものをもたらすという理由だけです。特に、柔軟性と堅牢性をもたらします。

あなたが尋ねるべき質問は次のとおりです。

どのくらいのコードが壊れている可能性があるかは、影響を受ける可能性のある機能を数えることです。つまり、1 つの実装を変更すると、別の実装を変更するよりも機能が壊れる可能性が高くなる場合です。

あなたの例に関して、他の誰かがあなたに何が理想的かを言うのは特に簡単ではありません。ITextureインターフェイスを公開する必要がありますか? IDrawableテクスチャが拡張するという新しいインターフェイスを導入する必要がありますか? 現在のアプローチは問題ありません。しかし、私は実装を知らないので、実際にはわかりません! テクスチャの実装を変更すると、すべてが壊れる可能性があります。**これは、上記の点を考慮して、あなただけが答えることができる質問です。

  • ITexture の実装を変更した場合、どの程度のコードを変更する必要があるか、または破損する可能性がありますか?
  • 現在の実装は十分に堅牢ですか。
  • 現在の実装でシステムをどの程度拡張できますか?
于 2013-11-11T07:35:59.787 に答える