P.S. 更友好的地址:https://xiao-s.gitee.io/blog
一个代码的可读性,很大一部分,取决于它的码风
这篇文章,可以带你了解——一个优秀码风的成长史
1:头文件+大括号+缩进+if&for
对于下面一个程序:
1 |
|
是一个不错的码风
简单分析:
头文件 -> 不空格 -> 简洁 -> 完美
大括号 -> 换行 -> 完美
然而对于下面的程序:
1 |
|
也是可以的
简单分析:
头文件 -> 空格 -> 简洁 -> 完美
大括号 -> 不换行 -> 完美
有时候,你会看到这样的代码:
1 |
|
就是一个很丑的码风了。
简单分析:
头文件 -> 空格 -> 不简洁 -> 欠佳
大括号 -> 换行+缩进 -> 欠佳
缩进 -> 不正确缩进 -> 欠佳
if判断&for循环 -> 一句话不使用大括号 -> 欠佳
修改一下:
1 |
|
2:断行+对比形式if&switch
考虑以下语句:
1 |
int ans = ( abs(top) + time ) > ( abs(bottom) - time ) ? top - bottom : bottom + top; |
我们可以把这个很长的语句换个行,换成:
1 |
int ans = ( abs(top) + time ) > ( abs(bottom) - time ) ? |
即使把代码行加长,也没关系的。
或者,还可以这么做:
1 |
if( ( abs(top) + time ) > ( abs(bottom) - time ) ) ans = top - bottom; |
对于很长的表达式,用?:虽然压缩了代码行,但是可读性没有if要好。
那么,对于以下语句:
1 |
if (a == b) |
if的表达式较短,且没有嵌套或者大量的判断,我们可以直接使用?:运算符。
1 |
ans = a == b ? 1:0; |
或者:
1 |
if (a == b) ans = 1; |
比switch有更好的对比性。
那么,对于以下的switch:
1 |
switch(ans) |
也有很强的对比性,也可以使用switch或者if,这里随性就好了。
如果你的switch不打算放break;是因为有其他目的,用if层次会更加清晰。
3:变量名&定义
考虑以下代码:
1 |
//TODO : 计算a*b的结果 |
首先,对多变量进行int固然可行,但是如果我们要给他们加上注释,还是分开来比较好。(如果不需要注释也可以忽略)
1 |
int a;//因数1 |
会更加一目了然,避免在更多变量的情况下读不懂程序。
对比ans = a * b;
和printf("%d",a*b)
来说
如果不是很长的程序,首选第二种;
如果程序较长,可以用第一种,或者把第二种加上注释
总的来说,用第二种是比较好的
再次考虑以下变量的定义:
1 |
int a, b, c, d; |
不能一眼看出用处。
1 |
int num, factor, index, length; |
会好一些
1 |
// 要计算的数值 |
或者
1 |
int num, // 要计算的数值 |
就更好了
4: 空格与空行
考虑以下代码:
1 |
|
会给人一种拥挤的感觉。
适当地添加空行和注释则是一个非常有效的代码整理方式——有点像文章中的分段,一段意思也许需要若干个句子才能表达清楚,在表达下一段意思之前,应当另起一段。
修改后:
1 |
//头文件 |
Visual Basic保留着Basic的句法简单、多用完整英文单词、贴近自然语序的习惯(如And、Not、Inherits、Implements、Handles等等关键字);而Delphi更是延续着Pascal语言那标志性的BEGIN-END作风。
C语言由于在操作系统开发上取得了成功,使得它在软件开发历史上占据了绝对的优势
相比而言,它的语法更加具有影响力,广泛被C++、Java、C#,乃至用于编写网页的ECMAScript/JavaScript和Flash的脚本语言ActionScript所吸纳,因此也变化丰富。
但是它那种善用符号的古老特色一直被保留了下来,有理由相信,C语言是使用符号最多的语言。当其他语法体系都采用AND、OR等关键字作为运算符时,C语言却使用了“&&”、“||”这样的符号,虽然在语法上并没有增加任
何复杂性,但各种奇形怪状难以记忆的符号还是会令初学者望而却步。让我们来比较一下下面的几行代码:
1 |
BASIC: If a>b And c<>d Or Not e>f Then ... |
1 |
PASCAL: If (a>b) And (c<>d) Or (Not (e>f)) Then ... |
1 |
C: if(a>b&&c!=d||!(e>f)) ... |
这三行的意义是完全相同的,但明显可以让人感觉到清晰程度的差异,Basic和Pascal的代码看上去很容易明白,而C语言的代码却像蚂蚁一般缩成一团。
具体这么修改:
1 |
if ( (a > b) && (c != d) || (!(e > f) ) |
用括号把每个表达式括起来,在运算符的左右加上空格,会变得稍微好一些
5:细节问题
对于什么注释、压行之类的细节但也很重要的问题,这里不会多讲。请大家看看这个帖子,讲的很不错,这个也很好