4

複雑なクラスがあり、ファサード クラスを実装して単純化したい (複雑なクラスを制御できないと仮定します)。私の問題は、複雑なクラスには多くのメソッドがあり、そのうちのいくつかを単純化し、残りはそのままにしておくことです。「単純化」の意味を以下に説明します。

メソッドがファサードで実装されている場合はそれを呼び出し、そうでない場合は複雑なクラスでメソッドを呼び出す方法を見つけたいと思います。私がこれを望んでいる理由は、より少ないコードを書くためです:) [少ないほど良い]

例:

Facade facade = // initialize
facade.simplified(); // defined in Facade class so call it

// not defined in Facade but exists in the complex class
// so call the one in the complex class
facade.alreadySimple(); 

頭に浮かぶオプションは次のとおりです。

オプション 1:複雑なクラスの変数を保持するクラスを作成し、複雑なものを実装してから、直接委譲を使用して単純なものを実装します。

class Facade {
    private PowerfulButComplexClass realWorker = // initialize
    public void simplified() {
         // do stuff
    }
    public void alreadySimple() {
         realWorker.alreadySimple();
    }
    // more stuff
}

しかし、このアプローチでは、すべての単純なメソッドを 1 つの委譲ステートメントだけで実装する必要があります。だから私はもっとコードを書く必要があります(それは簡単ですが)

オプション 2:複雑なクラスを拡張し、単純化されたメソッドを実装しますが、これらのメソッドの単純なバージョンと複雑なバージョンの両方が表示されます。

Python では、次のような同様の動作を実現できます。

class PowerfulButComplexClass(object):
    def alreadySimple(self):
        # really simple

    # some very complex methods


class Facade(object):
    def __init__(self):
        self.realworker = PowerfulButComplexClass()
    def simplified(self):
        # simplified version of complex methods in PowerfulButComplexClass

    def __getattribute__(self, key):
    """For rest of the PowerfulButComplexClass' methods use them as they are
    because they are simple enough.
    """
        try:
            # return simplified version if we did
            attr = object.__getattribute__(self, key)
        except AttributeError:
            # return PowerfulButComplexClass' version because it is already simple
            attr = object.__getattribute__(self.data, key)
        return attr


obj = Facace()
obj.simplified() # call the one we have defined
obj.alreadySimple( # call the one defined in PowerfulButComplexClass

では、これを達成するためのJavaの方法は何ですか?

編集:「単純化」とはどういう意味ですか:複雑なメソッドは、引数が多すぎるメソッドのいずれかです

void complex method(arg1, arg2, ..., argn) // n is sufficiently large

または、単一のタスクを達成するためにほぼ常に一緒に呼び出される一連の関連メソッド

outArg1 = someMethod(arg1, arg2);
outArg2 = someOtherMethod(outArg1, arg3);
actualResult = someAnotherMethod(outArg2);

したがって、次のようなものが必要です。

String simplified(arg1, arg2, arg3) {
    outArg1 = someMethod(arg1, arg2);
    outArg2 = someOtherMethod(outArg1, arg3);
    return someAnotherMethod(outArg2);
}
4

4 に答える 4

3

継承といいます。次のコードを検討してください。

class Complex {
    public function complex() { /* Complex Function */ }
    public function simple() { /* Already simple function */ }
}

class SimplifiedComplex extends Complex {
    public function complex() { /* Simplify Here */ }
}

simple()メソッドはオブジェクトに対して機能しますSimplifiedComplex

于 2012-05-08T20:20:03.733 に答える
2

あなたはすでにそれを呼んだと思います。オプション 1 を使用します。Java の剛性を考慮すると、最も柔軟性が高くなります。

継承よりも構成を優先するため、私はそれを好みます。これにより、より多くのコードが作成されますが、このような設計は一般的に、長期的には変更が容易であることがわかります。

継承は、サブクラスが基本クラスのすべてのプロパティと動作を必ず持つ厳密な「is a」関係をモデル化するためにのみ使用する必要があります。継承を他の目的で使用している場合は、問題が発生します。

最後に、私は「Less Is More」という考えには賛同しません (信じられないほど簡潔で判読できない perl の例をここに挿入してください)。私は「コードは必要なだけシンプルであるべきであり、それ以上シンプルであってはならない」という原則を受け入れています。

于 2012-05-08T20:53:40.260 に答える
1

これは Java では見苦しいですが、呼び出したいメソッドの名前とパラメーター リストを受け取る関数を作成し、リフレクションを使用して呼び出す適切なメソッドを見つけることができます。これは、Python で行う方法と概念的に似ていますが、かなり醜い点が異なります。

于 2012-05-09T01:09:58.477 に答える
1

ユースケースによっては、委譲によって複雑なクラスの一部の機能の前にファサードを作成し (オプション 1)、複雑なクラスの残りの機能をサポートする代わりに、アクセスする手段を提供することができます。複雑なクラスを直接 (getComplexClass)。

これにより、デザインがより明確になる場合があります。たとえば、銀行システムのほとんどの機能を処理する複雑なクラスを考えてみましょう。複雑なクラスにアクセスできるが、銀行口座に関連するメソッドのみを使用する「Account」という名前のクラスを作成すると、設計に役立ちます。便宜上、Account クラスにはメソッド getBankSystemForAccount などを含めることができます。

于 2012-05-08T20:33:58.913 に答える