转载自:http://www.cppblog.com/weiym/archive/2013/04/27/199781.htmlhtml
发现厚积薄发中有不少值得学习的东西 故引用之:程序员
最近有机会看号称是公司最核心的代码, 由于这个代码之前一直是美国那边保密的, 这么重要的代码会是啥样子?
真正拿到手大体看了一下后却挺失望的,由于该代码风格基本上是我刚毕业时的C++风格----带类的C,单从代码上看写的挺滥,里面没啥设计模式, 也没有用模板, 代码里面甚至一个函数能够写上近千行。
这么重要的代码, 居然是这种风格,挺郁闷, 由此思考好的C++程序应该是什么风格?
C++由于自己支持多种范型设计(面向过程, 基于对象,面向对象,普通泛型,模板元编程等), 使得C++的程序风格和其余语言相比更加多种多样。因此有人评价C++像一把瑞士军刀, 什么功能都有, 你想拿它当什么刀使,它就能成为何刀, 因此它很强大,强大的同时也意味着复杂。其余语言,好比Java/C#主要只支持面向对象,这样他们的风格就很统一, 不管是标准库,框架仍是应用,都是以对象,接口和模式为主导。 可是C++程序就不同了, 能够说C++程序风格没有固定的标准, 每一个人根据他的经历和使用的框架,会有彻底不同的风格, 网上别人总结了一些C++程序风格:
1. 经典C++流:类是核心,例程多用C Runtime的,不多用模版,通常是正统教育的结果。
2. 古典C流:基本上当C用,偶尔用用对象,不使用异常,喜欢怀旧。
3. MFC流:秉承MFC的风格,主要使用MFC/ATL对象和Win32 API,不喜欢STL,用不少的宏把IDE的语法提示模块折磨到崩溃。
4. Portable流:以C Runtime和STL为主要工具,使用类和模版,不跨平台毋宁死。
5. Functional流:以模版和STL为主要武器,大量使用函数式语言的设计方法,并号称这才是真正的C++。
6. Win32流:多使用全局函数,偏心Win32 API,但不排斥C Runtime,一般喜欢轻量级的程序,因此身材也比较苗条。
7. Java流:全面使用Java的风格,不能允许任何全局成员,但容许使用STL的集合类,写不少叫Factory的类。
8. COM流:喜欢AddRef()和Release(),大量使用接口,隐藏一切能够隐藏的东西,诵经的时候要把上帝替换成COM。
9. 戒律流:追求完美的C++程序,计较每个const和throw(),极力避免不安全的cast,随身必定要带一本ISO C++手册。
10. 混沌流:其程序无常形,无恒道,变幻莫测,吾不知其名。
上面确实总结了咱们常见的一些C++程序风格,相信大部分C++程序员均可以再里面找到本身曾经或如今的影子。另外每一个人C++程序风格不是一成不变的,随着他的项目经历会不断的变化。好比通常人刚毕业时的风格都是带类的C,代码风格偏向面向过程; 后来随着对面向对象的深刻, 慢慢地会使用模式和接口来设计,此时代码风格偏向面向对象; 再后面可能会深刻STL和泛型,甚至模板元编程, 此时代码风格使用模板泛型; 最后有些人可能会以为过分的关注面向对象的设计模式和模板的泛型设计, 会让人偏离对要解决的问题自己的关注, 最后他的风格又回到了原始的C或是刚毕业时带类的C的风格。
从上面能够看到,对于C++程序风格,咱们很难定出一个比较统一的标准,可是我想咱们能够根据咱们要解决的问题不一样而使用不一样的风格。下面是我我的的一些见解:
(1)C++底层语言基础库(STL, Boost)以泛型为主导, 以高效和通用为设计原则, 这方面我想你们已经达成共识。
(2)C++应用基础库和框架以面向对象和泛型为主导。基础框架通常对扩展性和性能都有必定要求,对于框架通常咱们是大量实践经验的总结,因此咱们基本上已经知道它的全部可变状况, 因此理论上咱们能够进行精致的设计,而后经过模板参数的Traits和Policy来分离全部可能的状况,框架自己也有必定的复杂性,须要面向对象来封装和解耦, ATL是这方面做为COM组件开发基础库的成功例子。基础框架以高效,专用和扩展性为设计原则。
(3)C++应用层以面向对象为主导。应用层逻辑是多变的, 理论上你也能够采用模板参数的方式来应对变化, 可是应用层的变化很是复杂, 不少事不可预测的, 因此你不可能以模板参数的方式预测到全部可能的状况。另外C++如今尚未对泛型Concepts的描述机制, 致使模板代码比较难懂。在多变的应用层大量采用模板显然不是一个好的选择。 另外模板在应用层的大量使用也没有比较成熟的经验, 而面向对象和模式已是很是成熟。应用层以低耦合,灵活应对变化为设计原则。
(4)C++模块(DLL)间的交互则以C方式API或是仿COM(Interface+Factory)为主导, 模块接口和交互以简洁和二进制兼容为设计原则。
总之, 咱们应该灵活应用C++各类风格和范型的特色, 采用 ”多范型“ 程序设计的思路来解决问题, 而不是采用单一风格。
最后,回到我最初的公司核心代码, 该代码是用来解决某个特定问题, 显然与通用性和可扩展性关系都不大, 也就不须要所谓的模式和模板了, 实际上你越往操做系统底层, 你离这些抽象的东西就越远, 因此Linux之父才会给C++差评。编程