huaxiazhihuo

 

试论C++类库开发之难

         很久很久以前,世界上曾经存在着这么一种语言,用它写出来的代码,既能保证高效的运行效率,又兼具优雅十足的美感,并且,所有语言存在着的不足,都可以通过添加新的自定义的类型来实现出来,并且,新的类型,只要做得好,可以与原有的类型无缝交互。在它的世界里面,那是一切皆有可能。并且,它还承诺,虽然它的功能非常丰富,但各个功能特性都可以和睦相处,而且,你代码中不必要用到某项功能时,你完全不必为这项功能付出那怕一丁点的代价,如果这个语言愿意作一点点妥协,可能它就不是现在的这个样子,至少将更加容易使用。所有它承诺的一切,乍听起来美妙无比,而且,它也似乎做到了,真的做到了马儿既能跑,又能吃尽量少的草,前提是开发人员要小心翼翼地用好这门语言的一切特性。只可惜事与愿违,这门语言确实看起来,真的可以创造出完美的东西,但事实上,没有人能用它写出过一个好东西,那怕是简简单单的字符串,要做得大多数人拍手叫好,也是千难万难,完美的字符串,从来就没有出现过。各位同学,自然知道在下说的是什么语言,等千呼万唤的C++1X始出来之后, 真不知道还有什么东西,是C++没法做的,要在C++中增加几种新的编程模式,也不会有太多的困难。起码,函数式的编程,使函数好像成为一等公民,绝不是什么难事。
          C++本身自然不会有什么问题,说它复杂吧,它确实复杂,但是完全可以无视,异常不好,禁用就是;多继承很坏,不用就是;模板过于复杂,忘了它吧;……,起码它做到了,你不喜欢的特性,你可以不必付出任何代价。但是,成千上万的C++高手大牛巨侠,这么多年下来,却没有搞出几个似模似样的类库出来,除了STL(其实STL也有一些问题),难道是程序员错了,难道是他们全错了吗?可是,C、JAVA、PYTHON它们,怎么就不存在这些问题呢,里头的好东西还真不少,起码在它们的圈子里面,码农们都觉得类库没问题,很好,用起来很放心,可以放心的使用。又或者是,C++码农对自家的类库要求过高了,他们的眼光太挑剔了,大家人人都有多疑症,但是,一旦他们使用其他的语言,又很乐意使用其他语言所提供的类库或者是框架,怎么就不会那样疑神疑鬼,没有各种并发症,起码在下是这样的,你要说C++没问题,那鬼才愿意相信呢?那么,假如C++有问题,问题又是那里呢?
          我以为,C++的问题,就在于它似乎很鼓励码农制造轮子,撰写类库,然后对所写的类库貌似没有过多的要求,但实际上,C++对类库的要求,是所有语言中最高的。好比,要你写的软件,需求很不明确,貌似用户说,你随便写,然后它能完成任务就可以了,但实际上这样的软件最难开发了。知道吗?C++的类库,有什么样的要求:1、运行的效率要高,处理一切细节,高效源于对细节的特定处理;2、表现出来的接口和语义要无限接近原始内嵌的类型,值语义,吖的,这要求也太高了。3、要有足够的通用性,满足抽象的需要。这三条的任何一条都不是什么省油的灯,直接可以K死秒杀多少C++高手的几千万只脆弱的脑细胞。这三条下来,本身就差不多是一个难以完成的事情,但是,这还不是最要命。最能搞死人的,是C++又提供了太多的丰富特性,什么模板、操作符重载、异常、多继承、内联、……,心理学的一项研究表明,当选择太多之时,当事人就会分散精力,不知道如何选择。用C++开发类库,眼前存在着无限种选择,貌似条条大路通罗马,但实际上,却是条条大路是死路。但这也没什么,最后一击,如果没有必要,鬼才愿意费心费神写类库,关键在于C++只是提供实现高标准类库的基本平台而已,语言本身就没有一点点能用的实在的东西,那怕一个简单的字符串类,一切都必须通过类库来完成,它一开始一直都在鼓励码农写类库,试问普天之下,有那个C++码迷,能够抑制造轮子的诱惑,于是,悲剧就诞生了。
          反观其他的语言,为什么就不存在这些问题呢?
          在C里面,是绝对不会出现C++的类库困境,首先,它只有一种选择让你开发类库,那就是函数和函数指针,外加结构体、数组,或者,必要的时候,使用上点宏,嗯,就只有这么多。你要用就用,不用就拉倒,在这么有限的条件,你只能做出最简单但却又是最精妙的设计,都能直达问题的本质。基本上,C的设计,不会存在一点点多余的抽象层次,一拳一拳,都打在要害上,针针见血。更何况,C的要求也不高,除了效率之外,就是要保持函数接口语义的清晰,而这并不难做到。
          那么,在高级语言中,又是另一番天地了。当然,它们也提供了多数C++的丰富特性,你自然有很多选择,但是,这些语义却屏蔽了很多底层的细节,并且提供了丰富的语言平台特性,什么反射啊、丰富的API框架,单是垃圾回收和单继承,就功德无量,足以拯救多少弱小脆弱的灵魂。是的,人家效率确实不太高,也没有要求值语义,但这不要紧,因为人家语言一开始就没有这样的效率标榜要求,它们一上来就让码农直面惨淡的应用,进入问题领域,不需要撰写什么高通用性的类,因为平台本身就提供了,你要写的类,都是问题领域中的东西。这实在能解救多少脑细胞啊,减少多少不必要的工作量啊呢。
          没有必要的类库来支持,C++做开发,工作量相当浩大,并且还容易生产出一堆不成熟的通用类;但是,必要的成熟的类库,市面上又没有多少个,目前的所谓的高级的C++类库,大多数都在为了C++而C++,你们知道我在说的是那一个的。当然,俺是没能力写出什么类库的,所谓的眼高手低,大概就是这样吧。
 或者,痛并快乐着,是C++码迷的持久不退的热情所在。只是,人生何其宝贵,将它们浪费在C++上,实在有点不值得。当然,活着只要快乐就好,C++也确实能给人带来很多快乐。

