目前我正在研究一些代码(我相信)需要相当多的嵌入式if语句。嵌入多少if语句是否有一些标准?我的大部分谷歌搜索都发现了处理excel的事情。不知道为什么。
如果有标准,为什么?它是为了可读性还是让代码运行得更顺畅?在我看来,它主要是为了可读性。
我的if-structure示例:
if (!all_fields_are_empty):
if (id_search() && validId()):
// do stuff
else if (name_search):
if (name_exists):
if (match < 1):
// do stuff
else:
// do stuff
else if (name_search_type_2):
if (exists):
if (match < 1):
// do stuff
else:
// do stuff
else:
// you're stupid
我听说有2-3个嵌套for / while循环的限制,但if语句是否有一些标准?
更新
我现在有几年了。请不要使用这么多if
语句。如果你需要这么多,你的设计可能很糟糕。今天,我喜欢用最少的if
语句或switch
个案例找到一种优雅的方式来做这些事情。代码最终更清晰,更容易测试,更易于维护。通常
答案 0 :(得分:7)
正如Randy所提到的,这种代码的原因在大多数情况下是应用程序的糟糕设计。通常我会尝试使用“处理器”类。
例如,假设存在一些名为“operation”的通用参数和30个具有不同参数的不同操作,您可以创建一个接口:
interface OperationProcessor {
boolean validate(Map<String, Object> parameters);
boolean process(Map<String, Object> parameters);
}
然后为您需要的每个操作实现大量处理器,例如:
class PrinterProcessor implements OperationProcessor {
boolean validate(Map<String, Object> parameters) {
return (parameters.get("outputString") != null);
}
boolean process(Map<String, Object> parameters) {
System.out.println(parameters.get("outputString"));
}
}
下一步 - 在初始化应用程序时,在某些阵列中注册所有处理器:
public void init() {
this.processors = new HashMap<String, OperationProcessor>();
this.processors.put("print",new PrinterProcessor());
this.processors.put("name_search", new NameSearchProcessor());
....
}
所以你的主要方法就是这样:
String operation = parameters.get("operation"); //For example it could be 'name_search'
OperationProcessor processor = this.processors.get(operation);
if (processor != null && processor.validate()) { //Such operation is registered, and it validated all parameters as appropriate
processor.process();
} else {
System.out.println("You are dumb");
}
当然,这只是一个例子,你的项目需要一些不同的方法,但我想它可能与我所描述的类似。
答案 1 :(得分:5)
我认为没有限制,但我不建议再嵌入更多 - 它太难读,难以调试,难以进行单元测试。考虑看看几本好书,如Refactoring,Design Patterns,也许Clean Code
答案 2 :(得分:4)
从技术上讲,我不知道嵌套有任何限制。
如果你发现自己走得很深,这可能是设计不良的一个指标。
您发布的某些内容看起来可能更适合作为case
声明。
我会关注可读性和下一个人的代码维护,这实际上意味着很难 - 即使对于第一个人(你) - 首先要把它完全搞好。
编辑:
您也可以考虑使用类似SearchableObject()
的课程。你可以使用通用功能创建一个基类,然后继承ID,Name等,这个顶级控制块将大大简化。
答案 3 :(得分:1)
从技术上讲,你可以拥有任意数量的内容,但如果你有很多,它可以很快使代码无法读取。
我通常做的是:
if(all_fields_are_empty) {
abuseuser;
return;
}
if(id_search() && validId()) {
//do stuff
return;
}
if(name_search)
{
if(name_exists)
//do stuff
return
else
//do stuff
return
}
我相信你能得到照片
答案 4 :(得分:0)
Java中嵌套的if / else块数量的唯一技术限制可能是堆栈的大小。风格是另一回事。
Btw:结肠有什么用?答案 5 :(得分:0)
Tl; Dr 你真的不想要任何一种方法的10-15路径
这里你所指的是Cyclomatic complexity。
Cyclomatic复杂度是一种软件度量(测量),用于 表明程序的复杂性。这是一个量化的衡量标准 通过程序源的线性独立路径的数量 码。它由Thomas J. McCabe,Sr。于1976年开发。
因此,每个if语句都可能是您的代码的新路径,并增加了它的Cyclomatic复杂性。有一些工具可以为您和高复杂度的高光区域进行测量,以进行潜在的重构。
嵌入多少if语句是否有一些标准?
是和否。人们普遍认为(和McCabe自己认为)超过10或15的 Cyclomatic复杂度太高并且表明代码应该被重构。
McCabe的一个原始应用是限制其复杂性 程序开发过程中的例程;他推荐程序员 应该计算他们正在开发的模块的复杂性 每当圈复杂度时,将它们分成更小的模块 模块超过10. [2]这种做法被NIST采用 结构化测试方法,随后观察 McCabe的原始出版物,10的数字已经收到 大量确凿的证据,但在某些情况下它 可能适合放宽限制并允许模块使用 复杂性高达15。正如方法所承认的那样 它偶尔会超出商定的限制 将其推荐称为:“对于每个模块,要么限制 圈复杂度[商定的限制]或提供书面的 解释超出限额的原因。“[7]
虽然这并不是一个很难的规则,但在某些情况下可以忽略不计。请参阅此问题What is the highest Cyclomatic Complexity of any function you maintain? And how would you go about refactoring it?。
为什么呢?它是为了可读性还是让代码运行得更多 顺利?
基本上这是为了提高可读性,这应该可以使您的代码顺利运行。引用Martin Fowler
任何傻瓜都可以编写计算机可以理解的代码。好 程序员编写人类可以理解的代码。