IF 语句 - 如何减少/简化源代码量

Posted

技术标签:

【中文标题】IF 语句 - 如何减少/简化源代码量【英文标题】:IF statements - How to reduce / simplify the amount of source code 【发布时间】:2018-12-30 15:29:21 【问题描述】:

我在尝试减少我的函数的这部分代码时遇到了麻烦:

checkData(day, month, year, area)

    if(area == "year" && year == this.year)
        return true;

    if(area == "month" && month == this.div && year == this.year)
        return true;

    if(area == "day" && day == this.day && month == this.div && year == this.year)
        return true;

    return false;

如何简化/减少这些 IF 子句的源代码量?

【问题讨论】:

因为所有 3 个 if 子句都返回 true,您可以将它们全部组合成一个 if 语句吗?这能解决你的问题吗? 用 && 将它们放在一个 if 语句中以继续比较,而不是用多个 if 语句嵌套它 @rayrayray9151 这将是很长的一行... 【参考方案1】:

您的 if 子句可以重写为:

checkData(day, month, year, area)

    if(year == this.year) 
        if(area == "year") return true;
        if(month == this.div) 
            if(area == "month") return true;
            if(day == this.day) 
                if(area == "day") return true;
                return false;
            
        
    

然后到:

checkData(day, month, year, area)

    if(year != this.year) return false;
    if(area == "year") return true;
    if(month != this.div) return false;
    if(area == "month") return true;
    if(day != this.day) return false;
    return area == "day";

另一种可能的语法,取决于编程语言(例如 C++):

checkData(day, month, year, area)

    return
        year != this.year ? false : 
        area == "year" ? true :
        month != this.div ? false :
        area == "month" ? true :
        day != this.day ? false :
        area == "day";

然后可以写成一行:

checkData(day, month, year, area)

    return year != this.year ? false : area == "year" ? true : month != this.div ? false : area == "month" ? true : day != this.day ? false : area == "day";

某些语言支持这种语法(例如 C#):

checkData(day, month, year, area) => year != this.year ? false : area == "year" ? true : month != this.div ? false : area == "month" ? true : day != this.day ? false : area == "day";

【讨论】:

不错的详细答案,根据不同的语言显示许多选项【参考方案2】:

您有 3 个返回相同真值的 if 语句。您可以使用带括号的|| orelse 运算符将这些语句组合成一行,如下所示

checkData(day, month, year, area)
                if ((area == "year" && year == this.year) || (area == "month" && month == this.div && year == this.year)|| (area == "day" && day == this.day && month == this.div && year == this.year))
                    return true;

                return false;
            

希望对你有帮助

EDIT - 后面的两个 if 语句是否嵌套在第一个语句中?很难判断是否只是格式问题.. 如果它们是嵌套的,那么您希望 && andalso 运算符将第一个 if 语句与 each 结合,然后 orelse 将两者结合起来,如下所示:

checkData(day, month, year, area)
                if (area == "year" && year == this.year) && (area == "month" && month == this.div && year == this.year)
                    || (area == "year" && year == this.year) && (area == "day" && day == this.day && month == this.div && year == this.year)
                    return true;

                return false;
            

【讨论】:

以上是关于IF 语句 - 如何减少/简化源代码量的主要内容,如果未能解决你的问题,请参考以下文章

NetLogo可以用循环语句吗

实现同样逻辑,代码量减少90%,Java程序员必会的工具库

Java 必会的工具库,让你的代码量减少 90%...

Java必会的工具库,让你的代码量减少90%

代码量减少90%,Java程序员必会的工具库

布尔逻辑:如何简化此 IF 语句?