posted on 2012-05-30 16:53 华夏之火 阅读(4461) 评论(31)  编辑 收藏 引用

评论

# re: 试论C++类库开发之难 2012-05-30 18:19 Richard Wei

的确,C++ STL提供的都是最基本的功能,上层应用的库还是要自己封装  回复  更多评论   

# re: 试论C++类库开发之难 2012-05-30 22:13 钟谢伟

工具拿来用就成,什么合适就用什么,这是很简单的道理,没有任何一种语言是万能的。库的存在还是提高了很大的开发效率
适合则用,不适合就丢弃,用别的,树挪死,人挪活嘛!  回复  更多评论   

# re: 试论C++类库开发之难 2012-05-31 01:52 华夏之火

@钟谢伟
确实,如果没有那么多要求,库能提高开发效率,就算是再差的框架类库,好比MFC,也都能够起到很大的作用。只是,用糟糕的类库,做出来的,也都是糟糕的产品。我们在使用一个类库,类库也同时在要求我们的设计,必须符合它的使用条件。  回复  更多评论   

# re: 试论C++类库开发之难 2012-05-31 08:44 marvin

关于语言,可以看看我的博
http://cnblogs.com/chrome  回复  更多评论   

# re: 试论C++类库开发之难 2012-05-31 09:59 溪流

哈哈,说得好  回复  更多评论   

# re: 试论C++类库开发之难 2012-05-31 10:28 guilin

难道这就是前几天有篇文章写得C程序员的优越感?观点简直不值得一驳,c++的高质量库多到你不可想像,仅举几个有代表性的库

boost (全面的库, 网络 单元测试 序列化 文件操作等等都有了)
补充几个:
thrift, protobuf (序列化)
google-perfertools (内存分配器,性能分析)
google test, google mock(单元测试)
google log (log 库)
google flags(命令行参数库)

  回复  更多评论   

# re: 试论C++类库开发之难 2012-05-31 11:33 华夏之火

@guilin
BOOST这种将大部分精力用在语法糖上的玩意,不提也罢。当然,BOOST里面也有好几个能做实事的好东西。至于GOOGLE的开源库,确实不错,只是数量也太少了,远远没法满足日常开发的需要  回复  更多评论   

# re: 试论C++类库开发之难[未登录] 2012-05-31 13:18 qq

@华夏之火
地球已经容不下你了,快去火星吧  回复  更多评论   

# re: 试论C++类库开发之难[未登录] 2012-05-31 13:29

mfc不错
atl也不错,就是比较复杂。
还是商业库靠谱啊。  回复  更多评论   

# re: 试论C++类库开发之难 2012-05-31 13:45 YzL

