2

私には、他のすべてのアクティビティが拡張する次のクラスがあります。ここにいくつかの擬似コードがあります:

public class CommonActivity extends Activity
{
    //class member variables

    protected void setupInterface(String activityName)
    {
        //a bunch of setup code here
        Button select = new Button;
        Button create = new Button;
        Button delete = new Button;
    }
    protected void resetScreen()
    {
        selectButton.highlight();
        createButton.unhighlight();
        deleteButton.unhighlight();
    }
}

CommonActivityを拡張する他のクラスが5つまたは6つあり、次のようなことを行います。

 public class SectionActivity extends CommonActivity
{
    //class member variables

    protected void onCreate()
    {
        setupInterface("sectionActivity");
    }
}

これで、CommonActivityから拡張された別のアクティビティがあります。これは、他のアクティビティとは少し異なります。私は自分が次のコードを書いていることに気づきました。

public class ExActivity extends CommonActivity
{
    //class member variables

    protected void onCreate()
    {
        setupInterface2("sectionActivity");
    }
}

次に、次のメソッドをCommonActivityに追加します(すでに存在していたものに加えて)。

protected void setupInterface2(string activityName)
    {
        //a bunch of setup code here
        Button select = new Button;
    }
protected void resetScreen2()
    {
        selectButton.highlight();
    }

今、私はコードの重複を排除するための最良の方法を考えています。「一連のセットアップコード」というコード内のコメントは、アクティビティ間で変更されることはありません。ここで何らかのデザインパターンを使用する必要がありますか?テンプレートパターンのアイデアをいじくり回しましたが、setupInterfaceに同じコードを使用する5つのクラスのそれぞれで、それぞれのクラスに重複するコードがあり、ExActivityには独自の実装があります(うまくいけば、その文が意味をなします)。また、Strategy Patternを使用して、setupInterfaceの一意のコードを独自のクラスにカプセル化することも考えました。それは私には理にかなっているように思えますが、もっとエレガントなものがあるのではないかと思います。この時点で、CommonActivityからsetupInterface2とresetScreen2を削除し、ExActivityでこれらのメソッドをオーバーライドするだけでよいと考えています。それが最も簡単な解決策のようです。ここでの提案は素晴らしいでしょう!

4

1 に答える 1

7

デザインパターンの観点から問題を考えるのではなく、クラスの間に自然に存在するパターンを実装できるように、クラスを明確に説明することをお勧めします。1つのクラスから拡張された6つのクラスがあり、そのうちの5つが同様の動作をし、1つがそうではない場合、クラスの継承モデルは正しくない可能性があります。たぶん、共通論理を実装するクラスと類似している5つのクラスを構成することは理にかなっており、黒羊はそれ自体でその特別な論理を実装できます。

考えただけですが、最初にクラスを1つの単純な文で明確に説明し、次に、事前定義されたパターンにクラスを適合させるよりも、自然に発生する可能性のあるパターンを実装します。

于 2012-12-12T02:39:36.193 に答える