2014-10-28 51 views
1

很難制定標題。 但是,我會盡快解釋我目前的選擇,希望有人能告訴我一個更好的方法來完成這項工作。c# - 基於Bool而無if語句的方法調用


第一個「快」的解決方案,我們不得不爲:

public class Test 
{ 
     public bool UseSomething = false; 
     public bool UseSomethingElse = false; 
     public bool UseAnother = false; 

    public void MyMethod(){ 

     if(UseSomething){ 
      if(UseSomethingElse){ 
       if(UseAnother){ 
        // UseSomething, UseSomethingElse, UseAnother 
       } 
       else{ 
        // UseSomething, UseSomethingElse 
       } 
      } 
      else{ 
       // UseSomething 
      } 
     } 
     else if(UseSomethingElse){ 
      if(UseAnother){ 
       // UseSomethingElse, UseAnother 
      } 
      else{ 
       // UseSomethingElse 
      } 
     } 

     // etc... 

    } 
} 

現在,這是在我看來,一個醜陋的解決方案,併成爲真正的快速混亂,特別是如果你想添加的選項。更不用說,除了我自己以外,任何人都會一見鍾情,不知道去哪裏/改變什麼。

所以我很快想出了另一種解決方案如下:

public class Test 
{ 
    public bool UseSomething = false; 
    public bool UseSomethingElse = false; 
    public bool UseAnother = false; 
    short options = 0; 

    public void Init() // call this @ start of your program 
    { 
     if (UseSomething) 
      options += 1; 
     if (UseSomethingElse) 
      options += 2; 
     if (UseAnother) 
      options += 4; 
    } 

    public void MyMethod(){ 
     Something something = MatchOption(foo); 
    } 
    public void MatchOption(Foo foo) 
    { 
     switch (options) // based on the Options value (which is unique for every bool-triggered) perform a specific method. 
     { 
      case 0: //000 
       return NoOptions(foo); 
      case 1: //100 
       return OptionSomething(foo); 
      case 2: //010 
       return OptionSomethingElse(foo); 
      case 4: //001 
       return ... etc; 
      case 3: //110 
       break; 
      case 5: //101 
       break; 
      case 6: //011 
       break; 
      case 7: // 111 
       break; 
      case -1: 
       return; 
     } 
    } 
} 

現在,這使得它更易於管理和人基本上就不會擔心這if/else語句把東西此外,這些方法是乾淨的,只做他們應該做的事情。

但我仍然不能放過它,必須有其他方式來做到這一點。

這不是一個代碼不起作用的問題。我更想要一個「最好」或「最乾淨」的方式來做到這一點。^_^ 我是第三年軟件工程師學生,仍然在尋找清理或優化代碼的方法。

如果您有任何意見或建議,請讓我知道!

注意:這主要是僞代碼,我沒有運行或測試過這個。這不是關於工作,這是我想弄明白的一個概念。

+6

此問題似乎是脫離主題,因爲它是關於代碼審查,因此它屬於http://codereview.stackexchange.com/ – 2014-10-28 10:04:33

+0

相關:[如果語句爲多個方案](http://stackoverflow.com/q /335858分之26347287)。 – dasblinkenlight 2014-10-28 10:08:45

+0

所有DoSomething函數都具有相同的簽名嗎? – user3613916 2014-10-28 10:11:00

回答

0

我會去爲這是一個更爲客觀的方式。

首先是DoSomething層次結構。

abstract class BaseDoingThings 
{ 
    abstract void Do(); 
} 

class Something : BaseDoingThings 
{ 
    override Do() { ... } 
} 

class SomethingElse : BaseDoingThings 
{ 
    override Do() { ... } 
} 

接下來就是測試類

class Test 
{ 
    private List<BaseDoingThings> stuffToDo = new List<BaseDoingThings>(); 
    public void AddStuffToDo(BaseDoingThings todo) 
    { 
     stuffToDo.Add(todo); 
    } 

    public void Execute() 
    { 
     foreach(var stuff in stuffToDo) 
     { 
      stuff.Do(); 
     } 
    } 
} 

這是基本的想法。現在你必須適應你的情況,這意味着你必須正確定義接口。

+0

這很有趣。肯定似乎工作的具體原因。 它在技術上會是相同的代碼長度,雖然正確嗎?因爲在我的Switch Case中我寫8個方法的地方,你會寫8個類來擴展'BaseDoingThings'。 – 2014-10-28 10:34:19

+0

選擇此爲最正確的答案,因爲它可以讓我執行基於所有8個選項的具體操作。謝謝!^_ ^這並不完全是我在當前情況下尋找的,但它現在是「全部」情況下最準確的答案。 – 2014-10-28 11:00:38

+0

並且不要猶豫,在'BaseDoingThings'裏面編碼代碼。您還可以使用組合模式對其進行轉換,並避免Test類中的列表。它有很多變化。 – mathk 2014-10-28 13:39:33

0

你爲什麼不只是寫:

if (useSomething) 
    //use something 
if (useSomethingElse) 
    //use somethingElse 
if (useAnother) 
    //use another 

如果將增加新的布爾值,我想你會做一個List

List<bool> useThings = new List<bool>(); 
// populate the list 
foreach (var useThing in useThings) 
{ 
    if (useThing) 
     //useThatThing 
} 
+1

因爲這不會做OP想要的。 – dasblinkenlight 2014-10-28 10:09:13

+0

你確定嗎?請重新檢查代碼:「我們的第一個」快速「解決方案是:」 – 2014-10-28 10:12:04

+0

不是 - 他的快速解決方案是if-then-else語句嵌套三層深度的樹,覆蓋了三個布爾變量的八個組合。 – dasblinkenlight 2014-10-28 10:14:06