Java 是否存在过多嵌入if语句的情况?

Java 是否存在过多嵌入if语句的情况?,java,coding-style,if-statement,Java,Coding Style,If Statement,目前我正在编写一段代码(我相信)需要相当多的嵌入式if语句。对于要嵌入多少if语句,是否有一些标准?我在谷歌上搜索的大部分内容都是关于excel的,我不知道为什么 如果有标准,为什么?它是为了可读性,还是为了让代码运行更顺畅?在我看来,主要是为了可读性,这是有道理的 我的if结构的一个示例: if (!all_fields_are_empty): if (id_search() && validId()): // do stuff else if

目前我正在编写一段代码(我相信)需要相当多的嵌入式if语句。对于要嵌入多少if语句,是否有一些标准?我在谷歌上搜索的大部分内容都是关于excel的,我不知道为什么

如果有标准,为什么?它是为了可读性,还是为了让代码运行更顺畅?在我看来,主要是为了可读性,这是有道理的

我的if结构的一个示例:

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
如果(!所有字段为空):
如果(id_search()&&validId()):
//做事
否则,如果(名称搜索):
如果(名称_存在):
如果(匹配<1):
//做事
其他:
//做事
否则如果(名称搜索类型2):
如果(存在):
如果(匹配<1):
//做事
其他:
//做事
其他:
//你真蠢
我听说有2-3个嵌套for/while循环的限制,但是if语句有什么标准吗

更新:
我现在有好几年的时间了。请不要使用这么多
if
语句。如果你需要这么多,你的设计可能很糟糕。今天,我喜欢用最少的
if
语句或
switch
案例找到一种优雅的方式来做这些事情。代码最终变得更干净、更易于测试和维护。通常。

Java中嵌套if/else块数量的唯一技术限制可能是堆栈的大小。风格是另一回事


顺便说一句:冒号有什么用?

我不认为有限制,但我不建议嵌入更多的冒号和冒号,因为它们太难阅读、调试和单元测试。考虑一下两本很棒的书,也许是

技术上,我不知道对嵌套有什么限制。

如果你发现自己做得很深,这可能是一个糟糕设计的指标

您发布的一些内容看起来更适合用作
案例
语句

我关心的是可读性,以及下一个人的代码维护,这意味着即使是第一个人(你)也很难从一开始就把它做好

编辑:


你也可以考虑使用一个类,比如“代码> Sexabable Objor())< /C>。您可以使用通用功能创建此类的基类,然后继承ID、名称等,这样顶级控制块将大大简化。

从技术上讲,您可以拥有任意数量的控制块,但如果拥有大量控制块,则会很快使代码无法读取

我通常会这样做:

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
}

我相信您已经明白了

正如Randy所提到的,在大多数情况下,这种代码的原因是应用程序设计不佳。通常我会尝试在您的案例中使用“processor”类

例如,假设有一个名为“operation”的通用参数和30个具有不同参数的不同操作,您可以创建一个接口:

interface OperationProcessor {
   boolean validate(Map<String, Object> parameters);
   boolean process(Map<String, Object> parameters);
}

当然,这只是一个例子,您的项目需要一个稍微不同的方法,但我想它可能与我描述的类似;Dr任何一种方法都不需要超过10-15条路径

你在这里指的是什么

圈复杂度是一种软件度量(度量),用于 表示程序的复杂性。这是一个定量的衡量标准 通过程序源的线性独立路径数 代码。它是由老托马斯·麦卡贝于1976年开发的

因此,每个if语句都可能是代码中的一条新路径,并增加了它的圈复杂度。有一些工具可以为您衡量这一点,也有一些高复杂性的高亮度区域可以进行潜在的重构

对于要嵌入多少if语句,是否有一些标准

是的,也不是。人们普遍认为(McCabe自己也认为,圈复杂度超过10或15太高了,这是代码应该重构的标志

McCabe最初的一个应用是限制 程序开发期间的例行程序;他建议程序员 应计算他们正在开发的模块的复杂性,以及 只要 模块超过10。[2]NIST采用了这种做法 结构化测试方法,观察到 McCabe的原始出版物《10的数字》已经收到 大量确凿的证据,但在某些情况下 可适当放宽限制,并允许模块具有 复杂度高达15。正如方法论所承认的那样 如果是偶然的原因超出了约定的限制,那么 将其建议表述为:“对于每个模块 圈复杂度达到[约定极限]或提供书面 解释超出限制的原因。”[7]

但这并不是一条硬性规定,在某些情况下可以忽略。看这个问题

为什么??是为了可读性,还是为了让代码运行得更快 顺利

本质上,这是为了可读性,这将使您的代码运行平稳。引用

任何傻瓜都能写出计算机能理解的代码。好 程序员编写人类能够理解的代码


我只是很快地输入了一些东西,作为if结构的示例。我想,我的python经验中有一部分是出来的。可能的重复:我不是问有多少是最大值,我是问程序员的标准是什么。程序员之间没有“标准”最大值。每种情况都有自己的嵌套最大值。例如,如果你有一些繁重的数学代码,它会做一些可怕的计算——我会很容易地使用15个嵌套的if,而不会有任何问题
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");
}