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

无聊问下代码风格的事

  •  
  •   moxuanyuan · 2020-01-20 11:46:55 +08:00 · 8757 次点击
    这是一个创建于 1801 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Snipaste_2020-01-20_11-43-12.png

    公司连我在内 6 个码农。。。

    5 个都是习惯风格 1。。。

    只有我一个是风格 2。。

    你们用哪种风格?

    87 条回复    2020-01-21 20:24:04 +08:00
    ooops
        1
    ooops  
       2020-01-20 11:48:50 +08:00
    尝试说服他们,超过两个建议换行。说服不了就按它们的来
    renmu
        2
    renmu  
       2020-01-20 11:48:50 +08:00 via Android
    我是写 py 的,列表选择 1,字典选择 2
    cmdOptionKana
        3
    cmdOptionKana  
       2020-01-20 11:51:00 +08:00   ❤️ 2
    三个元素以内并且 80 个字符以内用 1,超过则用 2
    Chase2E
        4
    Chase2E  
       2020-01-20 11:51:24 +08:00   ❤️ 1
    风格 1 的是来搞笑的吗?。。
    zhanggang807
        5
    zhanggang807  
       2020-01-20 11:52:43 +08:00
    我的风格(java),超过 120 列(就是宽度)之后折行再接着行写,一直顶到头是不行的
    类似于这样的
    /**
    * All possible chars for representing a number as a String
    */
    final static char[] digits = {
    '0' , '1' , '2' , '3' , '4' , '5' ,
    '6' , '7' , '8' , '9' , 'a' , 'b' ,
    'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
    'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
    'o' , 'p' , 'q' , 'r' , 's' , 't' ,
    'u' , 'v' , 'w' , 'x' , 'y' , 'z'
    };
    chenqh
        6
    chenqh  
       2020-01-20 11:52:48 +08:00
    这个随便把,
    jfcherng
        7
    jfcherng  
       2020-01-20 11:53:20 +08:00
    幾乎都使用 2, 並且結尾必加逗號( php-cs-fixer 自動加)
    moxuanyuan
        8
    moxuanyuan  
    OP
       2020-01-20 11:53:57 +08:00
    @chenqh 风格 2,我一目就看完所有内容,风格 1,我还要从左到右看一次才看得完。。
    Cuo
        9
    Cuo  
       2020-01-20 11:54:09 +08:00
    风格 2, 读起来更方便.
    jowan
        10
    jowan  
       2020-01-20 11:56:34 +08:00
    如果团队没有要求 那就谁能说服谁就听谁的
    如果遵循了某种规范 比如 PSR-2 你这种情况就请选择 2
    可以参考那些遵循 PSR 的框架 看他们写的代码风格就行了
    你这种就跟 Laravel 的配置一样 比如 Model 里面的$fillable Http 里面的 Kernel
    eason1874
        11
    eason1874  
       2020-01-20 11:56:52 +08:00   ❤️ 1
    短就 1,长就 2,图片里这么长我肯定 2
    xuyl
        12
    xuyl  
       2020-01-20 12:07:50 +08:00 via Android
    我选择 2,但不用 array(),用[]
    fewok
        13
    fewok  
       2020-01-20 12:15:32 +08:00
    屏幕能显示完,为啥要换行呢?
    举个例子,换行的写法,来 10 个变量,还得滑屏才能看到后面,完全不直观
    Mogamigawa
        14
    Mogamigawa  
       2020-01-20 12:18:46 +08:00
    柯里化走起
    jdhao
        15
    jdhao  
       2020-01-20 12:19:49 +08:00 via Android
    太长就需要换行,我选择 2
    rioshikelong121
        16
    rioshikelong121  
       2020-01-20 12:23:43 +08:00
    2
    hyy1995
        17
    hyy1995  
       2020-01-20 12:47:26 +08:00   ❤️ 5
    害,就这么点元素,爱咋写咋写了。。。如果里面几十个元素,你怎么写都丑
    imswing
        18
    imswing  
       2020-01-20 12:49:39 +08:00 via iPhone
    2
    stevenshuang
        19
    stevenshuang  
       2020-01-20 13:03:31 +08:00 via iPhone
    数量不多 1,多的情况就是 2
    onfuns
        20
    onfuns  
       2020-01-20 13:08:20 +08:00
    肯定是 2 了,git 规范也是这种,如果 1 再加个变量,那么 diff 的时候一眼看不出来,而 2 的话只变动了一行,可以明显的看出来。
    Dylaan
        21
    Dylaan  
       2020-01-20 13:09:44 +08:00
    2,[]
    xiangyuecn
        22
    xiangyuecn  
       2020-01-20 13:12:17 +08:00
    怎么好看怎么来,一行能解决又非常容易阅读的就没必要断成很多行,滚滚轮也是需要花力气的

    比如:
    if (短小绣花针){
    code



    if (短小绣花针)
    {
    code

    公司是按代码行数付工资吗😂
    tabris17
        23
    tabris17  
       2020-01-20 13:13:51 +08:00   ❤️ 1
    简单,以后 KPI 以代码行数计算
    no1xsyzy
        24
    no1xsyzy  
       2020-01-20 13:15:39 +08:00
    关于代码风格,pick one instantly and keep it permanently

    我是总体倾向风格 2 的
    但如果 1. 内容不是特别多特别长的,并且 2. 不是列表而是元组,可以接受风格 1

    我解释下 2.,就是说这些字段间有某种内在联系,而不是单纯的枚举或者并列。
    比如构成一个字典用的键值(```dctdata=dict(zip([...],lstdata))``` 中 [...] 的部分可以在一行内没问题)
    或者是(迫于格林斯潘第十定律)需要写伪 Lisp 时 ```html=['html', ['body', ['h1', 'Hello World!']]]```
    或者描述某种顺序 ```[first, second, last]```
    icylogic
        25
    icylogic  
       2020-01-20 13:17:01 +08:00 via iPhone
    这有啥好操心的……统一定一个 format 的规范然后让 ide / pre-commit hook 负责这个就好了啊……
    no1xsyzy
        26
    no1xsyzy  
       2020-01-20 13:20:39 +08:00
    @onfuns git 友好需要最后也加逗号
    否则一个 branch 里改动最后一行内容,另一个 branch 里最后新增一行(原最后一行需要增加逗号)
    就可能 merge conflict。
    guanhui07
        27
    guanhui07  
       2020-01-20 13:23:14 +08:00
    三个元素以内并且 80 个字符以内用 1,超过则用 2
    yim7
        28
    yim7  
       2020-01-20 13:25:44 +08:00
    我喜欢 2,这样添加新元素很方便,直接换行
    no1xsyzy
        29
    no1xsyzy  
       2020-01-20 13:26:26 +08:00
    @icylogic 我跟你说,我给自己设计的规范是不能 lint 的……
    我在 Python 下,单双引号的使用完全区分,单引号表示 “符号”,双引号表示 “字符串”。自动化方案无法做到的这个分析的。
    mixure
        30
    mixure  
       2020-01-20 13:29:12 +08:00
    管好自己就成。
    kiritoxf
        31
    kiritoxf  
       2020-01-20 13:32:55 +08:00
    我们是尽量一行,但是超过 120 后要换行。
    qiaoweizhen
        32
    qiaoweizhen  
       2020-01-20 13:32:58 +08:00
    2,变量采用小驼峰,array 改成[],数组最后元素加逗号。2 的原因主要是 git 增减某一个元素的时候很容易对比
    moyupoi
        33
    moyupoi  
       2020-01-20 13:35:45 +08:00 via iPhone
    肯定 2,除非懒了,不想维护的代码用 1,不过得多懒…
    moyupoi
        34
    moyupoi  
       2020-01-20 13:38:06 +08:00 via iPhone
    而且代码前面不要用 tab 直接空行,初学者才直接按 tab,学着用两个空格空行,看看代码规范,多看大神写的源码就知道该怎么做了
    hauzi
        35
    hauzi  
       2020-01-20 13:41:04 +08:00
    [ ]
    avenger
        36
    avenger  
       2020-01-20 13:47:36 +08:00 via iPhone
    不要在风格上纠结浪费时间。php-cs-fixer 解千愁
    laravel
        37
    laravel  
       2020-01-20 13:53:59 +08:00
    当然是 2 了
    $arr = [
    "what",
    "the",
    "fuck"
    ];

    不用 golang 的风格,我浑身难受
    bnm965321
        38
    bnm965321  
       2020-01-20 13:56:01 +08:00
    用 black/prettier 之类的工具自动格式化,不要在这方面费劲了
    xh520630
        39
    xh520630  
       2020-01-20 14:01:49 +08:00
    @moyupoi 认真的吗?
    PSR-2 :
    2.4. 缩进
    代码 必须 使用 4 个空格来进行缩进

    大神都是用 2 个空格???
    moyupoi
        40
    moyupoi  
       2020-01-20 14:03:30 +08:00 via iPhone
    @xh520630 指的就是 4 个
    loudefa
        41
    loudefa  
       2020-01-20 14:06:10 +08:00
    风格 2 啊,还有你这 php 咋还用 array,不都是 [] 了么,没升级版本?
    Kisesy
        42
    Kisesy  
       2020-01-20 14:12:33 +08:00
    说真的如果按图中来看,我喜欢 1,因为我觉得横着看眼睛很舒服,如果是大量竖着的数据,我会😵一会
    lifesimple
        43
    lifesimple  
       2020-01-20 14:13:23 +08:00
    折中一下 每行三个 然后换行
    darksword21
        44
    darksword21  
       2020-01-20 14:16:36 +08:00 via iPhone
    图片这么多肯定使用 2
    moxuanyuan
        45
    moxuanyuan  
    OP
       2020-01-20 14:50:09 +08:00
    @mixure 关键我有时候需要改他们的代码,这时候就很难受
    moxuanyuan
        46
    moxuanyuan  
    OP
       2020-01-20 14:50:27 +08:00
    @loudefa 习惯。。。
    ben1024
        47
    ben1024  
       2020-01-20 15:13:19 +08:00
    用 phpcs 强制规范统一下,控制下自己手动格式化操作的欲望
    yolee
        48
    yolee  
       2020-01-20 15:25:40 +08:00
    编辑器限制 80 列,超出必须换行。
    bnm965321
        49
    bnm965321  
       2020-01-20 15:29:00 +08:00
    用 black/prettier 之类的工具自动格式化,不要在这方面费劲了
    xuanxuan11
        50
    xuanxuan11  
       2020-01-20 15:34:17 +08:00
    宽度 80,超过 80 要换行
    shiran3f
        51
    shiran3f  
       2020-01-20 15:48:23 +08:00
    2。
    风格 1,我看见一次说一次
    linda102
        52
    linda102  
       2020-01-20 15:52:32 +08:00
    2
    leosirius666a
        53
    leosirius666a  
       2020-01-20 16:01:54 +08:00
    太长换行不是常识吗
    chotow
        54
    chotow  
       2020-01-20 16:36:58 +08:00
    受不了下划线的变量,我要改成 otherFieldDeal !
    chenliangngng
        55
    chenliangngng  
       2020-01-20 16:40:16 +08:00 via Android
    我们是 5 楼那样的
    lemon6
        56
    lemon6  
       2020-01-20 16:41:17 +08:00 via Android
    我用的 2
    Sapp
        57
    Sapp  
       2020-01-20 17:04:01 +08:00   ❤️ 1
    @fewok 你的屏幕能显示完不代表别人就能, 比如你 1080p 的屏幕,给你一行是显示不少,但是视线是不是还要移动? 这就还好,换一个用 13 寸 macbook 的人呢? 他还要动滚动条才能看到
    icylogic
        58
    icylogic  
       2020-01-20 17:07:06 +08:00 via iPhone
    @no1xsyzy

    1. 印象中单双引号这个大部分 formatter 不怎么管( black 除外),一般 format 的时候会直接略过不处理( as-is ),这个和你的风格并不冲突;
    但你主题中的这个问题大部分 formatter 都可以统一解决,一个 column 限制就够了

    2. 而且规范从来就不是用来约束某一个人,个人的代码风格和品味一直随着时间和能力改变,自己一个人写的项目从来不会有人关心是按着什么规范写的。
    但既然你们都在同一份代码上工作,你是这么用引号以及长列表的,你的同事呢?你如何保证同事这么用?如果你保证不了,你同事的代码也许全是单 /双引号甚至相反的使用习惯,那你们阅读彼此的代码时也会难受啊?同事哪天改你的代码改成人家自己的“个人规范”了,你们打一架吗……规范就是用来提前避免这些的啊。(比较激进的 black 全给你 format 成双引号了)
    zhyt1985
        59
    zhyt1985  
       2020-01-20 17:17:57 +08:00
    风格 2,代码量是按照行数计算的
    zhyt1985
        60
    zhyt1985  
       2020-01-20 17:18:40 +08:00
    用风格 1 的估计用的都是超宽的显示屏
    qwertyzzz
        61
    qwertyzzz  
       2020-01-20 17:29:47 +08:00
    代码格式化下 看编辑器格式化成哪种
    akira
        62
    akira  
       2020-01-20 17:32:50 +08:00
    风格 2, 太长的代码在服务器上面不好看 不好改
    THESDZ
        63
    THESDZ  
       2020-01-20 17:34:08 +08:00
    代码可读性考虑都是 2,反正编译完以后没区别
    miv
        64
    miv  
       2020-01-20 17:38:11 +08:00 via iPhone
    风格二,第一种看起来麻烦,第二种一目了然
    cxh
        65
    cxh  
       2020-01-20 17:39:26 +08:00
    说服他们遵循 psr 规范,php-cs-fixer 格式检测,说服不了就按他们的来,哈哈哈
    oakland
        66
    oakland  
       2020-01-20 18:00:18 +08:00
    用自动化工具可以处理吧? git 提交的时候自动格式化
    no1xsyzy
        67
    no1xsyzy  
       2020-01-20 18:46:17 +08:00
    @icylogic 我是说不能被 IDE 或 hook 自动化
    我的规范是种合理且极端的情况。单双引号是两种基本可互换的词法结构,但我却要求其具有语义。这需要的是 Review,靠程序是做不到的,上那些所谓 “人工智能” 的 Review 更不行(至少 RNN 肯定不行)。
    我提出这点用以例证:如果没有 Review,实际上所谓代码风格的存在就是幻象,松散的规定会导致 A. 风格有歧义,严格的规定会导致 B. 无法变通反而代码可读性更糟糕的情况。
    而我对于 “不是列表而是元组” 也是语义上的要求。

    详细地针对 1. 进行论述:
    就算对 column 进行限制仍然导致 A. 风格有歧义,就像 #5 那样,仍然可能存在多个元素一行的情况 —— 不要说限制单行单元素,那样的话就是 B. 无法变通,比如使用一维表示二维数组,那样显然仍然按照二维方式书写更好;或者是分几类的,比如枚举 alphanumeric,一行数字一行小写字母一行大写字母,不然还需要做列表拼接或者 flat。
    no1xsyzy
        68
    no1xsyzy  
       2020-01-20 18:56:30 +08:00
    @icylogic BTW,我对于词法语法层面的 “代码规范” 是感到不自然的。
    代码规范是为了阅读方便的,但现在大部分**编辑器**都有代码高亮功能的情况下,词法语法方面进行规范对可读性是没有帮助的。
    还有一些 “规范” 竟然是为了 git 的方便。为了一个不完善的工具的方便!
    我说的不完善不是使用者的 “抱怨”,也不是(王垠所说)创作者的 “改进方向”,更像是经济学家的 “历史的必然”。但因为历史的扭曲而继续扭曲不符合理性,很难想象这是所谓 “软件**工程**” 的一部分。
    a1562619919
        69
    a1562619919  
       2020-01-20 19:03:48 +08:00 via Android
    2,1 想看完整代码可能得滑鼠标太累
    cominghome
        70
    cominghome  
       2020-01-20 19:29:08 +08:00
    短就 1,长就 2
    icylogic
        71
    icylogic  
       2020-01-20 19:43:59 +08:00 via iPhone
    @no1xsyzy

    我没理解错的话,你说的重点是,你对代码风格的要求,细到了现有大部分工具都无法完美解决的地步,这是事实。然后你实解决的方式就只能是靠你自己去人工 Review 了,如果你们团队就是全靠你来 Review,而且你有话语权和精力一直做这个事,我当然没有任何意见。

    我只是给你提供一个大部分团队(就我所知)都能接受的方案,即达成一份所有人能接受的规范,然后用一套自动化工具达到 90%的代码风格(可读性)需求,然后所有人忘掉这件事去做开发。

    我们也遇到过自动化工具不能完美解决所有需求的问题,一些不重要又难开发的需求我们就放弃了,剩下的需求我用一些 ast 库补完了工具来满足。我们做 Review 时的 checklist 排除了所有 formatter,linter,sanitizer 能查出来的项,重点放在接口,安全,性能,架构(对于大一点的改动)。

    PS. 之前说 column 是因为所有 formatter 都会支持,有些工具是能提供更细的选项的,比如制定函数传参是不是换行,dict 定义能不能换行,以及对于用户需要自定义格式的 region 提供关闭 formatter 的功能(比如手写矩阵的时候)
    fewok
        72
    fewok  
       2020-01-20 19:47:43 +08:00
    @Sapp 换个反驳的例子吧,这两例子太好反驳了。
    移动视线这种,又不是死鱼眼,转转眼球,即保持眼球湿润,还能活动颈椎,多赞。
    再说 13 寸 macbook,万一有人用 7 寸显示器,13 寸 macbook 的人要不要照顾下 7 寸显示器的呢?

    再举几个反驳 2 的例子。
    1、拿着 20 年前的规范定义现在的显示器,1/5 宽度都用不到,剩下留着照镜子?
    2、100 行完事的代码,非要拉出 500 ~ 600 行,按行数给钱?
    3、一屏幕显示完的逻辑,非要滑几屏幕,太直观难以体现能力?
    dobelee
        73
    dobelee  
       2020-01-20 20:01:15 +08:00 via iPhone
    这个长度决定就好。
    shuangyeying
        74
    shuangyeying  
       2020-01-20 20:03:38 +08:00
    5 个码农三到五年工作经验,楼主可能一到两年经验,有这个疑问很正常。因为最近的 IDEA 一按快捷键就一行变多行,然后觉得不错也就默认认可了。可能我也不知道我说了什么。
    publicccc
        75
    publicccc  
       2020-01-20 20:11:24 +08:00
    短地一行,长的选择样式 2。
    楼主这个长度当然选择样式 2.
    no1xsyzy
        76
    no1xsyzy  
       2020-01-20 20:33:42 +08:00
    @icylogic 说来我已经忘了最初我想说什么了(说到底大概我只是想说下我的规范有多神奇)
    这些能自动化的,确实不叫规范也不叫风格,也就是 format lint 还有更多更多 xxer 里的 xx
    大概都能叫 convention 吧
    (后面关于词法语法规范不自然,就是突然意识到了自己的感觉是啥)
    主要还是 pick one and forget it

    PS. 总感觉免不了出现图灵完备的换行与否要求,不过那都无关紧要了
    no1xsyzy
        77
    no1xsyzy  
       2020-01-20 20:56:40 +08:00
    我突然意识到结合看似不兼容的几种想法,我足以给出一个兼容的最终结论了
    第零条,一切的格式、规范、风格、结构、形态…… 统称 “视觉表现”。它影响的是 “可读性”,因为执行起来没区别。
    此处也不例外,编写者应当选择在阅读此段代码的过程中对于程序逻辑理解更清楚的一种。
    那么核心在于,以何种 “视觉表现” 编写的话,逻辑是清晰的?
    这设计到这一序列的内容物的清晰程度。
    风格 1 将内容紧实到一行,它容易引起这一序列的 “整体感”。
    风格 2 将内容分散到多行,它看上去更像是独立的个体,形成 “模块感”。

    对于将数组看作一个整体的,会更倾向于第一种。
    对于将数组看作个体的集合的,会更倾向于第二种。

    人们常说,一本书是先越读越厚,然后越读越薄的 —— 对于代码风格应该也一样,逐渐倾向第二种,然后再重新倾向第一种。

    实际上,我最近对同一个事物建了三次模正好类似 1、2、1 的形态…… 但第一个 1 和最后一个 1 是不同的。
    前者是粗略粗糙;后者是精炼简洁。
    前者是对其组成的不理解,只得以整体考虑;后者是已经清楚明晰,不必单独考虑。
    redbuck
        78
    redbuck  
       2020-01-20 21:10:35 +08:00 via Android
    装个代码格式化工具吧,纠结这种没有意义。

    还有加不加分号,tab 还是空格缩进,4 个空格还是 2 个空格,争这个真是浪费生命,早点下班不好?
    shifttacn
        79
    shifttacn  
       2020-01-20 21:26:17 +08:00
    这个还好,不过我一般是风格 2,还要配上相同格式的备注。。。。
    最不能忍的是极简代码,能省则省,可读性可维护性都特别差。也不知道在秀什么优越感
    kooze
        80
    kooze  
       2020-01-20 21:56:23 +08:00
    你都说是“风格”了,无所谓好坏。风格问题。
    Sapp
        81
    Sapp  
       2020-01-20 22:29:49 +08:00
    @fewok 强行杠,不用回复了,你这样的没法交流,七寸屏都说出来了,用 13 寸 macbook 的一大把,用 7 寸写代码的我从来没见过也没听过
    karnaugh
        82
    karnaugh  
       2020-01-20 22:35:11 +08:00
    ①单个的时候习惯用 2
    ②如果是多个的话字段少用 1 可以更整洁点
    ③但是如果字段多的话一格式化还是会变成 1。。。那就只能写完一按减号收起来眼不见心不烦
    举例:

    let user = {
    name: '111',
    phone: '222',
    age: '333'
    }


    let userList = [
    { name: 'name1', phone: '222', age: '333' },
    { name: 'name2', phone: '222', age: '333' },
    { name: 'name3', phone: '222', age: '333' },
    { name: 'name4', phone: '222', age: '333' }
    ]
    anytk
        83
    anytk  
       2020-01-21 09:58:00 +08:00
    2,对版本管理更友好一些,diff 更容易看出
    fewok
        84
    fewok  
       2020-01-21 10:48:39 +08:00
    @Sapp 接受不了反驳就别 @别人,随意定义他人言论,卖萌嘛?互拉黑吧。
    再说 7 寸问题,7 寸手机没有 13 寸 macbook 多? 17 寸以上显示器没有 13 寸 macbook 多?
    手拿 13 寸 macbook,就要全世界照顾 13 寸,惯习惯了?
    SenXie
        85
    SenXie  
       2020-01-21 11:12:47 +08:00
    我是写 python 的,用 black 格式化,格式化成啥样就是啥样,再也不用操心到底用啥格式了,反正没得选
    linxl
        86
    linxl  
       2020-01-21 11:19:32 +08:00
    当然是 2. PSR 规范.
    RickyC
        87
    RickyC  
       2020-01-21 20:24:04 +08:00
    都认同. 因为都能看清
    我应该这么写
    $asda_faf_asd=['asda','asda','asdads','asdas','asdas'];
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3492 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:32 · PVG 12:32 · LAX 20:32 · JFK 23:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.