查看: 6386|回复: 14

程序员之路——关于代码风格(转帖)

  [复制链接]
  • TA的每日心情
    奋斗
    2019-4-25 10:29
  • 签到天数: 724 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-8-23 11:34:04 | 显示全部楼层 |阅读模式
    分享到:
    优秀的代码风格如同一身得体的打扮,能够给人以良好的印象。初学程序设计,首先必须建立良好的编程习惯,这其中就包括代码风格。本文就代码风格中的几个重点问题进行了讨论,并在文后给出了一份优秀的代码作为风格模板。代码风格不必花费太多专门的时间研究,在使用中不断模仿模板代码,轻轻松松就能写出专业的代码
    一、80字符,代码行极限
      无论时空怎么转变,世界怎样改变,一行80字符应始终铭记心间。古老的Unix终端以80列的格式显示文本,为了让源代码与手册具有最佳的可读性,Unix系统始终坚持着80列的传统。80列不多不少,足够写出一行有意义的代码,同时也足够显示在终端屏幕,足够打印在A4纸上。虽然时至今日,我们的屏幕分辨率早已足够高,一行能够显示的内容远超超过80字符,但我们的优秀传统已经形成──几乎所有的Unix/Linux内核源代码以及联机用户手册都严格地遵守着80列极限。如果你正好在使用Windows平台下的Dev C++,你是否有注意到代码编辑框里那条细细的灰色竖线?不错,那正是代码行极限。除了HTML、XML等冗长繁复的标记式语言,几乎所有的语言都需要严格遵守代码行极限,这包括C、C++、Java、C#、Python、PHP等等。不过有时,比如当PHP跟HTML打交道的时候,这个限制是可以暂时放松的。过长的代码行总是不好的,好的代码要始终保持苗条的身材。
    二、Tab还是Space,众说纷纭的缩进方式
      代码离不开缩进,关于缩进主要有两个争论,一个是该用空格(Space)还是用制表符(Tab),另外一个是该用4格缩进还是8格缩进甚至都不是。
      先来谈谈Space与Tab的问题。坚持用Space的程序员会告诉你,如果你从来都不用Tab,那么你的代码放到所有的地方看都是一样的。没错,这是用Space缩进的优点,可惜的是,这是它唯一的优点。代码层次越多,内层代码最前面的缩进便越多,这意味着你需要敲很多很多次空格。即使你能忍受不厌其烦地按空格键直到它坏掉,你也一定会被IDE总是自作聪明地插入一些Tab字符的行为烦恼不已。建议总是使用Tab缩进,因为几乎所有的代码(不仅仅是C代码)都在使用Tab缩进。
      Tab到底是4格还是8格?这是Tab缩进会被某些人诟病的根源。当你写程序时使用的Tab大小与别人读程序时使用的Tab大小不同时,再漂亮的排版也会变得杂乱无章。标准的Tab是8格的,而不幸的是,几乎所有的Windows平台下的IDE,包括Visual Studio、Dev C++,甚至跨平台的Eclipse等,都默认使用4格Tab。我使用的FreeBSD系统的所有的内核源代码都采用8格缩进,所以我一直坚持使用8格缩进。也许你不习惯太大的间距,如果不是在Unix平台下,或者不是C语言,那就采用4格Tab吧。如果你在Unix下编写C代码,使用8格的标准Tab是更好的习惯。
    三、折行原则,容易被忽略的角落
      既然有代码行极限,很多情况下我们不得不断开一个完整的代码行,这就带来了一个问题:折行后应该如何缩进?好的做法是,第一次折行后,在原来缩进的基础上增加1/2的Tab大小的空格,之后的折行全部对齐第二行。可能这样的文字描述过于晦涩了,还是举个例子罢(以8格缩进为例):
    if (value > a && value > b && value > c && value < d && value < e && value < f
        value < h && value < h) { /* 注意折行后的缩进 */
             value = value + 1;
             value = value * value * value * value * value * value * value * value
                 * value * value + value * value * value * value * value * value
                 * value * value; /* 注意再次折行后的缩进 */
    }
      显然这个段代码没有任何实际用处,只是为了说明折行缩进而编造的。
    四、无处不在的空格,无处不在的空行
      需要空格的位置有:
      1)if、while、switch等关键字与之后的左括号(之间。
      2)左花括号{之前。
      3)双目运算符两侧,例如p == NULL。
      4)逗号,与分号;之后,例如for (i = 0; i < 10; i++)。   
      不要空格的位置有:
      1)函数名与之后的左括号(,包括带参数的宏与之后的左括号(,例如max(a, b)。
      2)分号;与冒号:之前。
      3)左括号(右边,右括号)左边,例如if (p == NULL)。
      需要空行的位置有:
      1)函数的定义之前、函数的定义之后
      2)一组联系紧密的代码段之前和之后
      这些规则并不完全,当你碰到上面没有列举出来的情况时,请参考本文提供的模板代码。
    五、左花括号的争议──换行乎?不换乎? 
      这又是一个仁者见仁智者见智的问题了。从使代码更清晰的角度看,作为代码段开头标识的左花括号{应该另起一行:
    if (p == NULL)
    {
            printf("error!\n");
            exit(0);
    }
      可是,这看起来实在不够紧凑,所以大部分的C代码(至少Unix上如此)都采用了这样的方式:
    if (p == NULL) {
            printf("error!\n");
            exit(0);
    }
      我的建议是采用后者,这会使你的代码显得更加紧凑,也更加专业。需要说明一个特例,在定义函数时,我们总是要给左花括号{换行:
    static int
    maxint(int a, int b)
    {
            return a > b ? a : b;
    }
    六、坚持美观、灵活对待
      代码风格远远不止上面提到的五点,事实上,很多公司都有规定的代码风格,包括命名规则、缩进规则等。如果你在一个开发团队中,应该始终以团队的标准为主,而如果你只是在学习C语言并试着形成自己的代码风格,我将在这里给一份最专业的源代码供你参考。你的任何疑问,在这份代码里一定可以找到答案:Code Style(注意查看时将Tab设置为8格)。这份代码来自优秀的FreeBSD操作系统内核源代码(版本6.2),你一定不会置疑它的权威性。更多内容请参考FreeBSD内核代码编写规范,你也许需要一些耐心才能读完这篇英文文档。
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-8-25 12:42
  • 签到天数: 692 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-8-24 13:15:37 | 显示全部楼层
    资料不错,刚发现有这么不错的一个网站
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-6-12 21:59
  • 签到天数: 647 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-8-30 10:21:20 | 显示全部楼层
    有良好的编写程序习惯的确很重要!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-5-28 19:02
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2012-8-30 20:34:04 | 显示全部楼层
    这个新手很需要~要是能够完善完善就更好啦~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-11-4 19:13
  • 签到天数: 281 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2012-8-30 23:56:46 | 显示全部楼层
    不错,还有一个方法是模仿原厂的例程风格,学习的入门就是模仿
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-4-25 10:29
  • 签到天数: 724 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-8-31 17:47:06 | 显示全部楼层
    小鸟愤怒 发表于 2012-8-30 23:56
    不错,还有一个方法是模仿原厂的例程风格,学习的入门就是模仿

    嗯,有同感!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2015-7-11 15:23
  • 签到天数: 567 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-9-9 17:04:09 | 显示全部楼层
    本帖最后由 醉清风 于 2012-9-9 17:05 编辑

    学习学习 ,程序的书写确实很重要,方便自己,也方便别人
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-4-25 10:29
  • 签到天数: 724 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-9-9 19:16:28 | 显示全部楼层
    嗯嗯~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-7-28 09:42
  • 签到天数: 292 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-7-8 18:58:16 | 显示全部楼层
    顶了 好东西啊{:soso_e102:}
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-4-25 10:29
  • 签到天数: 724 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2013-7-19 17:48:13 | 显示全部楼层
    a20084666 发表于 2013-7-8 18:58
    顶了 好东西啊

    呵呵,谢谢赞赏~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-15 09:51 , Processed in 0.210238 second(s), 32 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.