据说优秀的代码没有 else?

2018-04-18 18:53:08 +08:00
 GoPHP

多个 if else 嵌套的代码估计大家都见过。。。头疼!

但是其实很多 if else 可以简化成一个 if,不需要 else,举个例子:

$books = getByAFunc()
if($books) {
   do something ...
   return something
}else {
   do something ....
   return something
}

看上去没什么毛病,但是根据业务需求,大部分是可以这么写:

if($books) {
     do something...
     return something
}
do something...
return something

这只是举个例子,很多时候满足条件的只有一种情况,那我们就可以针对这一种情况处理,其他情况直接 return !

还要一种写法是先处理可能出现的异常错误,然后最后执行下来的就是正确情况!

16859 次点击
所在节点    程序员
147 条回复
natscat
2018-04-19 16:49:08 +08:00
我觉得程序里面应该把每一种可能的执行路径都写清楚
所以我是支持 if...else...这种的
lightening
2018-04-19 17:17:45 +08:00
看情况。如果 if 是作为过滤掉一些非正常情况,那么早早 return 掉是可以接受。如果本来就是两种需要正常处理的情况,当然是 if ... else 更清晰。
floyda
2018-04-19 17:17:48 +08:00
优秀的代码没有 if 的
afpro
2018-04-19 17:21:56 +08:00
优秀的代码不拘泥于有没有 if 这种细节 整体的可读性更重要
dayoushen
2018-04-19 17:22:00 +08:00
支持 if-else 匹配,但不支持 if-else if-else if ..-else
如下:
char *p = new char[10];
if(condition == true)
{
do_something()
delete []p;
p = NULL;
return some;
}
do_else();
delete []p;
p = NULL;
return some;
你要释放两次指针,只有 if 容易内存泄漏。完美 if-else
bool bRet;
char *p = new char[10];
if(condition == true)
{
do_something()
bRet = true;
}
else
{
do_else()
bRet = false;
}
do_else();
delete []p;
p = NULL;
return bRet ;
hslx111
2018-04-19 18:57:42 +08:00
else 可以有,但是多层嵌套不应该
awing
2018-04-19 19:03:04 +08:00
是时候祭出这段代码了
```python
elif (rootKey == "mode"):
# Capitalize it just for good measure
value = value.upper()
if (value == "LOITER"):
self.vehicleWrapper.vehicle.mode = dronekit.VehicleMode("LOITER")
elif (value == "STABILIZE"):
self.vehicleWrapper.vehicle.mode = dronekit.VehicleMode("STABILIZE")
elif (value == "ALT_HOLD"):
self.vehicleWrapper.vehicle.mode = dronekit.VehicleMode("ALT_HOLD")
elif (value == "GUIDED"):
self.vehicleWrapper.vehicle.mode = dronekit.VehicleMode("GUIDED")
elif (value == "AUTO"):
self.vehicleWrapper.vehicle.mode = dronekit.VehicleMode("AUTO")
elif (value == "RTL"):
self.vehicleWrapper.vehicle.mode = dronekit.VehicleMode("RTL")
elif (value == "BRAKE"):
self.vehicleWrapper.vehicle.mode = dronekit.VehicleMode("BRAKE")
else:
```
MasterC
2018-04-19 19:06:35 +08:00
@awing #107 为什么不用 switch case
guog
2018-04-19 19:19:36 +08:00
@MasterC Python🌚
hansight2018
2018-04-19 19:33:30 +08:00
refer to "guard clause"
bobuick
2018-04-19 19:36:19 +08:00
什么鬼。
反了吧,优秀的代码应该要有 else, 如果没 else 说明这个 if 可以再抽象到一个函数里去。 如果是简单的 if, 应该是存在三元表达式的方式表达。
MeteorCat
2018-04-19 20:47:43 +08:00
涉及业务多的时候,你就知道了
ww2000e
2018-04-19 20:59:44 +08:00
优秀程序员 tab 是 8 个空格
yanyuechuixue
2018-04-19 22:49:39 +08:00
认同一部分吧, 如果是发生了某条件需要做一件事, 而不发生的时候不需要做, 那么最好不用 else 只用 if, 提升效率. 而且最好 if 的条件为真的概率要更大.

如果需要分开处理, 那还是用 else 吧. 避免不了的.(当然你要说用两个 if 的话我没话说, 但效率会下降吧?我猜.)
Chingim
2018-04-20 00:51:13 +08:00


求比较, 求更优雅的方案
akira
2018-04-20 01:00:20 +08:00
@Chingim 根据与或关系应该是可以获得 0-3,4 个数字
Chingim
2018-04-20 01:03:33 +08:00
@akira show your code
elvodn
2018-04-20 01:18:08 +08:00
@Chingim 错误排除用 early return,双分支 if...else... 多分支应该用 switch 吧
``` go
func getPlanDone(isSunny, isHappy bool) {
switch {
case isSunny && isHappy:
println("plan-A-step-1")
println("plan-A-step-2")
case isSunny:
println("plan-B-step-1")
println("plan-B-step-2")
case isHappy:
println("plan-C-step-1")
println("plan-C-step-2")
default:
println("plan-D-step-1")
println("plan-D-step-2")
}
}
```
MrGba2z
2018-04-20 01:47:28 +08:00
优秀的代码没有 if
优秀的代码只有优秀的客户才配用 只有一种可能 没有任何 if 没有任何异常 如果发生了 那么就是客户不够优秀
akira
2018-04-20 01:57:15 +08:00
@Chingim 满足你的愿望。

function getPlanDone(isSunny, isHappy)
{
var steps = ["D","B","C","A"];
var c = isSunny + isHappy * 2;

console.log( 'plan-' + steps[c] + '-step-1' );
console.log( 'plan-' + steps[c] + '-step-2' );
}

getPlanDone( true, true); //A
getPlanDone( true, false); //B
getPlanDone( false, true); //C
getPlanDone( false, false); //D

PS , 这种过于技巧性的代码不建议在日常工作使用。其实你的第二种写法就非常好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/447915

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX