不可再犯

null pointer,冲内存,内存泄漏,不成熟的优化, 这些程序员的禁忌之地,在我的第一个项目里面都丝毫不差的光顾了我.

记得中学时候,在一次重要考试之后,我发现我在一些诸如>,=,上面犯了大量的错误,尽管最后的大题做的非常好,但是最后的结果却让我很失望, 马虎, 割杀了我的辛苦付出,我出离愤怒的用圆规在手臂上刻下了>,=,+号,近十年过去了,今天仍然隐约可见.

而当我身在一个商业项目里的时候,周围的所有人在为项目不停付出的时候,我的不成熟的code,给全组造成了麻烦, 这种感觉绝对比努力之后的糟糕成绩严重得多.

第一次是我不知道,再犯就是我白痴!

静下心来,观看我的错误,可以分成两类: 代码流程类错误&态度类错误.

---------------------------------------------------------------------------------------------------------------------

null pointer&冲内存是源自我的低级错误, 这样的错误就应该由单元测试来搞定,我所在的项目里面还没有单元测试,一个类正确与否取决于coder的写和review,以及在整个项目里面的表现.

这样低级错误就有可乘之机, 代码的稳定性就不那么有保证.

针对各种情况来进行测试,并用跟踪内存组件来跟踪类在内存上的表现是否是正确无误的. 这种低级的可测内容就应该由测试来进行.

项目的规模越大,这种测试越应该给予注意,否则coder就要针对一个问题,在整个项目的范围里跟踪调试,因为代价高所以要花更大的力气来进行类稳定性安全性的保证--测试.

 ------------------------------------------------------------------------------------------------------------------

因为认识有限,所以我们时不时的遇到原来认为不可能的事情.

而思维懒惰和想当然则会放大人的无知.

我的不成熟的优化源自在某一函数功能上我进行了优化,是的,的确快了一些,但是它暗地里却把另一种优化禁掉了,结果导致整体性能的下降.

这个函数的影响是全局性的, 那么除了其自己外,全局的运行时间也应该得到注意.总有不知道或者忽略掉的事情, 务必对修改的东西所作用的范围内进行测试监控.

我是无知的,我的思维不能保证做到绝对完备的,所以我要谦卑的去面对我的程序.

冲内存就是无知又想当然的结果, 不成熟优化则是态度不够严谨的结果.

------------------------------------------------------------------------------------------------------------------

<doom启示录>已经看了无数遍,卡马克在编程方面的禅宗的境界是我所向往的,似乎那是纯净的又是热烈的感觉, 现在只想说,这是门艺术, 一分静美的代码源自热情与智慧.

-----------------------------------------------------------------------------------------------------------------

最后是一个危险结构的修正:

class  test
... {
    
public:
         test(
void* arg):mType0(arg)...{}
         
~test()...{SAFE_DELETE mType0;}
    
private:
         
void* mType0;
}
;

这是段很不合理的代码,就是mType0由外来指针初始化, 然后test类在析构的时候释放mType0指向的内存.

简言之,就是在test外面, 函数new了内存但是却没释放, 而在test内部, 没有new却有释放.

这样内存的分配和释放就被割裂开,会把项目的内存复杂度提到新的境界--这是个很不好的结构.

最好使用factory来做这个:

 

class  test
... {
public:
          
static test* factory()
          
...{
                
void* arg = malloc(size);
                
if(arg == NULL)
                    
return NULL;
                
else
                    
return new test(arg);
          }

private:
             test(void* arg) : mType0(arg) ...{}

          
void* mType0;
}
;

这样内存操作就被封到test里面,外界不用管arg的分配, 所有分配/释放工作都是在test class中内部进行.


原文链接: http://blog.csdn.net/ccanan/article/details/1669624

你可能感兴趣的:(不可再犯)