关闭

感慨:编写坚固的代码

3212人阅读 评论(3) 收藏 举报
    分析了公司的一个项目代码,结果令我非常沮丧。分析的这个项目大约有500个文件, 并不很大。我承认,这个项目的程序员都是训练有素的,然而,都是C语言的训练有素,不是C++的。
    我们为什么选择C++作为一个软件项目的开发语言?我想,决不是因为C++更复杂华丽,也不是因为C++支持OO,OB,也决不是因为C++是支持GP的最佳选择。论二进制兼容性,C++不如C;论OO支持的干净利落,C++不如Java和C#-----C++太华丽和复杂;也许GP是一个不错的选择理由,但是,大部分程序员并没有训练有素地掌握GP。当然,我无法揣测别人为什么会选择C++,对我来说,选择C++的理由只有两个:1是C++的遗留项目,2是需要C++超群的表达力。
   然而,C++充满了陷阱和习俗,恣意妄为的人必将受到惩罚。即使对于我这样一个狂热的技术跟风者而言,也没有比写坚固的代码更重要的了----因为我首先是一个现实的软件工程师。对于所有的C++程序员来说,也许没有比《Effective C++》更重要的书了,每个C++程序员都应该熟读此书。而今天,我们还有《C++编程规范》作为我们的编程指南,正像我曾经说过得那样,值得我们将这101条贴在显示器上每日诵读.我愿意不厌其烦地强调这两本书,它们是所有打算用C++从事工程活动的程序员们的圣经。
   长期以来,我们一直没有对代码的安全性给予足够的重视----MS的那套安全函数并非我所谓的安全代码。我们必须把代码的安全性提高到一个非常重要的程度:安全性是正确性的组成部分。也许这么说是耸人听闻,但是,我越来越坚信这个观点是完全正确的。
    简单的回顾一下项目中的严重缺陷。
    忽略了copy ctor和assignment的默认行为。在一个嵌入式引用计数的设计中,当对象被复制时,导致引用计数部分也被简单复制,这很显然是错误的。EC中强调过该如何注意copy ctor和default assignment,这样的错误完全是可以避免的。
    引用计数,伴随的当然是smart pointer的设计。必须认识到,编写一个具有工业强度的smart pointer是非常有难度的,即使我们并不需要一个通用的设计,要实现一个专用的、足够坚固和安全的smart pointer也不是一蹴而就的事情。有些问题,即使是boost::shared_ptr或者是Loki.SmartPtr这样的实现也是有缺憾的----当然,也可能是我孤陋寡闻----如何实现安全的const pointer?提供什么样的语义是最佳的?
    动态分配数组的问题.大量的new Type[size]...delete [] p;这样的代码。这样的代码如何保证异常安全性呢?大量的try...catch把代码弄得一团糟.为什么不用boost.scoped_array这样的工具呢?即使不愿意依赖第三方库,实现一个简易的scoped_array也不过十几行代码而已!
   回顾一下STL,必须成对的操作,有印象的大约只有allocator的4成员函数。所有的容器、算法以及iostream家族,没有必须成对操作的函数。事实上,拥有RAII这样的利器,我们应该封装几乎所有的配对操作----竭尽全力!我所谓的配对操作是说那些必须成对执行,否则就不可能正确的操作,例如:new/delete, new[]/delete[]。
(continue)
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:339123次
    • 积分:4126
    • 等级:
    • 排名:第7880名
    • 原创:70篇
    • 转载:7篇
    • 译文:1篇
    • 评论:323条
    文章分类
    最新评论