較長的 return 語句,各位認爲怎樣斷行、縮進比較好?

2014-05-08 23:53:39 +08:00
 yukirock
例如這樣的:
return Math.sqrt(Math.pow(_from.x() - this.x,2) + Math.pow(_from.y() - this.y,2));
3622 次点击
所在节点    程序员
13 条回复
jsonline
2014-05-09 00:10:16 +08:00
var magicNumber = Math.sqrt(Math.pow(_from.x() - this.x,2) + Math.pow(_from.y() - this.y,2));

return magicNumber

用了 JS 的 AMD 之后,你这根本就不能算长了,

define(function(){
return {
// 省略200行
}
})
jakwings
2014-05-09 00:23:40 +08:00
断行缩进和变量赋值一样。可以根据是否要统一风格而选择要不要另起一个变量再 return。反正要将 return 改成变量赋值也不麻烦。
假如不同 return 语句返回值类型不同,可以用变量名来明确要返回的是什么,可以少加注释,同时统一 return 语句的简洁风格。
Mutoo
2014-05-09 00:26:37 +08:00
《重构》修改长return的 用的是“提炼方法”

function dist(x1,y1,x2,y2) {
...
}

...
return dist(_from.x(), _from.y(), this.x, this.y);
jprovim
2014-05-09 03:37:48 +08:00
```javascript
return Math.sqrt(Math.pow(_from.x() - this.x,2)
+ Math.pow(_from.y() - this.y,2));
```
NemoAlex
2014-05-09 09:30:07 +08:00
不要写比较长的 return 语句
除非你写的东西不是给人看的
StackGao
2014-05-09 09:41:09 +08:00
@NemoAlex 说得很好
zythum
2014-05-09 11:02:57 +08:00
我觉得这么些没问题。 很清楚啊

@jsonline 这样赋一个值其实换汤不换药... 而且AMD和这个没有半毛钱关系
@Mutoo 这样有点强行增加代码复杂度的感觉
@jprovim 这个可以

甚至可以
Math.sqrt(
Math.pow(_from.x() - this.x,2) +
Math.pow(_from.y() - this.y,2)
);

@NemoAlex
@StackGao 话说如果写oc的怎么能够不长. 其实只要逻辑简洁好理解就可以了。

不好理解就写注释。多写点注释比什么都强。省得自己回头看还骂娘。
yukirock
2014-05-09 21:28:14 +08:00
多謝各位回復。
這個問題我只是想討論關於 format 的問題,倒不涉及註釋怎麼寫……反正註釋要寫也頂多就是「求兩點間距離」這樣簡單的一句。

@jakwings
> 假如不同 return 语句返回值类型不同,可以用变量名来明确要返回的是什么,可以少加注释,同时统一 return 语句的简洁风格。
我覺得簡潔有許多理解方式。例如如果要返回一個新生成的對象,大致是先聲明,再操作,最後只要簡單地 return newObject; 就好;但對於簡單的類型,例如這樣只涉及運算的 double,跳過中間變量也是一種簡潔。
當然這個例子太簡單了,不用註釋也沒問題,似乎並不適合拿來討論。

@Mutoo
這樣寫似乎並沒有簡化語義。
而且多一層函數調用可能會增加開銷,畢竟這個函數要調用很多次。
畢竟是要交到學校服務器上運行的作業,我倒並不想爲了可讀性犧牲性能。

@jprovim
這個看起來不錯,非常感謝。

@NemoAlex
> 不要写比较长的 return 语句
> 除非你写的东西不是给人看的
……果然是因爲這個只是簡單的求兩點間距離麼


@zythum
> 不好理解就写注释。多写点注释比什么都强。
這樣的話給變量和函數起名都得花工夫了= =
darasion
2014-05-10 19:36:11 +08:00
人能看懂就行了。不用纠结形式。
banxi1988
2014-05-11 08:54:57 +08:00
@Mutoo 按照重构的方法,
其实在这种情况下,还可以使用另一个方法,就是引入解释性的局部变量 :
将:
return Math.sqrt(Math.pow(_from.x() - this.x,2) + Math.pow(_from.y() - this.y,2));
改成:

float xpow = Math.pow(_from.x() - this.x,2);
float ypow = Math.pow(_from.y() - this.y,2);
return Math.sqrt(xpow+ypow);
FrankHB
2014-05-12 11:53:18 +08:00
标题问的只是语法问题,怎么连局部变量都来了。(不过后来好像还想要语义?那就随便吧。)
如果只是想治疗规范强迫症,具体结果看起来怎么样其实倒相对不重要了。
所有存在形式语法的语言通用的可保证结果唯一无歧义的方法:预测行数并指定上限,约定标点是否能出现在行首和行尾的策略,然后按节点高度优先顺序拆AST。(嘛,没有考虑对齐还真简单很多;能习惯有些情况下return后立刻换行就好……)
uleh
2014-05-14 01:57:19 +08:00
单看格式的话,我一般会这么写
return Math.sqrt(
Math.pow(_from.x() - this.x,2) +
Math.pow(_from.y() - this.y,2));
uleh
2014-05-14 02:00:16 +08:00
空格被过滤掉了。。。
个人习惯是,函数里的内容换行。
并在调用处(即第一行的Math)空 4 格开始。
同级别的参数开头对齐。
也就是 2、3 行的 Math 是从第一行「.」的位置开始。

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

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

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

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

© 2021 V2EX