大量if / else语句的最佳实践

时间:2014-01-14 21:35:20

标签: objective-c if-statement

我正在创建一个包含大量if / else语句的应用。 if / else语句也包含randomnumber,例如if语句可以包含多个选项。我可以为这种类型的块使用NSDictionary,还是至少有一些方法将它放在一个单独的文件中以“清理”mainViewController? if / else语句的代码块返回到mainViewController的两个部分。无论如何,这只是代码的一小部分:

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?"];

1 个答案:

答案 0 :(得分:3)

首先,好的注意到大的if / else语句不是一件好事。有很多方法可以让它们减少痛苦并且更容易阅读,其中一些是你所触及的。例如,您可以将其移动到另一个类(如您所说),或者至少将其移动到其他代码中。

我发现在这种情况下有用的一种设计模式是chain-of-responsibility pattern。在CoR模式中,您有许多command个对象,负责知道它们是否可以处理特定值。因此,在您的情况下,您的逻辑中的每个if / else都有一个命令对象,并且每个命令对象都知道它们是否可以处理newCondition.number。如果命令对象可以处理该值,它将执行其逻辑(在您的情况下,它将执行if / else中的内容);如果不能,则将消息传递给链中的下一个对象。

这样做的好处是可以隔离逻辑并使其更容易以最小的影响添加功能。您还可以将命令子类命名为有趣且信息丰富的内容,以消除代码的一些神秘感。

至少,我会将if语句重构为自己的方法。如果你有很多if / else语句,我会考虑责任链模式。

我强烈推荐一本名为Refactoring to Patterns的好书。