昨天晚上看到刘江的blog又补充了好几大段,今天早上又看到云风的人肉trackback,果然还是这种话题引人关注。

云风先是提了一下所谓C++带来的思想包袱(文言文曰“心智包袱”)问题,然后重重地引用了Linus的话:“关键是设计”,其实他是在暗示:好的设计C相同能做出来,不劳C++大驾;而C++一旦出面,就要让人背上额外的思想包袱。

我明白地表个态,在系统级程序设计中,事实就是这种。

别小看这个思想包袱,大部分,甚至绝大部分C++程序猿过不了这一关。相反,做系统级开发,C是差点儿没有思想包袱的语言,说白了就是刺刀见红,你想要啥你就去写啥,它给你的不多也不少,没什么干不了,也没什么非让你背着不可。
     
     我早在N年前就发现自己敲代码速度慢,我当时对STL远比周围人熟悉,照例说长缨在手,应该效率 非常高才对。结果发现不是,敲代码的时候特别没自信,总在想:“这样固然是能够work了,但恐怕有更好的方案吧,会是什么呢?加个模板參数试试?要么抽象 出一个基类?做一个bridge模式?那么Ownership的问题怎么解决?谁 来负责回收内存呢?移植一个boost::shared_ptr过来吧!可多线程情况下会不会拖慢速度呢?应该不会,可是会碰到循环引用的情况。要么在中 间搞一个weak_ptr把循环链断开?哎呀不行不行,太复杂,别人也理解不了。还是先这样吧,能work即可。” 就这样,兜了一个圈子回来。有的时候,这个圈子不是纯柏拉图式的,我会真的实现不少 “优化” 设计来比对,那个时间啊,花花的就耗在里面了。有的时候确实会获得一些改进,可是多数时候是得不偿失,旁边那些在我看来连C都仅仅是一知半解的家伙採用 “CtrlC-CtrlV-Modify-Debug” 大法,早就冲到我前头去了。这就是“心智包袱”的威力。

近期几年没怎么用C++敲代码,业余时间倒是别的语言用了好几种。大概是体会到这些语言的某些优点之后,对C++就能看得更客观一些了,也琢磨了一下,如 果自己有朝一日又一次跑回去写C/C++,我会怎么干?毕竟如今C++程序猿全球紧缺,工资越来越高,这个问题还是有其现实意义的。正好昨天跟chensh 聊了一会儿,两个人的看法一致,就是採取“ C + Concreate Class + STL”的风格。说白了就是用C来设计,用C++来编码。

这里面的道理是这种,反正如今C和C++都是来做系统级开发,那些华丽的抽象机制用不上,思考解决方式的时候,就以C的方式。注意,C也是能够做基于对 象甚至面向对象甚至组件级别的设计的,可是在C的层面上思考问题,设计能够更精益(lean,如今这是个时髦词),更轻便,更直接。当你构思的设计方案出 来以后,假设当中有些部分,恰好是C++现成做好了,并且使用C++又能够提高开发效率,也没什么明显的副作用,那么就用C++来做对应的部分。比方, COM原来设计的时候就是在C基础上做的,设计的时候发现实际上跟C++实现多态的的vptr + vtable是吻合的,所以后来就主要用C++来做COM开发。其实,为了适应COM开发的须要,微软直接改了C++编译器。非常显然,微软是首先构思好 的设计,然后让C++去适应这个设计。而后来非常多C++程序猿,是让设计去适应C++的那些语言机制,在系统开发中,这个叫做本末倒置。当然这种事情在 应用级别上就不是那么离谱。

实际上回头看看C++早期的历史,最早C++就是把一些C中经常使用的patterns内置到语言里而出现的,早期它以前有效地提高了开发效率。今天应该回头去寻找这种精神。

我支持STL是基于相同的理由。非常多时候,你从C出发得到的设计,也无非就是STL已经实现得非常好的东西。在这个时候,当然能够用STL。尤其是那些算 法,针对C array也是适用的,用accumulate求和,用transform映射,用adjacent_find寻找相等的毗邻项,用 lower_bound和equal_range做二分查找,等等,这不是比手写要爽多了吗?当然,使用STL,还是必须熟悉其背后的机理,没有这个底 子,还是规规矩矩用C算了。
   
 

