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

Cod*_*ody 6 java if-statement coding-style

目前我正在研究一些代码(我相信)需要相当多的嵌入式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
Run Code Online (Sandbox Code Playgroud)

我听说有2-3个嵌套for/while循环的限制,但是if语句有一些标准吗?

更新: 我现在有几年了.请不要使用这么多的if陈述.如果你需要这么多,你的设计可能很糟糕.今天,我喜欢当我能用最少的if陈述或switch案例找到一种优雅的方式来做这些事情.代码最终更清晰,更容易测试,更易于维护.一般.

bez*_*max 7

正如Randy所提到的,这种代码的原因在大多数情况下是应用程序的糟糕设计.通常我会尝试在你的情况下使用"处理器"类.

例如,假设存在一些名为"operation"的通用参数和30个具有不同参数的不同操作,则可以创建一个接口:

interface OperationProcessor {
   boolean validate(Map<String, Object> parameters);
   boolean process(Map<String, Object> parameters);
}
Run Code Online (Sandbox Code Playgroud)

然后为您需要的每个操作实现大量处理器,例如:

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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

下一步 - 在初始化应用程序时,在一些阵列中注册所有处理器:

public void init() {
    this.processors = new HashMap<String, OperationProcessor>();
    this.processors.put("print",new PrinterProcessor());
    this.processors.put("name_search", new NameSearchProcessor());
    ....
}
Run Code Online (Sandbox Code Playgroud)

所以你的主要方法变成这样:

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");
}
Run Code Online (Sandbox Code Playgroud)

当然,这只是一个例子,你的项目需要一些不同的方法,但我想它可能与我所描述的类似.


Mic*_*Lee 6

我不认为有一个限制,但我不建议嵌入更多的两个 - 它太难阅读,难以调试和难以单元测试.考虑一下像Refactoring,Design PatternsClean Code这样的好书


Ran*_*ndy 4

从技术上讲,我不知道嵌套有任何限制。

如果你发现自己走得很深,这可能表明设计很糟糕。

您发布的一些内容看起来可能更适合作为声明case

我会关心下一个人的可读性和代码维护,这实际上意味着即使对于第一个人(你)来说,一开始就很难把事情做好。

编辑:

您也可以考虑开设类似的课程SearchableObject()。您可以创建一个具有通用功能的基类,然后继承 ID、名称等,并且这个顶级控制块将大大简化。