综述

优秀的代码风格如同一身得体的打扮,能够给人以良好的印象。初学程序设计,首先必须建立良好的编程习惯,这其中就包括代码风格。本文就代码风格中的几个重点问题进行了讨论,并在文后给出了一份优秀的代码作为风格模板。代码风格不必花费太多专门的时间研究,在使用中不断模仿模板代码,轻轻松松就能写出“专业的代码”。

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 < fvalue < 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
2
3
4
5
6
7

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; /* 注意再次折行后的缩进 */
}

显然这个段代码没有任何实际用处,只是为了说明折行缩进而编造的。

无处不在的空格,无处不在的空行

需要空格的位置有:

  • if、while、switch等关键字与之后的左括号(之间。
  • 左花括号{之前。
  • 双目运算符两侧,例如p == NULL。
  • 逗号,与分号;之后,例如for (i = 0; i < 10; i++)。

不要空格的位置有:

  • 函数名与之后的左括号(,包括带参数的宏与之后的左括号(,例如max(a, b)。
  • 分号;与冒号:之前。
  • 左括号(右边,右括号)左边,例如if (p == NULL)。

需要空行的位置有:

  • 函数的定义之前、函数的定义之后
  • 一组联系紧密的代码段之前和之后

这些规则并不完全,当你碰到上面没有列举出来的情况时,请参考本文提供的模板代码。

左花括号的争议──换行乎?不换乎?

这又是一个仁者见仁智者见智的问题了。从使代码更清晰的角度看,作为代码段开头标识的左花括号{应该另起一行:

if (p == NULL) {printf("error!\n");exit(0); }
1
2
3
4
5

if (p == NULL)
{
        printf("error!\n");
        exit(0);
}

可是,这看起来实在不够紧凑,所以大部分的C代码(至少Unix上如此)都采用了这样的方式:

if (p == NULL) {printf("error!\n");exit(0); }
1
2
3
4

if (p == NULL) {
        printf("error!\n");
        exit(0);
}

我的建议是采用后者,这会使你的代码显得更加紧凑,也更加专业。需要说明一个特例,在定义函数时,我们总是要给左花括号 { 换行:

static int maxint(int a, int b) {return a > b ? a : b; }
1
2
3
4

static int maxint(int a, int b)
{
        return a > b ? a : b;
}

额,不过我还是不太习惯额

总结

本文介绍了编程的代码风格,希望对大家有帮助

本文内容为转载,原文出处

转载请注明:静觅 » 良好的代码风格养成记

良好的代码风格养成记相关推荐

  1. python两行数据相加_python高手养成记08:教你快速写出自己的python程序

    上一篇:python高手养成记07:操作excel的4种神器 题序 前面的文章,很重要,很重要,很重要,重要的事说三遍,看完前面的文章,这个时候我们就可以开始学习,怎么样去写出自己的一个python程 ...

  2. FPGA之道(1)HDL代码风格

    文章目录 前言 代码风格 具体的代码风格 我的总结 前言 这个2020年是多灾多难的一年,作为被困在家无所事事的普通老百姓我来说,憋得实在难受,想想在学校的过去时间是如此之珍贵,此刻如此虚度,甚是愧疚 ...

  3. AngularJS之代码风格36条建议【一】(九)

    前言 其实在新学一门知识时,我们应该注意下怎么书写代码更加规范,从开始就注意养成一个良好的习惯无论是对于bug的查找还是走人后别人熟悉代码都是非常好的,利人利己的事情何乐而不为呢,关于AngularJ ...

  4. Python 代码风格指南谷歌版

    非常感谢我们的忠实读者 shendeguize,在后台留言告诉我,已经翻译了<谷歌Python代码风格指南> ,大家这样相互帮助,感觉真是太好. Update: 2020.01.31 Tr ...

  5. 2016级算法第六次上机-D.AlvinZH的学霸养成记V

    1081 AlvinZH的学霸养成记V 思路 中等题,计算几何. 这是一个排序问题,按极角排序.可以转化为叉积的应用,对于点A和B,通过叉积可以判断角度大小,共线时再判断距离. 叉积的应用.OA × ...

  6. 大括弧之战 代码风格

    伟大的大括弧之战已经持续了多年,开发人员们仍然在毫不让步地争吵着大括弧在代码中应该摆放的位置.在多人的项目组里,每个人都给别人的代码重新排版是件很糟糕的事情,版本记录里大量的无用格式变化淹没了重要的有 ...

  7. 2016级算法第五次上机-E.AlvinZH的学霸养成记IV

    1039 AlvinZH的学霸养成记IV 思路 难题,最大二分图匹配. 难点在于如何转化问题,n对n,一个只能攻击一个,判断是否存在一种攻击方案我方不死团灭对方.可以想到把所有随从看作点,对于可攻击的 ...

  8. 金庸笔下的良好代码风格

    作者: 王路  发布时间: 2014-03-23 14:00  阅读: 12493 次  推荐: 64   原文链接 [收藏] 我零九年看过一本小说,讲程序员的故事,从此,了解了一个新物种.最近又看& ...

  9. 【python初学者日记】selenium初体验——“秒杀商品”、“清空购物车”技能养成记(一)

    [python初学者日记]selenium初体验--"秒杀商品"."清空购物车"技能养成记(一) 用python解决"清空购物车".&quo ...

最新文章

  1. 目标检测回归损失函数简介:SmoothL1/IoU/GIoU/DIoU/CIoU Loss
  2. 模型树——就是回归树的分段常数预测修改为线性回归 对于非线性回归有较好的预测效果...
  3. html js json数据解析后台数据包_如何将html解析为有关联的json数据?htmlparser2模块使用详解...
  4. SAP S/4 HANA新变化-FI数据模型
  5. qt关于添加模块的说明
  6. [CODE FESTIVAL 2016]Distance Pairs
  7. linux 中网卡配置命令 ifconfig简介
  8. stm32的串口DMA空闲中断接收不等长数据,stm32F1的usart1-DMA-IDLE收发
  9. VB6的后期绑定和前期绑定
  10. HighCharts:设置饼图不可点击选择
  11. [转]抢先Mark!微信公众平台开发进阶篇资源集锦
  12. bootmgr快速修复win7_【win7共享软件下载】win7共享软件(局域网共享)下载 v7.2.8 免费版...
  13. 英语12个月份的英文和缩写
  14. 数据库的方向 - 行vs列
  15. 4G,64bit,PAE
  16. Mac如何通过远程控制其他Mac
  17. 软件项目管理经验总结
  18. linux内核源码—编程之路
  19. 姚期智是计算机领域的科学家吗,他是顶级计算机专家,清华最受欢迎教授,在国际上与杨振宁齐名...
  20. 如何校验 email 地址以提高邮件送达率

热门文章

  1. 马克思关于劳动的八大金句
  2. 回归、分类与聚类:三大方向剖解机器学习算法的优缺点
  3. 学生创客 开公司造3D打印机
  4. Java - 死锁 Dead Lock 定位分析
  5. Qt 设置窗口背景图片的几种方法
  6. Halcon算子知识:optical_flow_mg
  7. python 3.0 print_Python 3.x 新特性及10大变化
  8. 如何看exe文件源代码_杀进程、删文件...看新型勒索软件RobbinHood如何干掉杀毒软件...
  9. 调用接口的方法 java_java调用接口的方法
  10. 多类感知器算法题目_先进算法讲解