您的位置: 首页 >> 新闻中心 >> 计算机 >> 软件开发
瘦身前后——兼谈C++语言进化
精英教育阅读提示:常看我blog的朋友肯定记得我曾写过的boost源码剖析系列。本来这个系列是打算成书的,但随着对C++的认识发生了一些转变,对语言级技术的热衷逐渐消退,再回过头来看boost库中的一些组件,发现原本觉得很有写的必要的东西顿时消失了。
■ 最新课程推荐更多课程>>
学校培训课程开课时间上课地点精英价报名
正辰培训 微软软件测试工程师电话预约西直门教学区¥4704
新 科 海 软件测试工程师就业班电话预约海淀长远天地¥6280
北师大IT 软件工程与测试实战班电话预约北京师范大学¥1800
北师大IT 高级网络工程师就业班电话预约北京师范大学¥13000
金 同 方 网络工程师就业周末班电话预约人大总部¥7000
  前一阵子写了一篇文章,提到语言进化的职责之一,就是去除语言中的tricks(职责之二是去除非本质复杂性)。

  常看我blog的朋友肯定记得我曾写过的boost源码剖析系列。本来这个系列是打算成书的,但随着对C++的认识发生了一些转变,对语言级技术的热衷逐渐消退,再回过头来看boost库中的一些组件,发现原本觉得很有写的必要的东西顿时消失了。Scott Meyers的主页上也列有一个写Boost Under The Hood的计划,一直也不见成文,兴许也有类似的原因。

  一门语言应该是“Make simple things simple, make complex things possible”的。当我们用语言来表达思想的时候,这门语言应该能够提供这样的能力:即让我们能够最直接地表达我们的意思,多一分则太多,少一分则太少,好比古人形容美女:增一分则太肥,减一分则太瘦。

  这个问题上,有一个我认为是广泛的误解,就是“KISS便意味着要精简语言,并避免在编码中使用‘高阶’语言特性”。对此有一句话我觉得说得好:你不能通过从一门语言中去掉东西来增加表达力。高阶特性是一面利刃,用得不好固然伤了自己,但这并不表明就没有用。任何东西都是在它真正适用的地方适用,霸王硬上弓的话弓断弦崩反而伤及自身。所以,仅仅因为高阶特性容易误用(而且高阶特性的确也容易吸引人去用且容易误用,不过这是另一个问题),就断然在任何地方都不用并宣称这样才是KISS的话,便因噎废食了。举个例子,高阶函数是有用的,如果在真正需要高阶函数的地方不用高阶函数,那不是KISS,只能让解决方案(或者更确切地说,workaround)更复杂。lambda函数是有用的,但如果在真正需要lambda的地方不使用lambda,也只能导致更复杂更不直观的workarounds。OOP是有用的,但如果你的程序本来就只是简单的“数据+操作”你偏要硬上OOP的话,不仅多了编码时间,而且还降低程序的可见度和可维护性,后者就意味着项目的money。拿C++来说,这是一个广为诟病的问题。C++的偏向底层的应用领域决定了有不少地方使用C++其实就是“数据+操作”,然而很多人却因为用的是C++编译器,便忍不住去使用高级特性,结果把本来简单的事情复杂化——我自己就有不少次这样的经历:用了一大堆类之后,做完了回过头来再看,这些类都干嘛来着?需要吗?最关键的就是要清楚自己做的是什么事情,以及什么工具才是对你所做的事情最适合的。

  说到这里不妨顺便说说另一个误解:“如果我反正用不着C++里面的高级特性,那还不如用C罢了”,鉴于C/C++的应用领域,的确有不少地方是可以用C++的C部分完成得很好的,所以这个误解被传播得还是蛮广泛的。这里的一个微妙的忽视在于:用C的话,你就用不到许多很好的C++库了。用C++的话,你完全可以在你自己的编码中不使用高阶特性(说实话,这需要清醒的头脑和丰富的经验,以及克制能力),但你还是可以利用众多的C++库来简化你的工作的:如果一个transform明明可以搞定的你偏要写一个for出来难道能叫KISS?如果一个vector就能避免绝大多数内存管理漏洞和简化内存管理工作你偏偏要手动malloc/free那能叫KISS(我见过不少用C++编码却到处都是malloc/free的)?如果最直接的方式是gc你偏偏要绕一大堆弯子才能保证正确释放那也不叫KISS(等C++09吧)。如果一个for_each(readdir_sequence(".", readdir_sequence::files), ::remove);能搞定的你偏要写:

// in C

DIR* dir = opendir(".");

if(NULL != dir)

{

struct dirent* de;

for(; NULL != (de = readdir(dir)); )

{

struct stat st;

if( 0 == stat(de->d_name, &st) &&

S_IFREG == (st.st_mode & S_IFMT))

{

remove(de->d_name);

}

}

 closedir(dir);

}

  那能叫KISS?

  总之还是那句话:明确知道你想要表达的是什么并用最简洁(在不损害容易理解性的前提下)的方式去表达它。但我认为,最KISS不代表最原始。

  进化——两个例子

  先举一个平易近人的例子(Walter Bright——D语言发明者——曾在他的一个presentation中使用这个例子),如果我们想要遍历一个数组,在C里面我们是这么做(或者用指针,不过指针有指针自己的问题):

本新闻共3页,当前在第1页  1  2  3

  影视动画培训   北大BEC培训官方报名网站   2008美国夏令营启航官方指定报名网站   2008留学第一站!  
  北师大 火星时代
共举影视动画培训之鼎
  北大BEC培训官方报名网站
现在报名独享95折!
  2008年国家职业资格考试
一次过关完全备考手册
  2008留学第一站
留学资讯尽在精英留学站!
 
上一篇:《C++0x漫谈》系列之:右值引用
下一篇:C&C++论战之C++真的还有未来吗?
 相关新闻
·2006年下半年软件设计师考试答案·我从外行到专业的软件测试工程师
·软件工程师现有工作满意率仅为7.1%·软件资格和软件水平考试的业界评价
·风雨过后见彩虹 谈我的软考经历·自学通过软件设计师考试后的一些感想
·关于软件资格水平考试,我很想说几句·从软件设计师试题看软件测试七原则
·软件设计师考试必看 如何应考?·45天考过软考中级信息系统监理师心得
·软考超级Fans-五次软考心路历程·计算机软件水平考试应避免的五大失误
·通过软件设计师考试 专业能力很重要·2007年软件测试工程师需求继续增大
·从人性格看哪些人不适合做软件测试·软考三考三捷 我是怎么备考和应考的
 
◇ 重点栏目导航
◇ 精英服务承诺
教育顾问:010-51660910
QQ交流:138660910
相关资料
·软件测试新手的修炼之路
·Smarty简体中文参考手册
·Struts中文手册
·Struts快速学习指南
·ultradev动态网页制作教程
·UML工具箱
·《设计模式》中文版
·学友Flash伴侣 1.11
·阿须图像水印(AssureMark)V2.0
·超级语霸
相关试题
·2008年云南公务员考试专业试卷之科技环保
·2008年云南公务员考试试卷之教育文化类专
·2008年云南公务员考试试卷参考答案之科技
·2008年云南公务员考试试卷参考答案之教育
·2008年公务员考试科教管理类专业试卷参考
·2008年公务员考试科教管理类专业试卷(云
·2007年全国CPA考试试卷及答案解析之《会
·2007年CPA试卷及答案解析之《财务成本管
·2008年注会考前模拟试题之《财务成本管理
·2007年全国CPA《税法》考试试卷及答案解
相关热贴
·如何改QQ IP地址!
·恰当选择软件测试自动化方案
·ADO.NET学习总结
·.net操纵xml文件类(c#)
·Log4net教程
·VPN技术详解
·高手必读 网络端口安全防护技巧放送
·访问XP共享出现的问题解决办法
·Web2.0时代,RSS你会用了吗?(技术实现总
·.NET下正则表达式应用的四个示例