完全看不出跟C++有什么直接的关系,说的问题基本都是自身对C++不熟而产生的问题,根本不足以说明C++就怎么怎么样。

说C、Java好东西多就是很好,而说C++特性多就是分散精力,如果特性多也能算缺点,那只能说明你对每项特性都不够了解,才会出现所谓的“选择太多,分散精力”。

其他语言内置类库多这就意味着不用经常写可通用/复用的类?而C++因为要经常写就“产出一堆不成熟的通用类”,其他语言不经常写反而产出的都是高质量类库?太扯了吧,类库质量完全取决于程序员水平,跟语言本身有半毛关系?

优秀高质量的开源C++库多不胜数,涉及的领域众多,有哪个语言的内置类库能涵盖/比得上这些更专业的类库?更别提其他收费的类库了,估计你做的开发太少,没用到罢了。
Boost、ACE、Xerces-C++、Crypto++、gSOAP、POCO、wxWidgets、Qt、OpenCV、Intel TBB、IBM ICU、Google Skia、Google V8……
说Boost“大部分精力用在语法糖上”,你读过几个Boost库的源码?说BOOST_FOREACH之类的是语法糖可以,但asio、regex、pool、shared_ptr等好多都是很常规的C++类设计,十分复杂的模版技巧也不是特别多,何来大部分之说?  回复  更多评论   

# re: 试论C++类库开发之难[未登录] 2012-05-31 13:46 春秋十二月

基本认同作者的看法,对c++恰到好处的运用,兼顾设计和性能,依赖于程序员高超的设计水平和驾驭能力。通过学习这门学术性强的复杂语言,锻炼了思维能力。至于实际开发用不用它,一看个人兴趣和能力,二看软件需求目标。  回复  更多评论   

# re: 试论C++类库开发之难 2012-05-31 14:30 华夏之火

惭愧,你提到的那些,确实有好几个没仔细用过。我考察了一些知名类库之后,基本上都是那个模样,抽象过多,使用又甚是不便,这些类库原本可以采用更加简单的设计方案,真正能让我稍微心服也只有STL,不免得出了以偏概全的结论。而反观C的库,总是那么简洁,直接反映了其所要解决的问题的核心,至于JAVA、C#等语言,因为语言本身已经统一了很多细节问题,它们的类库用起来反而省事多了,就算它们要写通用性的类,起码也不用像C++那么多数量,而且就算要写,也无须考虑太多细节问题,都是直接问题领域的@YzL
  回复  更多评论   

# re: 试论C++类库开发之难 2012-05-31 14:35 华夏之火

@春秋十二月
现在写C++代码,非常小心谨慎的使用里面的特性。就算是定义一个新的类,也要权衡再三,并且尽量保持这个类的成员函数的数量要尽可能的少  回复  更多评论   

# re: 试论C++类库开发之难 2012-05-31 23:02 春秋十二月

@华夏之火
该用就用,有时并不完全是语言的问题,而是设计,好的设计胜过语言的特性,面向对象的设计一般要遵循以下原则 1)SRP:单一职责 2)OCP:开放封闭 3)DIP:依赖倒置 4)ISP:接口隔离等等。写一个类仅完成功能并不难,难的是怎么合理方便使用它,怎么保证安全高效,对象内存怎么管理,怎么与其它类交互协作等等,而这些都更多是设计的问题。  回复  更多评论   

# re: 试论C++类库开发之难 2012-05-31 23:57 华夏之火

兄台的面向对象思想还是停留在这个几大原则的初级阶段。在下现在写代码,才不管什么原则,大多数类都能严格地保持自身的独立,然后再用顶层代码将这些类组织起来@春秋十二月
  回复  更多评论   

# re: 试论C++类库开发之难 2012-06-01 00:08 春秋十二月

@华夏之火
呵呵,我倒想看看你的代码  回复  更多评论   

# re: 试论C++类库开发之难 2012-06-01 00:15 华夏之火

以后有机会的,我会将一些不涉及版权问题的代码发上去。之前一时技痒,也在博客上写了一点玩具代码,唉,那些代码,现在看来,自己都觉得难受@春秋十二月
  回复  更多评论   

# re: 试论C++类库开发之难 2012-06-01 00:34 春秋十二月

好的 我期待 相互学习 共同提高  回复  更多评论   

# re: 试论C++类库开发之难 2012-06-03 00:42 10年码农

