程序代码,首先是给人看的,其次才是用来运行的。
为了提高代码的可读性,我们要时刻保持一些好习惯,今天我来分享2个——
勤于注释,善于封装。
5. 勤于注释
注释,是对代码功能的解释,写好注释,是提高代码可读性的好方法。
不同的编程语言里,注释的格式可能不同,但写注释的好习惯是一样的。
例如,我之前写一个俄罗斯方块的网页,其中一段 JavaScript 代码如下:
var cur_brick = 0; // Current brick;
var cur_hei = 0; // Height of current brick;
var next_hei = 0; // Height of next brick;
看到注释,我们就一目了然,知道每个变量的作用了。
注释尽量用英文,不要出现汉字。因为,汉字在计算机里储存的时候,需要转码和解码,如果转码和解码方式不同,就会出现汉字乱码的情况,例如出现 "锟斤拷" 之类的内容。而英文不会乱码,所以我们尽量写英文。
注释也不要用汉语拼音,因为,有些人可能不太习惯读拼音,而且,汉语里的同音字比较多,只写拼音可能有歧义。
对于一些不会翻译的词汇,我们可以换成其他的方式来表达,只要不写汉字或者拼音就行;
假如说,我不会翻译 "一元二次方程",那我可以写: ax^2 + bx + c = 0, a != 0;
假如我要定义一个解一元二次方程的函数,那我可以这样写:
// Find the values x1, x2 that make ax^2 + bx + c = 0, a != 0;
function GetRoot(a, b, c) {
// TODO...
}
这至少比汉字或者拼音要好。
勤于注释,这是一个好习惯;尤其是写一些复杂的函数,我们应该随手注释。
下方的代码,截取自我写的俄罗斯方块,用于响应键盘按键消息的部分:
var key = (event || window.event).keyCode;
switch(key) {
case(13): // Enter
case(32): // Space
PlayOrPause();
return false;
case(9): // Tab
Turn();
return false;
}
在 switch-case 中,每个 case 都对应一个按键的编号,我在注释里标记了这些按键,大家很容易理解,13 对应回车键,32 对应空格键,9 对应 Tab 键。如果没有这些注释,过了几个月,可能连我自己也忘掉了,每个数字代表什么键了。
6. 善于封装
之前我在讨论 "减少重复" 这个好习惯的时候,提到了封装的概念,现在我们展开讨论。
封装包括两大类:
把相似的过程封装成函数 (function),
或者把相似的数据结构封装成类 (class) 或结构体 (structure)。
在这里我主要说第二类封装,使用类和结构体来实现封装。
比如说,我们要根据长方形的宽和高,计算它的面积,初学者可能会这样写:
// 不要这样写:
double height = 16;
double width = 10;
double GetArea(double hei, double wid) {
return hei * wid;
}
因为 width 和 height 是独立的变量,我们没有把它们绑定起来,于是,当长方形数量很多时,我们可能就忘记了,谁和谁是同一个长方形的宽和高。
正确的做法是,构造一个长方形的类,把 width 和 height 作为它的成员变量,把计算面积的函数作为它的成员函数,从而实现数据的封装:
// 应该这样写:
class Rectangle {
public:
double height;
double width;
Rectangle(double h, double w) {
height = h;
width = w;
}
GetArea() {
return height * width;
}
};
这样的好处是,我们把宽和高绑定起来,每个长方形的宽和高都不会和别的长方形混淆。
有的编程语言不支持使用类,但支持结构体:
struct Rect {
double width;
double height;
};
double GetArea(Rect rect) {
return rect.width * rect.height;
}
使用结构体,只能对数据进行封装,不能把函数写进结构体里,所以它不是很彻底的封装。
对于具体的编程语言,类和结构体的语法规则可能不同,我这里不做具体叙述。
下期预告:
7. 消除隐患;