如何学好软件开发?
写程序、写程序、写程序………………..
不是仅仅写一些“示例”程序,而是写好一个个具有完整功能的“能用”的程序
这将不仅仅涉及到一两个独立的知识点,而是一系列的问题
本章将围绕一个电话本程序展开
本章的学习方法:
大致查看程序结构
调试、调试、调试……
提前预习程序
开始电话本的编写之前,先确定好一些基本的代码编写规范
bool CWinControl::HandleNeeded() { if(m_handle == 0) { if(m_parent != NULL) m_parent->HandleNeeded(); CreateHandle(); } }
bool myclass::fun1(){ if(h==0) { if(pw!=NULL)pw->fun1(); fun2(); } }
左边的代码好看,还是右边的代码好看?
右边的代码没有缩进,行与行之间完全对齐,一团乱麻
左边代码都空了两格
右边代码==和!=两边没有空格,而左边有,让这两个符号很显眼
左边代码类名前,以“C”开头;函数名中每个单词首字母大写;成员数据以m_开头
类、函数、变量的名称命名有意义,如HandleNeeded,是否需要句柄;m_handle即代表句柄
代码的命名规范naming convention包括:
匈牙利命名法、Pascal命名法、Delphi命名法、驼峰命名法、…
个人的代码编写规范:
类命名以CL开头、结构体以SL开头
函数命名通常采用多单词,每个单词首字母大写
数据成员以m_开头
常量大写
代码缩进量:2个字符或4个字符
计算符号左右两边各空一格
函数通常50到70行以内
类通常200到300行以内
一个类包含一个.h文件和.cpp文件,文件名称均为类名
圈复杂度方面(判断节点的个数+1)
该使用常量的地方一定要使用常量,避免使用magic number
word = getAword(……);
if word == “hello”
word = upperCase(word);
…..
file1.c
word = getAword(……);
if word == “hello”
word = lowerCase(word);
…..
file2.c
当读到单词hello时,如果选择了大写按钮,就将hello变成大写,选择小写按钮,就将hello变成小写
客户要求变了,不是hello而是遇到love,怎么办?
本例将改动两个文件中的hello,若文件多了怎么办?
查找替换功能保险吗?gethello函数名、某地方确实要处理hello
直接的办法:使用宏。#define KEYWORD “hello”
只需要修改一句宏即可
也不是太可靠
用宏定义表达式时,要使用完备的括号
#define ADD(a, b) a + b,有问题吗?
计算ADD(a, b) * ADD(c, d)时,将为a+b*c+d
#define ADD(a, b) (a + b)
(a+b)*(c+d),这种形式貌似正确
若define MUL(a, b) (a * b),形式同ADD
计算(a+b)*c,MUL(a+b, c)扩展为a+b*c
#define ADD(a, b) (a)+(b)
(a)+(b)*(c)+(d)
#define ADD(a, b) ((a)+(b))
使用宏时,不允许参数发生变化
#define SQUARE(a) ((a)*(a))
int i = 5;
SQUARE(++i);
用大括号将宏所定义的多条表达式括起来
#define SET(l, w, h) \
l = 0; \
w = 0; \
h = 0;
for(int i = 0; i < 100; i++)
SET(a[i].l, a[i].w, a[i].h);
尽量不要使用宏,而应用const、inline函数等
在调试程序时,看不见宏的名称,而用const的变量则可以
inline函数在调用处会展开,同宏类似,比一般函数调用高效,但又比宏安全
代码2.1
为什么带const的能编译通过,而不带const就不能编译通过
因为const 告知这是一个静态的局部变量,就是多次重复定义也没有事情的。
什么是编译单元
当一个c或cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有 必要信息的单个源文件,这个源文件就是一个编译单元。这个编译单元会被编译成为一个与cpp 文件名同名的目标文件(.o或是.obj)
。连接程序把不同编译单元中产生的符号联系起来,构成一个可执行程序。
如何才能防止重定义
还可以加上extern int i = 0;
来告知这是一个全局变量,再次重复定义的时候就会在连接的时候变成引用(我想)也可以避免重定义错误