2014-01-14 61 views
1

我使用大量if/else語句創建應用程序。另外,if/else語句包含一個隨機數,例如一個if語句可以包含多個選項。我可以爲這種類型的塊使用NSDictionary,還是至少有一些方法可以將它放在單獨的文件中以「清理」mainViewController? if/else語句的代碼塊返回到我的mainViewController的兩個部分。無論如何,這是代碼的一小部分:大量if/else語句的最佳做法

if ([newCondition.number floatValue] >= 15.0f) { 
     if (randomNumber == 1){ 
     [mainLabel setText:@"THIS IS"]; 
     [label1 setText:@"ONE"]; 
     [label2 setText:@"WAY TO GO"]; 
     } else { 
     [mainLabel setText:@"THIS IS"]; 
     [label1 setText:@"THE RIGHT"]; 
     [label2 setText:@"WAY TO DO IT"]; } 

    } else if ([newCondition.number floatValue] <=1.0f && [newCondition.anothernumber 
floatValue] >= 90.0f) { 
     if (randomNumber == 0) { 
     [mainLabel setText:@"THIS ISN´T"]; 
     [label1 setText:@"GOOD"]; 
     [label2 setText:@""]; 
     } else { 
     [mainLabel setText:@"ARE"]; 
     [label1 setText:@"YOU"]; 
     [label2 setText:@"DONE?"]; } 

    } else if ([newCondition.number floatValue] >=30.0f && [newsCondition.anothernumber 
floatValue] >= 80.0f) { 
     [mainLabel setText:@"CAN"]; 
     [label1 setText:@"YOU"]; 
     [label2 setText:@"STOP?"]; 
+0

你用過'switch' /'case'嗎? – admdrew

+0

您可能會看到http://qualitycoding.org/和http://cleancoders.com/ –

+0

一般情況下沒有好的答案。我在類似情況下使用的一種方法是將比較限制和文本值插入到一個結構中,然後將其放入一個數組中,然後在數組上循環執行每個元素所要求的比較。事實上,您可以將整個事件指定爲JSON結構,以便於編輯。 –

回答

3

首先,很好的工作注意到大的if/else語句不是積極的事情。有很多方法可以讓他們不那麼痛苦,也更容易閱讀,其中一些你已經談到了。例如,你可以將它移到另一個類(如你所說),或者至少有另一種方法將它們與其他代碼隔離開來。

我發現在這種情況下有幫助的一種設計模式是chain-of-responsibility pattern。在CoR模式中,有多個command對象負責知道他們是否可以處理特定值。所以在你的情況下,你的邏輯中每個if/else都會有一個命令對象,每個命令對象會知道他們是否可以處理newCondition.number。如果命令對象可以處理這個值,它會執行它的邏輯(在你的情況下,它會執行if/else中的東西);如果不能,它會將消息傳遞給鏈中的下一個對象。

這有利於隔離邏輯並使添加功能更容易,影響最小。你也可以命名子類的一些有趣和有用的信息,以消除代碼的一些神祕性。

至少,我會將if語句重構爲自己的方法。如果你有很多if/else語句,我會考慮責任鏈模式。

我強烈推薦一本叫做Refactoring to Patterns的好書。

+0

感謝您的詳細回覆。我會嘗試責任鏈,因爲它看起來很直接,我知道它。 – Pierre