V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yukirock
V2EX  ›  程序员

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

  •  
  •   yukirock · 2014-05-08 23:53:39 +08:00 · 3633 次点击
    这是一个创建于 3854 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例如這樣的:
    return Math.sqrt(Math.pow(_from.x() - this.x,2) + Math.pow(_from.y() - this.y,2));
    13 条回复    2014-05-14 02:00:16 +08:00
    jsonline
        1
    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
        2
    jakwings  
       2014-05-09 00:23:40 +08:00
    断行缩进和变量赋值一样。可以根据是否要统一风格而选择要不要另起一个变量再 return。反正要将 return 改成变量赋值也不麻烦。
    假如不同 return 语句返回值类型不同,可以用变量名来明确要返回的是什么,可以少加注释,同时统一 return 语句的简洁风格。
    Mutoo
        3
    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
        4
    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
        5
    NemoAlex  
       2014-05-09 09:30:07 +08:00
    不要写比较长的 return 语句
    除非你写的东西不是给人看的
    StackGao
        6
    StackGao  
       2014-05-09 09:41:09 +08:00 via Android
    @NemoAlex 说得很好
    zythum
        7
    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
        8
    yukirock  
    OP
       2014-05-09 21:28:14 +08:00
    多謝各位回復。
    這個問題我只是想討論關於 format 的問題,倒不涉及註釋怎麼寫……反正註釋要寫也頂多就是「求兩點間距離」這樣簡單的一句。

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

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

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

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


    @zythum
    > 不好理解就写注释。多写点注释比什么都强。
    這樣的話給變量和函數起名都得花工夫了= =
    darasion
        9
    darasion  
       2014-05-10 19:36:11 +08:00
    人能看懂就行了。不用纠结形式。
    banxi1988
        10
    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
        11
    FrankHB  
       2014-05-12 11:53:18 +08:00
    标题问的只是语法问题,怎么连局部变量都来了。(不过后来好像还想要语义?那就随便吧。)
    如果只是想治疗规范强迫症,具体结果看起来怎么样其实倒相对不重要了。
    所有存在形式语法的语言通用的可保证结果唯一无歧义的方法:预测行数并指定上限,约定标点是否能出现在行首和行尾的策略,然后按节点高度优先顺序拆AST。(嘛,没有考虑对齐还真简单很多;能习惯有些情况下return后立刻换行就好……)
    uleh
        12
    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
        13
    uleh  
       2014-05-14 02:00:16 +08:00
    空格被过滤掉了。。。
    个人习惯是,函数里的内容换行。
    并在调用处(即第一行的Math)空 4 格开始。
    同级别的参数开头对齐。
    也就是 2、3 行的 Math 是从第一行「.」的位置开始。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1205 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:29 · PVG 02:29 · LAX 10:29 · JFK 13:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.