首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是不是有太多嵌入的if语句?

是不是有太多嵌入的if语句?
EN

Stack Overflow用户
提问于 2011-06-30 14:09:09
回答 5查看 13.4K关注 0票数 7

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

如果有标准,为什么?是为了可读性,还是为了保持代码运行更顺畅?在我看来,它主要是为了可读性。

我的if-结构示例:

代码语言:javascript
复制
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案例找到一种优雅的方法来完成这些事情。这些代码最终变得更干净、更容易测试、更易于维护。正常情况下。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-06-30 14:13:23

从技术上讲,我不知道筑巢有什么限制。

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

您发布的一些内容看起来可能更适合作为case语句使用。

我关心的是可读性,以及下一个人的代码维护,这实际上意味着即使是第一个人(你),从一开始就很难做到这一点。

编辑:

您还可以考虑拥有一个类似于SearchableObject()的类。您可以使用公共功能创建一个基类,然后继承ID、Name等,这样就可以大大简化这个顶级控制块。

票数 4
EN

Stack Overflow用户

发布于 2011-06-30 14:25:32

正如兰迪所提到的,在大多数情况下,这种代码的原因是应用程序的设计很差。在您的情况下,通常我尝试使用“处理器”类。

例如,考虑到有一些名为“an”的通用参数和具有不同参数的30个不同操作,您可以创建一个接口:

代码语言:javascript
复制
interface OperationProcessor {
   boolean validate(Map<String, Object> parameters);
   boolean process(Map<String, Object> parameters);
}

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

代码语言:javascript
复制
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"));
    }
}

下一步-在初始化应用程序时,将所有处理器注册到某个数组中:

代码语言:javascript
复制
public void init() {
    this.processors = new HashMap<String, OperationProcessor>();
    this.processors.put("print",new PrinterProcessor());
    this.processors.put("name_search", new NameSearchProcessor());
    ....
}

所以你的主要方法是这样的:

代码语言:javascript
复制
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");
}

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

票数 7
EN

Stack Overflow用户

发布于 2011-06-30 14:12:02

我不认为有限制,但我不建议嵌入更多的两者-它太难读,很难调试,很难进行单元测试。考虑看看几本很棒的书,比如重构设计模式,或者清洁代码

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6536074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档