如何编写更简洁的 if-else 语句并防止嵌套?

how to write cleaner if-else statements and prevent nesting?

所以我知道嵌套代码很快就会变得丑陋。因此,我查找了一种防止嵌套的方法,发现您可以执行以下操作

if (user == null) return;

console.log('Deleting');
user.delete();

而不是像那样使用大括号

if (user != null) {
    console.log('Deleting');
    user.delete();
}

但是我看不出这在使用 if-else 语句时有何帮助。例如:我的项目中有这段代码,我真的很想用比那更干净的方式编写。但我正在努力弄清楚如何做到这一点。

           if (parseInt(year) == joinTime.getFullYear()) {
                if (parseInt(month) == joinTime.getMonth() + 1) {
                    if (parseInt(day) == joinTime.getDay()) {
                        channel.send(message);
                    } else {
                        comparison(day, hour, minute);
                    }
                } else {
                    comparison(day, hour, minute);
                }
            } else {
                comparison(day, hour, minute);
            }

我不认为删除大括号是处理嵌套 if else 语句时的解决方案。在这种情况下,我会尝试限制使用的语句数量。您可以将此代码转换为:

if(parseInt(year) == joinTime.getFullYear() && parseInt(month) == joinTime.getMonth() + 1 && parseInt(day) == joinTime.getDay()){
     channel.send(message);
}
else {
    comparison(day, hour, minute);
}

或者您可以使用解析的年、月和日来构造一个日期对象,然后将其与 joinTime 进行比较。

你可以这样写

if (
parseInt(year) == joinTime.getFullYear() &&
parseInt(month) == joinTime.getMonth() + 1 && 
parseInt(day) == joinTime.getDay()
) {
   channel.send(message);
} else {
   comparison(day, hour, minute);
}

旁观者眼中的风格,但假设您想要更简洁的代码,那么我会做这样的事情:

    const yearMatch = (parseInt(year) == joinTime.getFullYear());
    const monthMatch = (parseInt(month) == joinTime.getMonth() + 1);
    const dayMatch = (parseInt(day) == joinTime.getDay());
    
    if (yearMatch && monthMatch && dayMatch) {
        channel.send(message);
    } else {
        comparison(day, hour, minute);
    }

或者,如果您不关心额外的 return(这不会破坏您的逻辑):


    const yearMatch = (parseInt(year) == joinTime.getFullYear());
    const monthMatch = (parseInt(month) == joinTime.getMonth() + 1);
    const dayMatch = (parseInt(day) == joinTime.getDay());

    if (yearMatch && monthMatch && dayMatch) return channel.send(message);
    
    comparison(day, hour, minute);

当然,请根据需要更改变量名称。