2008年11月24日星期一

高质量编程II——程序书法

写好的程序,就像写一个好书法。写字追求一个韵味;书法却讲求简洁高效
程序书法为的就是:让看你程序的人,能看懂,乐于看。

程序书法涉及以下几个方面:
1、空格。
2、空行和代码行。
3、对齐。
4、长行拆分。
5、修饰符位置——避免误解。
6、注释。
7、类的结构。
8、命名规则。
下面逐个进行学习分析。

一、空行与代码行。
空行起着分隔程序段落的作用。因此,合理利用空行,能够让程序结构清晰。
【规则2-1-1】在每个类声明之后、每个函数定义结束之后都要加空行。
【规则2-1-2】在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
简而言之,当一个比较完整的个体开始/完成的时候,最好添加空行分割开来。

代码行:
【规则2-1-3】一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
【规则2-1-4】if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。
【建议】尽可能在定义变量的同时初始化该变量(就近原则)。
int width = 10; // 定义并初绐化width
int height = 10; // 定义并初绐化height
int depth = 10; // 定义并初绐化depth

x = a + b;
y = c + d;
z = e + f;

if (width < height)
{
dosomething();
}

for (initialization; condition; update)
{
dosomething();
}
// 空行
other();

示例 风格良好的代码行

二、空格
【规则2-2-1】关键字之后要留空格。象const、virtual、inline、case 等关键字之后至少要留一个空格,否则无法辨析关键字。象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。——突出关键字。
【规则2-2-2】函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。
【规则2-2-3】‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。
【规则2-2-4】‘,’之后要留空格,如Function(x, y, z)。如果‘;’不是一行的结束符号,其后要留空格,如for (initialization; condition; update)。
【规则2-2-5】赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=” “>=”、“<=”、“+”、“*”、“%”、“&&”、“”、“<<”,“^”等二元操作符的前后应当加空格
【规则2-2-6】一元操作符如“!”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格。
【规则2-2-7】象“[]”、“.”、“->”这类操作符前后不加空格。
【建议】对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格。
for (i=0; i<10; i++)和if ((a<=b) && (c<=d))

三、对齐
【规则2-3-1】程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。
【规则2-3-2】{ }之内的代码块在‘{’右边数格处左对齐。

四、长行拆分
【规则2-4-1】代码行最大长度宜控制在70至80个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。
【规则2-4-2】长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
if ((very_longer_variable1 >= very_longer_variable12)
&& (very_longer_variable3 <= very_longer_variable14)
&& (very_longer_variable5 <= very_longer_variable16))
{
dosomething();
}

五、修饰符位置
修饰符 * 和 & 应该靠近数据类型还是该靠近变量名,是个有争议的活题。
若将修饰符 * 靠近数据类型,例如:int* x; 从语义上讲此写法比较直观,即x是int 类型的指针。
上述写法的弊端是容易引起误解,例如:int* x, y; 此处y容易被误解为指针变量。虽然将x和y分行定义可以避免误解,但并不是人人都愿意这样做。

【规则2-5-1】应当将修饰符 * 和 & 紧靠变量名
例如:
char *name;
int *x, y; // 此处y不会被误解为指针

六、注释
C++语言中,程序块的注释常采用“/*…*/”,行注释一般采用“//…”。注释通常用于:
(1)版本、版权声明;
(2)函数接口说明;
(3)重要的代码行或段落提示。
虽然注释有助于理解代码,但注意不可过多地使用注释。

【规则2-6-1】边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
【规则2-6-2】注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。

七、类的版式
类可以将数据和函数封装在一起,其中函数表示了类的行为(或称服务)。
类提供关键字public、protected和private,分别用于声明哪些数据和函数是公有的、受保护的或者是私有的。这样可以达到信息隐藏的目的,即让类仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。
类的版式主要有两种方式:
(1)将private类型的数据写在前面,而将public类型的函数写在后面,如示例8-3(a)。采用这种版式的程序员主张类的设计“以数据为中心”,重点关注类的内部结构。
(2)将public类型的函数写在前面,而将private类型的数据写在后面,如示例8.3(b)采用这种版式的程序员主张类的设计“以行为为中心”,重点关注的是类应该提供什么样的接口(或服务)。
建议采用“以行为为中心”的书写方式,即首先考虑类应该提供什么样的函数。这是很多人的经验——“这样做不仅让自己在设计类时思路清晰,而且方便别人阅读。因为用户最关心的是接口,谁愿意先看到一堆私有数据成员!”

八、命名规则
(一)共性规则
【规则2-8-1】标识符应当直观且可以拼读,可望文知意,不必进行“解码”。切忌使用汉语拼音来命名。
【规则2-8-2】标识符的长度应当符合“min-length && max-information”原则。——适度把握,区别就行。
【规则2-8-3】命名规则尽量与所采用的操作系统或开发工具的风格保持一致。
Windows应用程序的标识符通常采用“大小写”混排的方式,如AddChild。
Unix应用程序的标识符通常采用“小写加下划线”的方式,如add_child。
别把这两类风格混在一起用。
【规则2-8-4】程序中不要出现仅靠大小写区分的相似的标识符。
【规则2-8-5】程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。
【规则2-8-6】变量的名字应当使用“名词”或者“形容词+名词”。float newValue;
【规则2-8-7】全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。
例如:
DrawBox(); // 全局函数
box->Draw(); // 类的成员函数
【规则2-8-8】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
【建议】尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。
(二)Windows下命名规则:
【规则2-8-9】类名和函数名用大写字母开头的单词组合而成。
【规则2-8-10】变量和参数用小写字母开头的单词组合而成。
【规则2-8-11】常量全用大写的字母,用下划线分割单词。
【规则2-8-12】静态变量加前缀s_(表示static)。
【规则2-8-13】如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。
【规则2-8-14】类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。
void Object::SetValue(int width, int height)
{
m_width = width;
m_height = height;
}
【规则2-8-15】为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图形标准OpenGL的所有库函数均以gl开头,所有常量(或宏定义)均以GL开头。

2008年11月22日星期六

Ubuntu下geany 配置

Get geany in website.

then write the first C++ program,but mostly you can't run it ritht now.

1、geany依赖于gcc and g++,他们是 GNU工程的CC++编译器

gcc
认为预处理后的文件(.i)C文件,并且设定C形式的连接.
g++
认为预处理后的文件(.i)C++文件,并且设定C++形式的连接.

刚装好的GCC什么都不能编译,因为没有一些必须的头文件,所以要安装build-essential,安装了这个包会安装上g++,libc6-dev,linux-libc-dev,libstdc++6-4.1-dev等好多必须的软件和头文件。
代码:
sudo apt-get install build-essential

2. gtk

安装GTK环境只要安装一个gnome-core-devel就可以了,里面集成了很多其他的包。除此之外还要转一些其他的东西,如libglib2.0 -doc、libgtk2.0-doc帮助文档,devhelp帮助文档查看,glade-gnome、glade-common、glade-doc图 形界面设计等。
代码:
sudo apt-get install gnome-devel——用此命令足矣。
sudo apt-get install gnome-core-devel
sudo apt-get install libglib2.0-doc libgtk2.0-doc
sudo apt-get install devhelp
sudo apt-get install glade-gnome glade-common glade-doc

在此配置基础上,已经可以在ubuntu上面运行geany的程序。
问题:
虚拟终端无法连接:
是因为文件夹没有创建或者说生成,因此不用点击编译,直接点生成,然后在执行即可。
至此,Linux下C++编程环境已经搞定。

目前网上有人推荐code block,一个好处就是可以夸平台运行:既可在windows,也可在Linux。有兴趣的话,可以尝试一下。