用C设计,用C++编码的更多相关文章

  1. Android针对不同的手机屏幕大小设计图片资源与编码

    注:本文转载于:http://blog.csdn.net/welovesunflower/article/details/7930248 一些术语 Screen Size 屏幕尺寸: 实际的物理尺寸, ...

  2. 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Huffman编码

    2014.07.06 16:47 简介: 给定一段有固定符号集合S构成的文本T,集合S中总共有n种符号.如果对于每种符号,使用一种不同的由‘0’和‘1’构成的位字符串来代替,比如: ‘a’->‘ ...

  3. Atitit.Base64编码原理与实现设计

    Atitit.Base64编码原理与实现设计 1. Base64编码1 1.1. 为什么要用自己的base64编码方案1 2. Base64编码由来1 3. Base64编码原理1 3.1. 具体来说 ...

  4. 哈夫曼(huffman)树和哈夫曼编码

    哈夫曼树 哈夫曼树也叫最优二叉树(哈夫曼树) 问题:什么是哈夫曼树? 例:将学生的百分制成绩转换为五分制成绩:≥90 分: A,80-89分: B,70-79分: C,60-69分: D,<60 ...

  5. 第16周界面设计PSP总结

    计划:需1周完整完成 需求分析:作为一个观众,我希望能够了解每一场的比分结果,随时跟进比赛进程 生成设计文档:暂无 设计复审:暂无与组员进行设计复审 代码规范:Visual Studio2010 具体 ...

  6. java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**

    在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基 ...

  7. 字符集和字符编码(Charset & Encoding)

    字符集和字符编码(Charset & Encoding)[转] 1.基础知识 计算机中储存的信息都是用二进制数表示的:而我们在屏幕上看到的英文.汉字等字符是二进制数转换之后的结果.通俗的说,按 ...

  8. .NET领域驱动设计—实践(穿过迷雾走向光明)

    阅读目录 开篇介绍 1.1示例介绍 (OnlineExamination在线考试系统介绍) 1.2分析.建模 (对真实业务进行分析.模型化) 1.2.1 用例分析 (提取系统的所有功能需求) 1.3系 ...

  9. 【转】字符集和字符编码(Charset & Encoding)

    相信大家一定碰到过,打开某个网页,却显示一堆像乱码,如"бЇЯАзЪСЯ"."�????????"?还记得HTTP中的Accept-Charset.Accept ...

  10. .NET领域驱动设计—初尝(三:穿过迷雾走向光明)

    开篇介绍 在开始这篇富有某种奇妙感觉的文章之旅时我们先短暂的讨论一下关于软件开发方法论的简要: 纵观软件开发方法论,从瀑布模型.螺旋模型.RUP(统一软件开发过程).XP(极限编程).Agile(敏捷 ...

随机推荐

  1. Delphi的组件读写机制

    Delphi的组件读写机制(一) 一.流式对象(Stream)和读写对象(Filer)的介绍在面向对象程序设计中,对象式数据管理占有很重要的地位.在Delphi中,对对象式数据管理的支持方式是其一大特 ...

  2. Android性能优化---布局优化

    我们从事Android开发编写布局的时候大多数是使用XML来布局,这给我们带来了方便性,这样操作可以布局界面的代码和逻辑控制的Java代码分离出来,使程序的结构更加清晰.明了.特别的复杂的布局,但是这 ...

  3. 《powershell 的版本号所引起的载入 FSharp 编译器问题》基本解决

    <powershell 的版本号所引起的载入 FSharp 编译器问题>基本解决 1.FSharp.Core.dll.不光要 Add-Type,还要在编译中引用.可是,在 VS2012 的 ...

  4. 解决Andriod使用HttpURLConnection 失败问题

    在Android的Activity中使用HttpURLConnection连接到服务端时抛出异常,Access denied.第一个想到是权限问题.然后就尝试将INTERNET权限加上:在Manife ...

  5. iOS_10_tableView的简单使用_红楼十二钗

    终于效果图: 方式1,用字典数组 BeyondViewController.h // // BeyondViewController.h // 10_tableView // // Created b ...

  6. DJ_Java_Decompiler新手入门教程

    首先声明:这篇文章并不是我原创,只是感觉挺有用处,想跟大家分享一下,所以标注为原创,希望能有更多的朋友可以看到,还请原作者谅解. 昨天大D说让我写下DJ入门的基础,今天写了一大半了,结果不小心把浏览器 ...

  7. VS2008下OpenCV1.0的设置

    原地址:http://hi.baidu.com/caicai_coco/item/0f3b23e1742e3f11595dd825 1.下载安装最新的OpenCV版本,我使用的是OpenCV_1.0. ...

  8. tomcat各版本和jsp、jstl、servlet的依赖关系(转)

    Servlet / JSP / Tomcat  Version  Servlet/ JSP    Tomcat  2.5/2.1 6.0.18 2.4/2.0 5.5.27 2.3/1.2 4.1.3 ...

  9. 2013 吉林通化邀请赛 Play Game 记忆化搜索

    dp[ba][ta][bb][tb]表示a堆牌从下面拿了ba张,从上面拿了ta张.b堆牌从下面拿了bb张,从上面拿了tb张.当前玩家能得到的最大的分数. 扩展方式有4种,ba+1,ta+1,bb+1, ...

  10. 探索Oracle之数据库升级七 11gR2 to 12c 升级完毕后插入PDB

    探索Oracle之数据库升级七 11gR2 to 12c 升级完毕后插入PDB 前言:        从Oracle 12c開始,引入了容器数据库的概念,能够实现数据库插拔操作,例如以下图: 如今我们 ...