是否有太多嵌入式if语句?

时间:2011-06-30 14:09:10

标签: java coding-style if-statement

目前我正在研究一些代码(我相信)需要相当多的嵌入式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个案例找到一种优雅的方式来做这些事情。代码最终更清晰,更容易测试,更易于维护。通常

6 个答案:

答案 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)

我认为没有限制,但我不建议再嵌入更多 - 它太难读,难以调试,难以进行单元测试。考虑看看几本好书,如RefactoringDesign 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

  

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

相关问题