程序员修养的要点速记

马上要找工作了,话说找工作的三大法宝:程序设计、算法、操作系统。这玩意短时间不能提高太多了,先从自我修养谈起吧。修养应该是在日常生活中积累的,但是先记住法则吧。

1.版权和版本 函数注释

学生时代写程序,谁会傻呵呵地写个版权啊。写个注释,你有病啊。话说高水平的linux程序员连文档都不写。我说我不功利,还是算了吧,孩子。进入社会,要成熟些的.

文件描述:

文件名 文件描述 版权 版本号 日期 修改记录

函数描述:

函数名 函数描述 参数 返回值 作者 日期

2.缩进、空格、换行、空行、对齐

所有说的这些,应该只有一个目的,让你的程序的外表清爽,整洁。

3.程序注释

这个应该不需多说,老师不厌其烦地说,但我们就是懒呀。以后可能就是专业运动员了,好好遵守规则。

加注释的地方:文件注释、函数注释、变量注释、算法注释、功能块程序注释。

4.函数的[in][out]参数

这个是说要对函数传来的参数进行合法性检查,对函数传出去的参数也要检查。

5.对系统调用的返回进行判断

对于一些系统调用,比如打开文件,应判断下是否为空。对空文件操作,你有病啊。

6.if 语句对出错的处理

if 正条件 正常处理 else 出错处理----->if 错条件 出错处理;正常处理

这种改变能够先判断出错条件,不至于使得正常处理代码过多将出错条件淹没在茫茫代码中。

7.头文件中的#ifndef

这种方式在c语言中常见吧,主要是防止两个c文件的头文件重复编译,造成声明冲突。

#ifndef 标识 #define 标识 #include  #endif

8.在堆上分配内存

简单来说,堆上malloc分配内存,记得一定到free掉,以防内存未释放,造成内存泄露。

C++中是new 和delete成对出现,尽量在一个函数中,记得malloc的要初始化下。

java中?谁管这破事啊!gc垃圾回收,你懂得,但好像也不是万能的。

9.变量初始化

malloc堆上分配的使用使用memset初始化(清零),栈上分配的struct和数组也尽量初始化。

对于全局变量和静态变量一定要在使用前初始化。

10.h文件和c文件

就是说h文件和c文件的分工问题呗,即声明和实现分离,H文件中一般是变量、宏定义、枚举、结构和函数接口的声明,就像一个接口说明文件一样。而C文件则是实现细节。

带有初始化信息的全局变量不要放在头文件中。正确写法:在c文件中定义,其他引用这个变量的c文件加上extern关键字。

11.出错信息管理

这种感觉不是错误即打即用的那种,而是要把这些错误信息统一地管理起来,即经常听老师讲过的定义错误码。

12.常用函数和循环语句的计算量

就是说,一个函数在循环体内多次执行,但是这个函数结果是不变的。这样的话,肯定会浪费执行时间。这时,把这个函数移到函数体外,只使用函数结果。

对于一个经常调用的函数体内的变量,声明成static变量会省去分配内存开销,执行效率会得到提升。

13.函数名和变量名的命名

这个c语言老师就不停地嘱咐过吧,感觉主要就是望文知义。

避免全局函数和变量名字冲突,加上前缀,同学一般没有编写过大型程序,体会不是很深。我们一个老师曾说过,他们在做工程时曾遇到过非常莫名的问题,后来就是变量命名问题,以后他们选择将自己的名字作为函数的前缀防止冲突。

14.值传递和指针传递

函数参数中传入非const的指针时,就表示要修改这个指针指向内存中的数据。

但是,传值,在函数体内部不会对传入的这个值变量进行任何修改,相当于内存拷贝。

15.修改别人的代码

修改别人程序时不要直接删除别人的程序,应该先把别人的程序注释掉,然后添加自己的程序。相比一般的菜鸟选手也不会直接删除人家的程序,起码可以留下来做个参考嘛。

16.把相同或近乎相同的代码形成函数和宏

把相似的代码抽取出来,捣鼓成一个函数,在使用的地方直接调用这个函数就可以了。

例如,程序中可能会有多处连接数据库的地方,这时就可以抽取出来,做个函数,甚至说类。

这样也方便程序的修改,这个用宏定义个常量,容易理解吧

如定义网络编程中的端口号,程序中10次用到这个端口号,定义为宏,只需要修改一次,然而,前者需要寻找到这十个地方,然后逐个修改。

17.表达式中的括号

这个不必多说吧,不要为了显示出自个牛X,故意把括号去掉,到头来可能把自己也坑了。

18.函数参数中的const

在c++中,要多多使用const,const成员,const函数,这可以使得程序更加完整和理解。

19.函数参数不要过多,多了就使用结构体

在阅读一些linux下的程序时,经常可以看到使用结构体,作为参数。这能够方便数据的封装,维护程序的简洁性。

20.函数返回类型,不要省

