2017-07-17 72 views
-4

假设我有一大堆方法的类,并且我希望这些方法在配置文件中的某个标志关闭的情况下基本上不运行。 。遵循什么样的设计模式?我想到了有条件的运行方法等黑客行为(例如Can I conditionally control method calls at runtime with attributes?)。“关闭”一个类的实例的正确设计模式是什么?

+0

定义“正确”。有可能有多种方式来做到这一点,适合你的方式取决于你的具体情况以及对你来说重要的事情。 – hatchet

+0

这可能会对你的应用感兴趣:[空对象模式](https://en.wikipedia.org/wiki/Null_Object_pattern) –

回答

1

假设两者之间有一个接口,那么在这种情况下可以用一个虚拟替换实现。像

interface IFoo 
    void DoBla() 

class DummyFoo : IFoo 
    void DoBla() {} 

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

让我们保持简单。没有模式和所有过度思考恕我直言。如果您不希望方法在标志关闭时执行任何操作,则不应该调用方法本身。

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

比。

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

原因,我会在1日一票是因为你的代码的读者知道发生了什么事情和配置标志的意义。在后来的情况下,如果他们不知道国旗,他们可能会期望发生什么事情,并在没有任何事情发生时感到困惑。

+2

我会对第二个投票,因为尽管可读性较差,如果对这些方法进行大量调用,并且确保对方法的所有调用实际上按照期望执行,则会导致更少的代码膨胀。 – ohmusama

+0

你也有一点。 – niksofteng

+0

评论在这种情况下很重要。这个班级应该记录清楚,以避免混淆。 – ohmusama

0

实现此功能的一种相对无痛的方式是使用空条件运算符来使用委托调用。

定义您的代表对于给定的方法:

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; 
    } 
} 

使用空条件运算符的示例用法。

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

如果委托为空,则不调用该方法。

相关问题