我正在创建一个包含大量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?"];
答案 0 :(得分:3)
首先,好的注意到大的if / else语句不是一件好事。有很多方法可以让它们减少痛苦并且更容易阅读,其中一些是你所触及的。例如,您可以将其移动到另一个类(如您所说),或者至少将其移动到其他代码中。
我发现在这种情况下有用的一种设计模式是chain-of-responsibility pattern。在CoR模式中,您有许多command个对象,负责知道它们是否可以处理特定值。因此,在您的情况下,您的逻辑中的每个if / else都有一个命令对象,并且每个命令对象都知道它们是否可以处理newCondition.number。如果命令对象可以处理该值,它将执行其逻辑(在您的情况下,它将执行if / else中的内容);如果不能,则将消息传递给链中的下一个对象。
这样做的好处是可以隔离逻辑并使其更容易以最小的影响添加功能。您还可以将命令子类命名为有趣且信息丰富的内容,以消除代码的一些神秘感。
至少,我会将if语句重构为自己的方法。如果你有很多if / else语句,我会考虑责任链模式。
我强烈推荐一本名为Refactoring to Patterns的好书。