用C设计 用C++编码

《不得不看的两次从C++回归C的高手评论C++》中先是提了一下所谓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算了。

时间: 2024-11-01 06:13:03

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

vb编程设计界面,编码实现附合导线方位角闭合差的计算与分配

问题描述 vb编程设计界面,编码实现附合导线方位角闭合差的计算与分配 用VB设计界面,编码实现附合导线方位角闭合差的计算与分配.各导线边方位角的计算与显示

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

哈夫曼树 哈夫曼树也叫最优二叉树(哈夫曼树)    问题:什么是哈夫曼树? 例:将学生的百分制成绩转换为五分制成绩:≥90 分: A,80-89分: B,70-79分: C,60-69分: D,<60分: E. if (a < 60){ b = 'E'; } else if (a < 70) { b = 'D'; } else if (a<80) { b = 'C'; } else if (a<90){ b = 'B'; } else { b = 'A'; } 判别树:用于描

2015网页设计七大杀手锏

  回顾2014年网页设计领域,我们可以看到一些非常值得关注的趋势:无代码网页设计平台.视差滚动.单屏网页设计等等.虽然很多新潮设计不会持续很长时间,但还是会有少部分会自然演变为网页设计的主流.尤其是随着网页浏览设备的不断更新换代(电脑.平板.手机等),网页设计师必须接受新的变化,并且为这些变化不断修改更新网页,以此带来更佳的网页浏览体验. 为了探索未来2015年的网页设计趋势,本期国外精品翻译教程就和大家分享国外专业网页设计平台Webydo眼中的2015年网页设计趋势中的七大杀手锏. 1.网页

设计理论:制作网页前端开发的文档

前端开发的文档相信大多数情况下都没有后端的服务描述详细,而大多数测试也仅仅在黑盒测试,所以很多情况下对这片文档的描述都廖廖无几. 前端文档缺失的原因 前端开发的文档相信大多数情况下都没有后端的服务描述详细,而大多数测试也仅仅在黑盒测试,所以很多情况下对这片文档的描述都廖廖无几. * 前端开发的代码分散--没有规范化,没有很好的设计,大多数人仍以业务为主的开发方式.* 测试人员对前端仍然处于黑盒测试,有没有文档都不影响到他们的测试进程.* 一旦业务定型,用传统方式的文档模式,很难复制到前端开发来.

.NET初学者架构设计指南(一)Hello world的时代

中学的时候,学校里开设了电脑课.当时的电脑还是一种比较希罕的东西,学校里的电脑一共就十几 台,还专门找了一个大厅摆放这些机器.厅里面铺着厚厚的地毯,整天都拉着重重的窗帘.每次上课前 一天,我们需要沐浴更衣,剪好指甲.上课时大家都穿上鞋套,排好队伍,列队进入机房.然后各位同 学坐在座位上,在老师的指挥下,拿出一张五英寸的软磁盘,磁盘里安装着DOS操作系统,插入电脑的A 驱动器.然后依次打开显示器.主机电源,在一阵吱吱声中,等待着电脑的启动,进入一个充满了幻想 的神奇世界. 我就是在那个时候写出了第

四个有害的Java编码习惯

程序中的编码风格让我们的编程工作变得轻松,特别是程序维护员,他们要经常阅读其他人编写的程序编码,这一点尤其突出.编码规范从根本上解决了程序维护员的难题:规范的编码阅读和理解起来更容易,也可以快速的不费力气的借鉴别人的编码.对将来维护你编码的人来说,你的编码越优化,他们就越喜欢你的编码,理解起来也就越快. 同样,高水平的编码风格(例如固定的封闭结构)目的在于改善设计和使编码更易于理解.事实上,最后有些人会认为改善设计和提高编码的易读性是一回事. 本文中你会看到一些流行的编码风格被面向读者的更易于接

字符集和字符编码(Charset &amp; Encoding)

--每个软件开发人员应该无条件掌握的知识! --Unicode伟大的创想! 相信大家一定碰到过,打开某个网页,却显示一堆像乱码,如"бЇЯАзЪСЯ"."�????????"?还记得HTTP中的Accept-Charset.Accept-Encoding.Accept-Language.Content-Encoding.Content-Language等消息头字段?这些就是接下来我们要探讨的. 目录: 1.基础知识 2.常用字符集和字符编码 2.1. ASCII字符

换个视角看 Maven:一个领域平台的优美设计

作为一个Java程序员,Maven是再熟悉不过的工具了, 它提供了构建项目的一个框架, 在默认情况下为我们提供了许多常用的Plugin,其中便包括构建Java项目的Plugin,还有War,Ear等.除此之外还提供内建的项目生命周期管理. 以上是我们最熟悉的maven的一面. 下面我们要从领域平台设计的角度,分析Maven的优美设计,为我们做领域平台化提供参考,最后我们再来思考如何做招商的领域平台. Maven是领域驱动设计实现的,作为一个强大的项目管理构建平台而实现 我们先会介绍maven的基

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

一.基础知识 在了解各种字符集之前我们需要了解一些最基础的知识,如:编码.字符.字符集.字符编码基础知识. 编码 计算机中存储的信息都是用二进制表示的,我们在屏幕上所看到文字.图片等都是通过二进制转换的结果.编码是信息从一种形式或格式转换为另一种形式的过程,通俗点讲就是就是将我们看到的文字.图片等信息按照某种规则存储在计算机中,例如'c'在计算机中怎么表达,'陈'在计算机中怎么表达,这个过程就称之为编码.解码是编码的逆过程,它是将存储在计算机的二进制转换为我们可以看到的文字.图片等信息,它体现的