2012-03-29 7 views
1

私はいくつかのアクションを実装する必要があります。それぞれに共通の要素があるため、クラスから継承する必要があります。その基底クラスが継承されたクラスの違いをどのように扱いますか?

public class WebAction 
{ 
    private ServerData _serverData; 
    public WebAction(ServerData serverData) 
    { 
     _serverData = serverData; 
    } 
} 

で、彼らはいくつかのウェブアクションを行うとすると、言うことができます。また、このアクションのそれぞれが実行する必要があり、その基底クラスに私はまたExecute()方法のいくつかの並べ替えを持っている必要があります。問題は、このオブジェクトのそれぞれが少し違うことなので、それは異なるパラメータを取るべきです。私の質問は - 魔法はこれに到達するのに最適ですか?

最初は、私はいくつかの設定オブジェクト、e、gと思っていました。 Execute(IWebActionConfig config)。この場合、私のようなオブジェクトを使用することができます。

LoginWebAction loginWebAction = LoginWebAction(staticServerConfig); 
LoginWebActionConfig = new LoginWebActionConfig { someData = "foo" }; 
loginWebAction.Execute(loginWebActionConfig); 

しかし、オブジェクトの追加のツリーを作成するにはどんな意味があるのでしょうか?プロパティでWebActionの各子を設定する方が良いでしょうか?

LoginWebAction loginWebAction = LoginWebAction(staticServerConfig); 
loginWebAction.someData = "foo"; 
// Execute will throw exception when someData not set 
loginWebAction.Execute(); 

これらの(もしあれば)方法が良いですか?

答えて

0

もっとOOPスタイルで行うことができます。 look at NVI pattern

public class WebAction 
{ 
    private ServerData _serverData; 
    public WebAction(ServerData serverData) 
    { 
    _serverData = serverData; 
    } 
    public virtual ExecuteAction{}; 
    public Execute() 
    { 
    ExecuteAction(); 
    //to do the rest of base code 

    } 
} 
public class WebActionDerived1: WebAction 
{ 
    WebActionDerived1(ServerData serverData, object arg1/*any unique param*/) 
    :base(serverData) 
    { 
     _my_arg1 = arg1; 
    } 
    public override ExecuteAction 
    { 
    //call any procedure with your _my_arg1; 
    } 
} 
public class WebActionDerived2: WebAction 
{ 
    WebActionDerived1(ServerData serverData, string arg1, 
    string arg2/*otherunique param*/) 
    :base(serverData) 
    { 
     _my_arg1 = arg1; 
     _my_arg2 = arg2; 
    } 
    public override ExecuteAction 
    { 
    //call any procedure with your _my_arg1, and _my_arg2; 
    } 
} 
1

ここではCommand Patternを使用すると思います。 「アクション」をカプセル化し、必要なすべてのパラメータを持つ異なるコマンド(Webアクションごとに1つのコマンド)を作成できます。

コマンドハンドラには、そのコマンドを実行するための "Logic"が含まれます。でコマンドパターンについて

詳細:

http://www.codeguru.com/csharp/.net/net_general/patterns/article.php/c15663/Implement-a-Command-Pattern-Using-C.htm

http://danielshitrit.blogspot.co.uk/2011/11/best-practices-command-pattern-in-c.html

1

各アクションは、あなたが実際にそれらを呼び出すために多型を使用できるようにするつもりはない別のパラメータを取り通り。つまり、クラスでExecuteを呼び出すメソッドは、Execute onを呼び出すクラスの正確な型を知る必要があります。

したがって、私は、継承の使用が本当に正しい解決策であるかどうかは疑問です。

各クラスにいくつかの共有コードがあるため、継承を使用していると述べています。これは通常、継承を使用する十分な理由ではありません。私はそれを反パターンとして見るだろう。

継承を使用する際の問題は、基本クラスを派生クラスに密接に結合していることです。これは単体テストや将来のメンテナンスに問題を引き起こす可能性があります。

共有機能を含む別のクラスを作成する価値があることをお勧めします。次に、このクラスをメンバーとして含むActionクラスを呼び出し、必要に応じて呼び出します。これにより、テスト目的でこの基本クラスをモックすることができます。これらのクラスはそれぞれ、必要なパラメータを持つ独自のExecuteメソッドを持つことができます。

関連する問題