这与美丽代码中的一章有关.在那一章中我读到了嵌套if
s.
作者正在讨论深层嵌套if
作为错误的创始人和不太可读的问题.他正在谈论if
用case
语句和决策表替换嵌套的s .
任何人都可以说明如何if
使用case
(select case
)和决策表删除嵌套的s ?
好吧,不是直接回答你的问题,因为你特别询问转换/案例陈述,但这是一个类似的问题.
反转"if"语句以减少嵌套
这里讨论了使用guard-statements替换嵌套的if,它们会提前返回,而不是在确定返回值之前逐步检查越来越多的东西.
我总是尝试做的一个例子是更换嵌套如果是这样的(实际上这个并不太糟糕,但我已经看到它们在野外深达8或9级):
if (i == 1) { // action 1 } else { if (i == 2) { // action 2 } else { if (i == 3) { // action 3 } else { // action 4 } } }
有了这个:
switch (i) { case 1: // action 1 break; case 2: // action 2 break; case 3: // action 3 break; default: // action 4 break; }
我还尝试保持尽可能小的动作(函数调用最适合这个)来保持switch语句的压缩(所以你不必提前四页看到它的结尾).
我认为,决策表只是设置标志,指示以后必须采取的行动."稍后"部分是基于这些标志的动作的简单排序.我可能是错的(这不会是第一次或最后一次:-).
一个例子是(标志设置阶段可能很复杂,因为它的动作非常简单):
switch (i) { case 1: outmsg = "no paper"; genmsg = true; mailmsg = true; phonemsg = false; break; case 2: outmsg = "no ink"; genmsg = true; mailmsg = true; phonemsg = false; break; default: outmsg = "unknown problem"; genmsg = true; mailmsg = true; phonemsg = true; break; } if (genmsg) // Send message to screen. if (mailmsg) // Send message to operators email address. if (phonemsg) // Hassle operators mobile phone.
链式ifs怎么样?
更换
if (condition1) { do1 } else { if (condition2) { do2 } else (condition3) { do3; } }
同
if (condition1) { do1; } else if (condition2) { do2; } else if (condition3) { do3; }
这很像复杂条件的switch语句.
将条件设置为布尔值,然后为每个案例编写布尔表达式.
如果代码是:
if (condition1) { do1 } else { if (condition2) { do2 } else (condition3) { do3; } }
人们可以把它写成:
bool cond1=condition1; bool cond2=condition2; bool cond3=condition3; if (cond1) {do1;} if (!cond1 and cond2) {do2;} if (!cond1 and cond3) {do2;}