版本6和7间的区别
于2008-11-17 14:25:14修订的的版本6
大小: 2650
编辑: virtuos
备注:
于2008-11-17 14:33:36修订的的版本7
大小: 2870
编辑: virtuos
备注:
删除的内容标记成这样。 加入的内容标记成这样。
行号 38: 行号 38:
}}}可以使用如下代码来代替{{{ }}}可以使用如下代码来代替{{{#!cplusplus
行号 58: 行号 58:
}}}上述switch结构总计有170个case,代码长达5035行。同样可以用数组来改造它{{{#! }}}上述switch结构总计有170个case,代码长达5000行。同样可以用数组来改造它{{{#!
行号 62: 行号 62:
 * 注意代码统计质量,函数不可太长,方法不可太多,不可有太多子类,不可有太多父类  * 注意代码统计质量,函数不可太长,方法不可太多,不可有太多子类,不可有太多父类。比如,IkeScriptMgr::CallResponse单个函数长达5000多行,一个类SimHuman有多达414个成员函数,这些数字说明这些地方的设计很可能存在问题,需要考虑是否要重构。

some tips on writing c++ codes to avoid potential bugs:

  • 先写注释再写代码,规范化的注释。按照doxygen的标准给类、函数、变量写注释。比如,类似这样的注释一点用处都没有:

       1 //----------------------------------------------------------------------------
       2 // @ SimDoor::SimDoor()
       3 // ---------------------------------------------------------------------------
       4 // Constructor
       5 //----------------------------------------------------------------------------
       6 SimDoor::SimDoor( const RSString& name )
    

    再比如

    比较好的写法应该类似这样:

       1         /// \brief check the block is saved or not
       2         /// \author Chen Zhongke
       3         /// \param filename the filename of the block data file.
       4         /// \result return -1 if filename doesn't exist, otherwise return the index of the file in buffer.
       5         int SimulateIsSaved(RSString filename);
    
    对于函数的注释应该写在头文件的声明中,而不是定义中。
  • 避免重复代码,使用函数。
  • 避免使用预编译

       1 #define kMaxFriends             2
       2 
    

    应该定义成

    static const int kMaxFriends = 2;
    并写在用到它的类中,而不是一个全局的常量。
  • 避免switch,用数据来简化代码。比如

       1         switch (index)
       2         {
       3                 case 0: return RP_VALUE0;
       4                 case 1: return RP_VALUE1;
       5                 case 2: return RP_VALUE2;
       6                 case 3: return RP_VALUE3;
       7                 case 4: return RP_VALUE4;
       8                 case 5: return RP_VALUE5;
       9                 case 6: return RP_VALUE6;
      10                 case 7: return RP_VALUE7;
      11         }
    

    可以使用如下代码来代替

       1     int rp_values[] = {RP_VALUE0, RP_VALUE1, RP_VALUE2, RP_VALUE3, RP_VALUE4, RP_VALUE5, RP_VALUE6, RP_VALUE7};
       2     return rpvalues[index];
    

    再比如

       1         switch (statement)
       2         {
       3         case srTimerSet:
       4         {
       5                 //n lines of codes
       6 
       7                 break;
       8         }
       9         case srTimerKill:
      10         {
      11                 //n lines of codes
      12                 break;
      13         }
      14         // n cases
      15         return true;  
      16     }   
    

    上述switch结构总计有170个case,代码长达5000行。同样可以用数组来改造它

        bool (*response[])(void) = {TimerSetHandler, TimerKillHandler, ...};
        return responses[statement]();
    数组里面可以是函数,也可以是仿函数对象。
  • 注意代码统计质量,函数不可太长,方法不可太多,不可有太多子类,不可有太多父类。比如,IkeScriptMgr::CallResponse单个函数长达5000多行,一个类SimHuman有多达414个成员函数,这些数字说明这些地方的设计很可能存在问题,需要考虑是否要重构。

  • 避免指针,避免数组,避免自己写常用的数据结构,用stl
  • 避免用C++实现OO design,注意对象的owner
  • 善用svn,大的修改应该建分支
  • 速度至关重要时,用查表代替计算,避免浮点数,
  • 注意Singleton模式的实现。

C++编程技巧 (2008-11-18 09:51:13由virtuos编辑)

ch3n2k.com | Copyright (c) 2004-2020 czk.