主要是为了代码的可读性,对于void函数,也要加上return;为啥?不知道。

21.不要使用goto

说是不利于代码维护。据说一般逻辑流程都可以使用顺序、循环、判断这三种基本类型代码。

22.谨慎使用宏

不知道宏展开到底是个什么样子,如果使用,参数要加上括号。

虽然宏速度很快,但是展开会使得源代码扩张,目标文件增大。是不是说,java中都看不到宏的存在了。

23.static的使用

static可以修饰变量和函数。

static 变量:具有作用域的全局变量,应是比较常见的用法。12条也说过,对于经常调用的变量,应声明为static。

对于函数来讲,static的作用仅限于隐藏。即static的最大的作用在于控制访问。如果在一个c文件中,一个函数或是一个全局变量被声明为static,那么,这个函数和这个全局变量,将只能在这个C文件中被访问,如果在别的C文件中调用这个C文件中的函数,或是使用全局变量(用extern关键字),将会发生链接时错误。这个特性可以用于数据和程序保密。

另外,static还能将数组默认为0.

24.函数代码尺寸

一个函数的代码不要过大,也尽量不要在一个函数内做多个事情。

一个函数的功能要单一,便于为其他程序提供服务,可读性。有的面向对象中设计思想了。

25.typedef的使用

typedef是一个给类型A起别名的关键字B, typedef A B。代码中使用的是B,但代表A的意思。

不同的平台下可能具有不同的字长,在跨平台的工作时,16位机上使用typedef int16 INT,32位机上 type int32 INT。但INT是统一类型名字,在代码中出现,修改时只需更改typedef定义即可,便于维护。

不同的程序员可能使用int 或short 表示bool类型,使用int型的程序员定义typedef int bool;使用short型程序员定义typedef short bool;但是代码中使用的是bool a;

typedef也可以定义结构体和函数 为更简单的名字。

经常在结构体定义时看到 typedef struct A{} B;使用时 B *p;

函数定义:typedef int (*pfunc)(int A,int B, int C,int D);使用时 pfunc *p;

26.常量声明为宏

程序中不要出现纯数字式的硬编码,一方面容易引起费解,另一方面可能会修改时,一改全改。

这时,可以可以将数字声明为宏。这里全局变量也可以完成此功能,但宏比全局变量具有更高的速度。

27.宏定义不要加分号

宏定义加分号后,如#define A 1024;它是在程序段中,将A替换为1024;这违反程序员本意,出现不可预料的错误。

28.||或&&的使用

express1 || express2 :当express1为真时,express2将不再执行。

express1 && express2 :当express1为假时,express2将不再执行。

这个在编译原理课程上 应该提及过吧。

这里会出现一个问题,如果express2中含有初始化指针p的操作,但是,由于express1短路时,express2未被执行,即指针p未被初始化。

但下文中,有出现引用指针p的操作,这时出现运行时错误。

另外一种情况:判断一个字符是不是有内容,即判断这个字符串指针是不为空(NULL)并且其内容不能为空(Empty);

if((strlen(p)&&(p!=NULL))) ; 这样当p为NULL时,出现运行时错误;

但       if ( ( p != NULL ) && ( strlen(p) != 0 )) 就可以利用p!=NULL为假,不再执行strlen(p),避免这种情况。

29.尽量使用for语句,而不是while语句

while语句和for语句都可以完成循环功能,但是for语句更加清晰明朗。

for(初始条件;结束条件;循环递推){}

30.sizeof类型 而不是变量

int score[100];使用sizeof(int) * 100 ,虽然sizeof(score),这样容易阅读。

sizeof经常用来分配内存空间。

31.莫忽视warning

常见warning

1.使用了隐晦声明的函数。一个函数在别的C文件中,应extern关键字声明这个函数,否则编译时会出现这种警告,及本地与外部函数分不清楚

2.没有转换一个指针,在malloc中尽量显式转换。

3.类型转换 float f=2.0;2.0是double型,把一个double转成float。修改方式float f=2.0f;

32.DEBUG和RELEASE版本

仿照VC建立debug和release两个版本,debug信息在以后维护中具有很宝贵的作用。

预编译技术

#ifdef DEBUG
        void TRACE(char* fmt, ...)
        {
            cout<<__FILE__<<__LINE__<

    debug信息;
        }
    #else
        #define TRACE(char* fmt, ...)
    #endif

如果使用debug模式,输出编译标志DEBUG内的信息,添加-DDEBUG编译选项

cc-DDEBUG -o target target.c

综上所述32条,都是为了三大目的——

    1、程序代码的易读性。
    2、程序代码的可维护性,
    3、程序代码的稳定可靠性。

好的软件产品绝不仅仅是技术,而更多的是整个软件的易维护和可靠性。


文章:http://blog.csdn.net/haoel/article/details/2873 陈皓




你可能感兴趣的:(学习方法)