代码风格,是一件头疼的事情 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
changnet
V2EX    程序员

代码风格,是一件头疼的事情

  •  1
     
  •   changnet 2017-07-23 14:17:05 +08:00 10792 次点击
    这是一个创建于 3053 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码风格,不能没有。但是又没有对错,混用各种风格,非常头疼。

    在游戏公司上班,现在用的框架常用是 C++作底层,Lua 作上层脚本。但是这个框架非常古老,我估计 10 年以上了。期间经历无数项目,无数人来来去去。代码风格混乱。

    • C++采用大驼峰写法
    • Lua 采用小驼峰
    • 空格、Tab 混用
    • 2 个字符、4 个字符宽度缩进混用

    公司并没有严格的代码审核。每次新项目时,上头都是:这个功能之前的项目已经有了,就不用重新做了。重构这种东西,不存在的,时间才是最重要的。 然后实际做的时候又发现和现在的设定有点不一样,就继续在原文件上改。

    加上个人的原因,我喜欢在函数的括号前后加一空格,但是另人都不加。 我是

    void Player:SendPosition( int x,int y ); 

    别人是

    void Player:SendPosition(int x,int y); 

    而且最近业余看点 egret 的东西,主要是 js,这就更令人崩溃了。js 的大括号是不换行的,而我之前写的 C++都是换的。已经写了 4 年代码了,而且自己业余写的一些东西,风格已经固定,不想再换了。但是不换,在各种语言中混着写感觉就像精神分裂一样。

    72 条回复    2018-09-22 18:14:04 +08:00
    ansheng
        1
    ansheng  
       2017-07-23 14:32:55 +08:00
    每种编程语言都有自己的规范,官方承认的规范,跟着那个写就好了,不过经常来回切换语言确实有些蛋疼
    iEverX
        2
    iEverX  
       2017-07-23 14:33:37 +08:00   5
    风格没有对错,重在统一。所以参与项目,就按照项目的风格来,即使一个项目里面的 java 是下划线的,那也应该是下划线的
    mornlight
        3
    mornlight  
       2017-07-23 15:08:31 +08:00   5
    仅针对你说的在函数的括号前后加一空格这一点我倒是觉得有点新奇,通常是逗号后面有空格,没见过括号后面有的。
    sunriseyuen
        4
    sunriseyuen  
       2017-07-23 15:11:37 +08:00 via Android
    不是用工具格式化就好了吗
    Technetiumer
        5
    Technetiumer  
       2017-07-23 15:14:27 +08:00 via Android   2
    我习惯逗号后面有空格

    void Player:SendPosition(int x, int y);
    feiyuanqiu
        6
    feiyuanqiu  
       2017-07-23 15:21:03 +08:00   1
    统一用 google 的 c++ 风格就挺好,再用 clang-format 一键格式化。写的时候随便写,提交的时间全格式化了
    fytriht
        7
    fytriht  
       2017-07-23 15:56:54 +08:00
    用代码格式化工具,自己想怎么缩进都行
    server
        8
    server  
       2017-07-23 15:59:39 +08:00
    说明你还年轻
    Betacoefficient
        9
    Betacoefficient  
       2017-07-23 16:03:21 +08:00
    楼主你没有疯真是一个奇迹。
    k9982874
        10
    k9982874  
       2017-07-23 16:27:30 +08:00 via iPad
    之前我也为这事头疼,做了规范不执行,问为啥不按规范写?对面吊吊的来一句我觉得我的代码风格更好。特别是培训班出来的小屁孩。

    现在简单多了 c/c++就直接摔他一脸 google 规范
    python 就摔 pep8
    php 就摔 psr4
    jls 摔 jls

    外加格式化工具,有意见和标准委员会说去。

    最后加一句 你是 xx 程序员连代码规范都不知道,呵呵。
    boyhailong
        11
    boyhailong  
       2017-07-23 16:33:21 +08:00   1
    建议小组讨论大家一起遵守即可
    RLib
        12
    RLib  
       2017-07-23 16:41:23 +08:00
    表示不喜欢在括号前后加一空格, 尖括号除外
    pagxir
        13
    pagxir  
       2017-07-23 16:59:24 +08:00 via Android
    @RLib 表示同意。
    misaka20038numbe
        14
    misaka20038numbe  
       2017-07-23 17:48:13 +08:00
    习惯了代码能不空格就不空格,大括号必须和函数在同一行。
    kmahyyg
        15
    kmahyyg  
       2017-07-23 17:53:32 +08:00 via Android
    @feiyuanqiu 用 python 的有啥 format 工具?
    LZRng
        16
    LZRng  
       2017-07-23 18:07:30 +08:00 via iPhone
    有点犯强迫症了吧,你自己的个人项目可以用你自己的代码风格,如果是团队的话,找他们协商一下统一风格适应一下。另外,我并不赞同你的代码风格……看起来是清晰一些(是不是可以用编辑器写 CSS 实现排版效果?),但多两个不必要的字符反而降低效率。
    cxbig
        17
    cxbig  
       2017-07-23 18:09:25 +08:00
    我司用 JetBrains 家的 IDE,代码风格一开始就确定了,配置文件发给大家,提交代码之前一键格式化就可以。
    这种小事处理不好,公司的管理还是有问题的。
    catror
        18
    catror  
       2017-07-23 18:18:43 +08:00 via Android
    不用格式化工具的话,代码风格模块级统一就行,每个人都有自己的风格,而模块一般也就两三个人写和维护。
    另外,去改别人的代码一定要按照别人的风格来,这个都做不到我觉得不是一个合格的程序员。所以我也很讨厌别人把我的代码改得一团糟。
    zhujinliang
        19
    zhujinliang  
       2017-07-23 18:43:34 +08:00 via iPhone
    vscode 挂上 lint,我最近在适应这个组合,感觉还不错的
    leekafai
        20
    leekafai  
       2017-07-23 18:50:16 +08:00 via Android
    除了 python 那种有规定格式的语法语言,感觉别的语言一般都还是会依照 c 艹的格式吧。
    不敢说绝对,自己的感觉,毕竟大部分都是看谭浩强老师的书入的门。
    hantsy
        21
    hantsy  
       2017-07-23 19:06:42 +08:00
    @k9982874 Google 定义了一套各语言的规范,对于 Java, 还提供了 Eclipse 和 IDEA 配置文件。

    @cxbig @zhujinliang 不过嘛,IDE 是个头痛的事,每个人的习惯不一样, 项目没必要去要求所有人都使用一样的 IDE。

    @feiyuanqiu 一般格式化也不是太大问题,即使不同的 IDE,也可以调整到基本统一。但对于有些特殊情况,比如 IDEA 支持 formater off/on 去保留一些 DSL 形式(可读性强)的 代码,不是所有 IDE 都支持。

    @catror 对于一个团队来讲,合作一段时间后,代码应该只有一种风格,就是团队风格, 而代码的 Style 本来就是应该遵循一些公认的约定。

    @misaka20038numbe 各语言都有不同的 Style,写 Java 的时候一般都是习惯 method 与 { 在同一行。 但 PHP 的 PSR (虽然 PSR 完全 Copy JSR 运作方式) 改变了这一行为, { 要求新开一行。https://github.com/hantsy/angularjs-zf2-sample/blob/master/module/Album/src/Album/Model/Album.php


    @fytriht 说到缩进,想到了美剧硅谷中 Tab 和 Space 那一集。我写 Java 认同用 4 Space (我不喜欢 Google Java Style 中的 2 space ) 代替 tab, 以做到所有 IDE 显示统一。
    Jakesoft
        22
    Jakesoft  
       2017-07-23 19:21:58 +08:00 via iPhone
    @k9982874 psr4 不是代码风格规范,psr1、psr2 才是。
    coderluan
        23
    coderluan  
       2017-07-23 19:26:02 +08:00
    楼主去研究下工具格式化吧,都挺成熟的。

    比如你用的 egret,如果是用自带的 vsc 改版编译器,那样直接改个参数就能改大括号位置。
    feiyuanqiu
        24
    feiyuanqiu  
       2017-07-23 19:38:14 +08:00
    @hantsy google 选择 2 空格缩进是因为他们规定了行宽 80 的限制,缩进占用多了的话会导致代码很多折行
    他们还建议少留空行,这样一屏幕能显示多一点代码...怎么感觉那群人都是用 vim 的...
    shiroming
        25
    shiroming  
       2017-07-23 19:48:48 +08:00 via Android   1
    @kmahyyg pycharm 默认就够了 ctrl+alt+L
    LioMore
        26
    LioMore  
       2017-07-23 20:45:42 +08:00
    代码规范很多,可以自己选一个

    @changnet 楼主提到了 Javascript

    Javascript 有 Javascript Standard Style ( https://standardjs.com/)、XO ( https://github.com/sindresorhus/xo) 等
    cxbig
        27
    cxbig  
       2017-07-23 21:16:48 +08:00
    @hantsy
    我只是说我们公司的情况,这不是核心问题。
    拿 PHP 来说,有 php-cs-fixer 这类的命令行工具,无论用什么 Editor 或 IDE 都行。其他语言多少也都有。

    关键的是执行。如果公司不注重,不严格执行代码审查,或各种 CI 工具的自动代码检测,那么抱怨就没有意义。
    底下的人你不服我、我不服你,上头再没个标准,只会越来越乱。
    lusyoe
        28
    lusyoe  
       2017-07-23 21:36:31 +08:00
    我觉得这东西公司内必须要统一个标准,这个通用的模板最好交给 QA 去做。然后让各项目组的 PM 推下去,开发人员遵守就是了。不规范的,在 review 的时候打回去就好啦,说到底规范是一回事,监督和执行才是关键的。。
    wangxn
        29
    wangxn  
       2017-07-23 23:00:25 +08:00 via Android
    @feiyuanqiu Google 规定的行宽是 100 还是 128 来着,反正不是 80。
    wangxn
        30
    wangxn  
       2017-07-23 23:00:45 +08:00 via Android
    100 或者 120。
    feiyuanqiu
        31
    feiyuanqiu  
       2017-07-23 23:13:25 +08:00 via Android
    @wangxn 嗯 java 是 100,c++是 80
    Tovcn
        32
    Tovcn  
       2017-07-24 01:05:36 +08:00 via Android
    目前在写一个代码格式化项目,支持 C 和 C++
    FrankFang128
        33
    FrankFang128  
       2017-07-24 01:07:54 +08:00
    你不用自动格式化工具吗?
    bumz
        34
    bumz  
       2017-07-24 06:08:31 +08:00
    别人是 `void Player:SendPosition(int x, int y);`
    你是 `void Player:SendPosition( int x,int y ); `
    araraloren
        35
    araraloren  
       2017-07-24 08:34:50 +08:00
    @Tovcn 格式化工具不是很多吗,用 clang-format 不就好了。。
    woshixiaohao1982
        36
    woshixiaohao1982  
       2017-07-24 08:39:58 +08:00
    @lusyoe 这玩意还要 QA 格式化工具就搞定了
    woshixiaohao1982
        37
    woshixiaohao1982  
       2017-07-24 08:40:50 +08:00
    搞这些形式主义都是扯淡,,一套 lint 格式化规则才是重点
    allenx
        38
    allenx  
       2017-07-24 09:58:18 +08:00
    你这种写法不符合英文习惯,void init(int x, int y);,括号后面不该加空格,逗号句号等后面才应该加空格。
    jianyunet
        39
    jianyunet  
       2017-07-24 10:17:30 +08:00
    l00t
        40
    l00t  
       2017-07-24 10:45:09 +08:00   1
    多大点事。

    工作这么些年来,见过的代码也多了,我觉得所谓代码规范中,排版是最不重要的。大括号跟在后面还是另起一行,这有什么影响吗?代码规范应当是规定一些更实际的内容。比如某些功能应当怎么写,某些操作要不要做保护,某些值要不要做校验,在什么地方校验。这类约定做好了能减少大量协作沟通时间。排版只是细枝末节而已,正常人又不会一行流,无非有各自偏好罢了。
    fds
        41
    fds  
       2017-07-24 10:48:46 +08:00
    用 vscode 写 ts,自动排版基本不用操心。当然还是会遇到单行过长的问题,lint 报错,需要手动换行的。
    wizardoz
        42
    wizardoz  
       2017-07-24 11:07:51 +08:00
    强迫症,你觉得看着别人写的代码跟你风格不统一觉得心里不舒服。但是如果你要求别人全部统一到一种代码风格,有人不认同那种风格的时候他心里更难受。
    特别是多种语言混用的时候,每种语言甚至一个框架都有自己官方认可的一种编程风格。
    本人喜欢在用一种框架的时候就用那种框架使用的编程风格。有时一个项目中我会用两三种。
    hellojl
        43
    hellojl  
       2017-07-24 11:17:14 +08:00
    现在想想,百度内部的解决方案还是不错的,提交之前会有统一的代码风格检查,多一个空格都可能提不上去。现在的公司没有这些规范,代码库还超级大,里面可以说是群魔乱舞了
    bluefalconjun
        44
    bluefalconjun  
       2017-07-24 11:34:39 +08:00
    4 intent 120 其他无所谓...
    gizie
        45
    gizie  
       2017-07-24 11:34:47 +08:00
    看 Google 代码规范。
    其实你的风格也不咋地
    geew
        46
    geew  
       2017-07-24 11:37:19 +08:00
    用 pycharm 之后 强迫症的我看到代码里有波浪线就受不了...
    blogbbs325
        47
    blogbbs325  
       2017-07-24 11:40:31 +08:00
    js 的话用 https://prettier.github.io/prettier/
    自动帮你格式化源码,大家按自己的习惯写,git commit 的时候通过 hook 用 prettier 转换一下
    qcind
        48
    qcind  
       2017-07-24 11:41:27 +08:00
    后生仔,强迫症。
    Felldeadbird
        49
    Felldeadbird  
       2017-07-24 11:54:30 +08:00
    任何代码风格在我的编辑器格式化工具下都是浮云。
    楼主应该合适使用 py 这类语言
    66beta
        50
    66beta  
       2017-07-24 11:57:16 +08:00
    扯这么多没用啊,关键要大家愿意统一一种风格,下次改动什么文件就一起格式化到新的风格
    caiych
        51
    caiych  
       2017-07-24 12:59:14 +08:00
    @wangxn Java 是 100 Go 是无限 其他是 80
    rainex
        52
    rainex  
       2017-07-24 13:37:04 +08:00
    楼主你自己的“喜欢在函数的括号前后加一空格”,这在别人眼里何尝不是一个怪癖?

    统一代码风格需要团队头儿的要求,想推行自己的观点,需要你有发言权甚至决策权力。

    不过等你负责团队了,就怕你的下属又跑 v2 来发帖说强制括号前后都加空格,怪癖真恶心= =
    vjnjc
        53
    vjnjc  
       2017-07-24 13:41:35 +08:00
    这时候不是应该根据代码附近的风格为参照么
    kneep
        54
    kneep  
       2017-07-24 14:32:26 +08:00 via iPhone
    你这加空格就属于异端,不知道别人怎么看你,呵呵
    bombless
        55
    bombless  
       2017-07-24 14:37:13 +08:00
    仅针对你说的在函数的括号前后加一空格这一点我倒是觉得有点新奇,通常是逗号后面有空格,没见过括号后面有的。 +1

    commit 钩子里做 lint,大家全部用格式化工具格式化提交就好了
    旧代码做一个巨大的 commit 把所有代码都格式化

    C++代码和 Lua 代码风格不一样是正常的,一样就奇葩了
    dreamwar
        56
    dreamwar  
       2017-07-24 14:37:59 +08:00
    感觉还是看学的时候接触的代码都什么风格...
    很多人都是被教的人或者带的人给带跑偏了
    marvinwilliam
        57
    marvinwilliam  
       2017-07-24 15:04:41 +08:00
    editorconfig 让编辑器自己去玩吧....
    sirqiao
        58
    sirqiao  
       2017-07-24 15:24:25 +08:00
    可以考虑实现一个 parser,然后再按自己的习惯把 ast 吐成自己习惯的格式。。。
    yanxijian
        59
    yanxijian  
       2017-07-24 16:18:48 +08:00
    @Technetiumer +1,括号两边有空格感觉好奇怪
    sampeng
        60
    sampeng  
       2017-07-24 17:02:46 +08:00
    代码风格。。谁有拳头,谁说了算。
    反正我拿到任何文件都是 ide 自动 format 文件格式。。。
    rocksolid
        61
    rocksolid  
       2017-07-24 17:07:32 +08:00
    团队能遵守约定的那就统一,不行的话就自动
    darklowly
        62
    darklowly  
       2017-07-24 19:07:51 +08:00
    楼主还是太死板。

    1 代码风格是团队的。
    2 不要坚持一种代码风格,在不同语言,不同项目下,要遵守该语言,该项目的风格。

    例如 C 语言函数声明有 4 种:
    c: void fuck_you(void)
    c: void fuckYou(void)
    c: void 换行 fuck_you(void)
    c: void 换行 fuckYou(void)
    这是同一种语言下,不同项目的约定。

    同样的,不同语言,也有不同的社区约定。
    TIGERB
        63
    TIGERB  
       2017-07-24 19:37:37 +08:00
    还是 GO 牛逼,哈哈,语言级别直接可以统一风格,哈哈~
    ech0x
        64
    ech0x  
       2017-07-24 20:14:34 +08:00 via iPhone
    @TIGERB 我记得 go 格式化的工具是自带的是吧
    TIGERB
        65
    TIGERB  
       2017-07-24 20:19:05 +08:00
    @ech0x 嗯嗯,是啊,自己就提供了代码格式化工具
    Cbdy
        66
    Cbdy  
       2017-07-24 20:40:21 +08:00 via Android
    我写 c 的时候用 kr 风格,但是空格四格缩进
    java、pyhon 没啥争议,随大流
    js 模块名连字符,变量小驼峰,类大驼峰,不加分号
    当然,团队协作的时候会加 lint
    quinoa42
        67
    quinoa42  
       2017-07-25 09:11:18 +08:00
    我现在写 C/C#也把{写在同一行了
    iRiven
        68
    iRiven  
       2017-07-25 11:22:14 +08:00 via Android
    真羡慕你们能看到空格的,我已经块看不见空格了 好方
    caniuse
        69
    caniuse  
       2017-07-25 12:11:14 +08:00
    喜欢 go 的代码风格,写 php c js 全部用 go 代码风格
    zh5e
        70
    zh5e  
       2017-07-25 13:23:11 +08:00
    用 astyle 工具,相同参数来统一编码风格 - -
    leo937549163
        71
    leo937549163  
       2017-07-25 14:22:37 +08:00 via Android
    js...@flow
    429463267
        72
    429463267  
       2018-09-22 18:14:04 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5210 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 66ms UTC 05:48 PVG 13:48 LAX 21:48 JFK 00:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86