优秀码风的成长史

P.S. 更友好的地址:https://xiao-s.gitee.io/blog

一个代码的可读性,很大一部分,取决于它的码风
这篇文章,可以带你了解——一个优秀码风的成长史


1:头文件+大括号+缩进+if&for

对于下面一个程序:

1
2
3
4
5
#include<cstdio>
int main()
{
return 0;
}

是一个不错的码风
简单分析:

头文件 -> 不空格 -> 简洁 -> 完美
大括号 -> 换行 -> 完美

然而对于下面的程序:

1
2
3
4
#include <cstdio>
int main(){
return 0;
}

也是可以的
简单分析:

头文件 -> 空格 -> 简洁 -> 完美
大括号 -> 不换行 -> 完美

有时候,你会看到这样的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <cstdio>
#include <iostream>
#include <stack>
#include <algorithm>
//省略10个不必要头文件
int main()
{
int a,b;
a=3;
b=2;
if(b==2)
{
printf("%d",a);
}
return 0;
}

就是一个很丑的码风了。
简单分析:

头文件 -> 空格 -> 不简洁 -> 欠佳
大括号 -> 换行+缩进 -> 欠佳
缩进 -> 不正确缩进 -> 欠佳
if判断&for循环 -> 一句话不使用大括号 -> 欠佳

修改一下:

1
2
3
4
5
6
7
8
#include <cstdio>//只用需要的
int main(){//大括号不换行,压缩代码行
int a,b;
a=3;
b=2;
if(b==2) printf("%d",a);//一句话放在一行,也可以方便对比,还可以压缩代码行
return 0;
}

2:断行+对比形式if&switch

考虑以下语句:

1
int ans = ( abs(top) + time ) > ( abs(bottom) - time ) ? top - bottom : bottom + top;

我们可以把这个很长的语句换个行,换成:

1
2
int ans = ( abs(top) + time ) > ( abs(bottom) - time ) ? 
top - bottom : bottom + top;

即使把代码行加长,也没关系的。
或者,还可以这么做:

1
2
if( ( abs(top) + time ) > ( abs(bottom) - time ) )  ans = top - bottom;
else ans = bottom + top;

对于很长的表达式,用?:虽然压缩了代码行,但是可读性没有if要好。
那么,对于以下语句:

1
2
3
4
if (a == b) 
ans = 1;
else
ans = 2;

if的表达式较短,且没有嵌套或者大量的判断,我们可以直接使用?:运算符。

1
ans = a == b ? 1:0;

或者:

1
2
if (a == b)     ans = 1;
else ans = 2;

比switch有更好的对比性。
那么,对于以下的switch:

1
2
3
switch(ans)
case 1: flag = 1;break;
case 2: flag = 2;break;

也有很强的对比性,也可以使用switch或者if,这里随性就好了。
如果你的switch不打算放break;是因为有其他目的,用if层次会更加清晰。


3:变量名&定义

考虑以下代码:

1
2
3
4
5
//TODO : 计算a*b的结果
int a,b,ans;
//省略输入等
ans = a * b;
printf("%d",ans);

首先,对多变量进行int固然可行,但是如果我们要给他们加上注释,还是分开来比较好。(如果不需要注释也可以忽略)

1
2
3
int a;//因数1
int b;//因数2
int ans;//结果

会更加一目了然,避免在更多变量的情况下读不懂程序。
对比ans = a * b;printf("%d",a*b)来说
如果不是很长的程序,首选第二种;
如果程序较长,可以用第一种,或者把第二种加上注释
总的来说,用第二种是比较好的
再次考虑以下变量的定义:

1
int a, b, c, d;

不能一眼看出用处。

1
int num, factor, index, length;

会好一些

1
2
3
4
5
6
7
8
// 要计算的数值
int num;
// 表示影响因子
int factor;
// 元素所在的索引号
int index;
// 数据列表的总长
int length;

或者

1
2
3
4
int num, // 要计算的数值
factor, // 表示影响因子
index, // 元素所在的索引号
length; // 数据列表的总长

就更好了


4: 空格与空行

考虑以下代码:

1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
#define MyMax(a,b) a > b? 1:0
int main()
{
return 0;
}

会给人一种拥挤的感觉。
适当地添加空行和注释则是一个非常有效的代码整理方式——有点像文章中的分段,一段意思也许需要若干个句子才能表达清楚,在表达下一段意思之前,应当另起一段。
修改后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//头文件
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>

//命名空间
using namespace std;

//def块
#define MyMax(a,b) a > b? 1:0

//主函数
int main()
{
return 0;
}

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:细节问题

对于什么注释、压行之类的细节但也很重要的问题,这里不会多讲。请大家看看这个帖子,讲的很不错,这个也很好


致谢:感谢您看完这个蒟蒻写的东东!

猜你喜欢

转载自www.cnblogs.com/xiao-l-xiao-s/p/CodeStyle.html
今日推荐