在我正在使用的当前软件中,我看到这种模式非常广泛,似乎他们试图尽可能地避免返回语句。即使在代码中的某些地方,这也几乎是极端的。
我早就听说过应该尽量减少或避免回复陈述,但我不记得(或搜索)这一思路的确切原因或起源。我认为这是由于某些PL的某些性能影响。
我个人并不坚持这一点,因为它不会使代码可读,但是给它带来疑问的好处,我很好奇使用这种模式在性能方面是否有其优点。
if (err) {
if (err.message) {
message = err.message;
} else {
if (err.errorCode) {
message = err.errorCode;
} else {
message = "Unknown error";
}
}
} else {
message = "Unknown error.";
}
deferred.reject(message);
如果我决定,我会随便使用return语句来终止这样的序列:
if(!err || (!err.message && !err.errorCode)){
deferred.reject("Unknown error.");
return;
}
if(err.message){
deferred.reject(err.message);
return;
}
if(err.errorCode){
deferred.reject(err.errorCode);
}
第一种模式比第二种模式有优势吗?
答案 0 :(得分:2)
您的代码示例也有昵称 - 圣诞树,而在实际项目中,支持此类代码非常困难。
例如你需要添加另一个条件 - 你会在现有的内部放置另一个if
块,依此类推,这将是一场噩梦......结果,你将拥有一棵糟糕的树...
作为替代方案,您可以这样:
if (err) {
if (err.message) {
return err.message;
}
if (err.errorCode) {
return err.errorCode;
}
}
return "Unknown error.";
这样的代码看起来更简单,不是吗?
所以我真的相信将return
用于此类目的是有道理的。
但是,我认为这里的要点是 - 不要松散一致性!在我们的示例中,我们始终返回相同数据类型和相同业务逻辑的结果,例如:
if (err) {
if (err.message) {
return err;
}
// Here some stuff...
// Few lines of code...
//
return -1;
}
// Another code...
//
if (!user) {
return null;
}
// And somewhere in the end on anothere scrollin screen
//
return user.email;
此示例返回object
或number
或null
或string
- 这是另一场噩梦......
在大型函数的实际项目中,由于回报很多,很容易得到这样的代码......
所以这里的回报率更低,再次因为它很容易支持......