2

これが私の質問です:

大きなクラス (HugeClass) があり、それをいくつかの小さなクラス (LittleClass1、LittleClass2、...) に分割したいと考えていました。委任について聞いたことがあります。良さそうですが、私の場合はうまくいかないと思います。実際、私の小さなクラスには、HugeClass のいくつかの属性が必要です。

public class  HugeClass
{
    // Attributes
    private Object object1;
    private Object object2;
    private Object object3;
    ...
    private Object objectN;

    // Delegation 1
    private LittleClass1  little1 = new LittleClass1 ();

    // Function delegated in the LittleClass1
    public void  delegated1 ()
    {
        little1.delegated1 ();
    }

}

Delegation クラスの例を次に示します。

public class  LittleClass1
{
    public LittleClass1 ()
    {

    }

    public void  delegated1 ()
    {
        // Here, I need object1, object3, and more to work !
    }

}

delegated1 関数が必要とする属性の数が多くなる可能性があります。そのため、LittleClass1 のコンストラクターを使用するのはあまり便利ではないと思います。

また、LittleClass1 は HugeClass の 1 つのメソッドのみをオーバーライドするため、LittleClass1 が HugeClass を拡張する必要はないと思います。

解決策のアイデアはありますか? 別のパターンを使用していますか?

ありがとう !

アップデート

委任された関数には、インスタンス変数だけでなく、インスタンス関数も必要になる場合があります。

public class  LittleClass2
{
    public LittleClass2 ()
    {

    }

    public void  delegated2 ()
    {
        // I need object2 and delegated1 to work !
    }

}

コンストラクターに HugeClass を指定すると、この問題が解決する場合があります。しかし、これは良い解決策ですか?

4

2 に答える 2

7

巨大なクラスを小さなクラスに分割することは、通常、保守性、テスト容易性、およびコードの全体的な品質を向上させるのに適しています。チャンクが小さいほど、単独での推論が容易になるはずです。必要なのは、巨大なクラスの意味的に異なる機能を探し、それらを分割することです。最初にメソッドを抽出し、次にクラスを抽出します。Refactoring and Working Effectively with Legacy Codeの本のようなリファクタリング手法を探しているのと同じくらい、必ずしもパターンを探しているわけではありません。

ここで、小さなクラスが巨大なクラスのインスタンス変数を共有しすぎているように見える場合は、一歩下がって、あまり多くの変数に依存しないコードなど、簡単に達成できる成果から始めるべきです。または、新しいオブジェクトにカプセル化することが意味的に意味のあるこれらの変数のグループを見つけようとします。これらの自由変数の数を減らし、デザインの品質を向上させるものは何か、デザインの潜在的な概念を見つけるとコードがより多くなります明示的わかりやすい

更新: ところで、継承は本当に良い考えではありません。懸念事項を分離したいと考えており、継承は結合のもう 1 つのより微妙な方法です。

于 2012-06-16T23:48:28.283 に答える
0

とそのフィールドLittleClass1をサブクラス化するだけでよいようです:HugeClassprotected

public abstract class HugeClass {
    // Attributes - now protected instead of private
    protected Object object1;
    protected Object object2;
    protected Object object3;
    ...
    protected Object objectN;

    -- Note: No delegation, no reference to LittleClass1 here    

    public abstract void delegated ()

}

public class LittleClass1 extends HugeClass {

    public void delegated () {
        // Here, you have access to object1, object2 etc
    }
}
于 2012-06-17T00:05:02.800 に答える