Chinaunix首页 | 论坛 | 博客
  • 博客访问: 662990
  • 博文数量: 111
  • 博客积分: 5010
  • 博客等级: 大校
  • 技术积分: 1461
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-08 14:40
文章分类

全部博文(111)

文章存档

2010年(10)

2009年(70)

2008年(31)

我的朋友

分类:

2009-12-12 22:39:39

经验分享,代码编写习惯 

以下是我个人的习惯: 
1。将所有的错误代码返回值写在一个文件里,使用define来定义错误代码 
2。写几const来定义操作错误代码,比如: 
typedef int MY_ERR; 
const int  MY_UNKNOW_ERR 0 
const int  MY_OK 1 
#define MY_SUCCEEDED(Status) ((MY_ERR)(Status) == MY_OK) 
#define MY_FAILED(Status) ((MY_ERR)(Status) != MY_OK) 
3。函数的返回值基本上都是MY_ERR,或者是void,很少有BOOL。因为很多情况下我们需要知道函数错在哪里,错误代码是什么。 
函数返回值是MY_ERR,而不是int。这样表示函数返回的是一个错误代码。如果函数返回int,那就表示函数的确是返回一个int的数值 
4。如何写类函数,请参考我的帖子"经验分享,如何使用try,catch, throw之二" 
5。基本上调用public函数的写法是: 
  MY_ERR err = myclass.test1(); 
  if MY_FAILED(err) 
      throw err; 
6。写一个错误消息映射文件,即每个错误代码映射一窜字符。字符可以是多语言的。一般写在xml文件里。这样根据每个函数的返回值,就可以得到映射的字符串。 
7。另外会有一个专门写日志的文件,日志文件有两种,一个是给用户看的操作日志,一个是给自己看的调试日志 
8。尽量不用在底层的代码里写MessageBox这样的函数。一个项目在哪里弹出对话框,大多少情况下都是由GUI来决定的,不是由底层的代码来决定的。 
9。提供一个common或者叫public的类,提供所有项目都可以使用的函数或者类 
10。另外就是总所周知的事情,使用N层系统去做代码设计 

日志有两种,一种是操作日志,一种是调试日志 
操作日志是记录用户每一步的操作情况,也不一定要写的很详细,也不一定要记录每一步 
调试日志是你认为需要记录的内容,比如一些变量的值。 
调试日志你可以写个工具实时查看,这样有一个好处,可以实时调试程序, 
在一些情况下,我们不能用.NET的调试工具,我们需要实时运行程序,不能用断点中断调试,这时候用调试日志就很有用。 
比如在调试线程的时候,有时候使用断点是不能得到正确结果的。 
我个人的习惯是调试信息写成“【类名】【方法名】调试信息” 

另外对于错误的信息,不仅要写到日志里,还要考虑是否弹出对话框给用户 

错误代码的使用 

  1. 先看一个不好的例子   
  2. C/C++ code  
  3. //------ 不好的例子 -------   
  4. void Test()   
  5. {   
  6.   if (xxx1)   
  7.   {   
  8.       MessageBox(xxx);   
  9.       return;   
  10.   }   
  11.   if (xxx2)   
  12.   {   
  13.       MessageBox(xxx);   
  14.       return;   
  15.   }   
  16.   if (xxx3)   
  17.   {   
  18.       MessageBox(xxx);   
  19.       return;   
  20.   }   
  21. }   
  22. 我个人喜欢的写法是:   
  23. void Test()   
  24. {   
  25.   try   
  26.   {   
  27.     if (xxx1)   
  28.       throw ERROR_CODE_1;   
  29.     if (xxx2)   
  30.       throw ERROR_CODE_2;   
  31.     if (xxx3)   
  32.       throw ERROR_CODE_3;   
  33.   }   
  34.   catch(ERROR_CODE & err)   
  35.   {   
  36.       TCHAR * tchMsg = GetMessage(err);   
  37.       MessageBox(tchMes);   
  38.   }   
  39. }   
 

提供一个函数,通过error code得到错误信息

我在写下位机程序,并且下位机内存有限,个人认为要尽量使用#define,不知道对不对。 
我在写下位机程序时就碰到内存不够的问题,将const改成#define就好了 

另外在使用enum定义错误代码的时候,有时候需要从enum转换到int,自己感觉有点麻烦 
所以自己也就使用宏定义了,不过是一定要小心使用

线程函数写成类的protected函数

如果这个函数不是属于类的,那么就不能访问类的私有成员变量 
现在的前提是这个函数是类的函数,它就可以访问类的所有成员变量 

换一个角度,你先设计好了一个类,后来发现这个类的其中一个方法在线程下运行更合适,这个时候就把这个函数设计成线程调用的函数 
并且,这个函数仍然是类的一个成员函数,你不能因为它在线程下运行更合适,就更改你的类的设计 

线程是操作系统的概念,不是类的概念

经验分享,C语言代码编写习惯 

C++可以利用try, catch, throw来写代码风格 
C语言没有, 我个人使用goto语句来写代码风格 

大家都知道最好不要使用goto, 但不是完全不要使用goto语句 
函数设计有一个原则, 就是一个函数只有一个出口, 也就是只有一个地方有return 

  1. 先看一个不好的例子   
  2. C/C++ code  
  3. //--------- 不好的例子 ----------  
  4. boolean fun1()  
  5. {  
  6.   if (__funx1() != 0)  
  7.     return false;  
  8.   if (__funx2() != 0)  
  9.     return false;  
  10.   if (__funx3() != 0)  
  11.     return false;  
  12.   return true;  
  13. }  
  14. 以下是我个人喜欢的风格   
  15. //--------- 我个人喜欢的风格 ----------   
  16. //定义一个全局变量   
  17. int g_nErrorCode = 0;   
  18. //在函数__funx1, __funx2, __funx3中如果出错, 会设置g_nErrorCode值   
  19. //这个函数会有两个出口, 一个return true; 一个return false;   
  20. boolean fun1()   
  21. {   
  22.   if (__funx1() != 0)   
  23.     goto error;   
  24.   if (__funx2() != 0)   
  25.     goto error;   
  26.   if (__funx3() != 0)   
  27.     goto error;   
  28.   return true;   
  29. error:   
  30.   return false;   
  31. }   
  32. //如果要这个函数只有一个出口, 可以按以下的代码去写   
  33. boolean fun1()   
  34. {   
  35.   bool bRet = true;   
  36.   if (__funx1() != 0)   
  37.     goto error;   
  38.   if (__funx2() != 0)   
  39.     goto error;   
  40.   if (__funx3() != 0)   
  41.     goto error;   
  42.   //这句话永远都不能成立, 只有goto语句能进入   
  43.   if (false)   
  44. {   
  45. error:   
  46.   bRet = false;   
  47. }   
  48.   return bRet;   
  49. }  
阅读(1087) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~