2017-07-17 4 views
-4

私はたくさんのメソッドを持つクラスを持っていて、設定ファイルのフラグがオフになっていれば、それらのメソッドを本質的にノーオペレーションにしたいとします。 。どのようなデザインパターンが続くのだろうか?条件付きで実行する方法(例:Can I conditionally control method calls at runtime with attributes?)のようなハッキリものは考えました。クラスのインスタンスを「無効にする」正しいデザインパターンは何ですか?

+0

「正しい」を定義します。複数の方法がありそうですが、あなたのための正しい方法は、あなたの特定の状況やあなたにとって重要なものによって異なります。 – hatchet

+0

これはあなたのアプリケーションにとって興味深いかもしれません:[Null Object pattern](https://en.wikipedia.org/wiki/Null_Object_pattern) –

答えて

1

その間にインターフェイスがあると仮定すると、その場合は実装をダミーに置き換えることができます。 Like

interface IFoo 
    void DoBla() 

class DummyFoo : IFoo 
    void DoBla() {} 

class RealFoo : IFoo 
    void DoBla() { 
     [some actual code] 
    } 
0

簡単にしましょう。パターンはありません。 flagがoffの場合にメソッドが何かを実行しないようにするには、メソッド自体を呼び出すべきではありません。

IF Config.Flag = OFF 
    DoNothing(); 
ELSE 
    CallMethod(); 

対。

CallMethod() { 
    IF Config.Flag = OFF 
     DoNothing(); 
    ELSE 
     DoSomething(); 
} 

私が1番目に投票する理由は、コードの読者が何が起こっているのか、設定フラグの意義を知っているからです。後のケースでは、フラグについて知らない場合、何かが起こると予想し、何も起こらなければ混乱します。

+2

2番目に投票します。これらのメソッドへの呼び出しが多数ある場合はコードの膨らみが少なくなり、予期しない場合にはメソッドの呼び出しが実際に必要に応じて確実に実行されます。 – ohmusama

+0

あなたもポイントがあります。この場合は – niksofteng

+0

のコメントが重要です。クラスは、混乱を避けるために十分に文書化されなければならない。 – ohmusama

0

このような機能を実装するのに比較的簡単な方法は、null条件付き演算子を使用してデリゲート呼び出しを使用することです。

は、与えられたメソッドのためにあなたのデリゲートを定義します。

private Action ConditionalSomeMethod; 
private Action<string> ConditionalSomeMethod2; 

private void SomeMethod() { } 
private void SomeMethod2(String arg) {Console.WriteLine(arg);} 

は、その後、あなたの条件に基づいてデリゲートを割り当てます。

private void SetupConditionalMethods() 
{ 
    bool runConditionals = true; 
    if (runConditionals) 
    { 
     ConditionalSomeMethod = SomeMethod; 
     ConditionalSomeMethod2 = SomeMethod2; 
    } 
    else 
    { 
     ConditionalSomeMethod = null; 
     ConditionalSomeMethod2 = null; 
    } 
} 

null条件付き演算子を使用したサンプル使用例。

private void DemoIt() 
{ 
    ConditionalSomeMethod?.Invoke(); 
    ConditionalSomeMethod2?.Invoke("hello"); 
} 

デリゲートがnullの場合、このメソッドは呼び出されません。

関連する問題