"只是,人生何其宝贵,将它们浪费在C++上,实在有点不值得。", 对于一个日复一日,年复一年,打算写到老的码农来说,用C++是最能积累经验的语言。

C++已经深入骨髓,没办法改了。  回复  更多评论   

# re: 试论C++类库开发之难 2012-06-04 00:03 华夏之火

我也深受C++毒害,咱俩算是同病相怜@10年码农
  回复  更多评论   

# re: 试论C++类库开发之难[未登录] 2012-06-04 15:59 chen

test www.baidu.com  回复  更多评论   

# re: 试论C++类库开发之难 2012-06-05 09:36 nullpointer

缺少好用的,高质量的类库确实是C++开发者心中永久的痛。。。  回复  更多评论   

# re: 试论C++类库开发之难[未登录] 2012-06-06 13:08 bluesea

@YzL
同意,尤其C++能做到“特性”之间的“松耦合”,基本让你可以做到一定程度上的“随心而欲”:)  回复  更多评论   

# re: 试论C++类库开发之难 2012-06-16 17:04 jrry7

不是语言问题,类库需要一个大公司推广投入。c++不属于某个公司,同样 c 也没有一个通用大类库。

另一个原因,大类库,通常包含很多操作系统相关的东西。如果要做到跨平台,肯定不如原生来得快,特性也不如原生的丰富。java这种不在意性能的语言,人们不太计较。如果是c++,肯定就颇有微词. 人们用c++的目的,就是要全面控制系统。如果跨平台抽象,某些细节就无法控制,结果还是自己开发基于原生平台的库去了。所以像 qt 这样优秀的库,还是无法广泛使用。  回复  更多评论   

# re: 试论C++类库开发之难 2012-06-18 09:21 华夏之火

@jrry7
也许C++本身就不容许一统天下的东西存在。它喜欢自由、多样化的世界。就算没有性能的要求,开发人员都有自己喜欢的风格口味,众口难调  回复  更多评论   

# re: 试论C++类库开发之难 2012-07-09 16:37 哥没注册

@YzL
BOOST这些东西,不是说不好,而是因为他没标准化。
其实对大多数非高端的程序员来说,关心的不是有没有菜,有多少种菜,而是面前是否有盘菜。
C++程序真的很尴尬,面前只有一盘STL算盘大菜。其他实用性强点的库,多,多得眼花缭乱,多得没有3,5年经验根本无从选择
  回复  更多评论   

# re: 试论C++类库开发之难 2012-07-09 17:09 华夏之火

说得好,关键是这盘菜是否标准化,能否到处通吃。@哥没注册
  回复  更多评论   

# re: 试论C++类库开发之难[未登录] 2013-01-10 17:43 xxxx

不同领域有不同领域的应用。不会用java去写操作系统和数据库,也不会用c++去写应用领域的快速开发程序。
这样评判c++实在是比较好笑的事情。  回复  更多评论   

# re: 试论C++类库开发之难 2013-11-02 02:52 vipcxj

有一点还是很赞同LZ的,有时太灵活也不是好事。选择太多往往使人瞻前顾后,影响开发效率。我写代码最头痛的就是变量,函数的命名,总是在考虑标不标准,是否具有代表性,有时一个大小写都要犹豫几下,要是我能毫不犹豫的命名,肯定开发效率提高一倍。事实上有太多选择时,瞻前顾后是必然的,并不是靠意志力就能克服的。所以如果给C++IDE加个功能,限制C++语法,去掉绝大多数不常用的功能,只有当找不到替代时才暂时放开限制,估计能大大提高开发效率。  回复  更多评论   

# re: 试论C++类库开发之难 2014-05-03 12:06 无雪

楼主只做过码农,没有真正做过一次真正的程序员,所以才有此说,这在中国太普遍了,因为在中国还真的没有几个公司需要写系统级的软件,当你需要写系统级软件(既要软件的高性能又要软件的高可维护性,还涉及很多底层的处理)时,才会真正用到C++(含C),假若只是写一点应用软件,你还是用其他的吧。

你所说的所有问题,不是C++的问题,而是你的写软件的水平问题,至于所谓的选择太多,正所谓条条大路通罗马,你自己选择一条路就是,没必要既想东嫁又想西宿。  回复  更多评论   

# re: 试论C++类库开发之难 2014-05-03 12:09 无雪

@vipcxj

函数、变量的命名有明确的规范,只要按规范做即可,你难道没有读过规范吗?
  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(6)

随笔分类

随笔档案

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