2017-07-17 46 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"); 
} 

如果委託爲空,則不調用該方法。

相關問題