反之就麻烦了, 说要加个什么功能, 开始读代码, 不好好将第三方库的设计思想,
API 看一遍, 会读不懂, 如果是第三方框架库, 更惨, 要看的东西更多, 到时候就
会发现, 已经读了三天的代码, 还是不知道系统到底怎么运作; 自己内部有强大的
基础库也是一样; 用了很多高级特性也会导致代码不简单平凡.
这个和 C++ 标准库太小, 高级特性太hack 很有关系, 虽然 Java 有很多其他缺
点, 但是这方面 C++ 确实太差.
国内从业人员素质的参差不齐,有这样的结果也是很正常的。
C++语言很多领域都没有一个神一样的标准存在,大多商业颜色比较浓重的语言(JAVA/C#==)都由一个领袖提供一套事实上的标准,而C++不具备这个条件。
最具有这样气质的C++库实在太少了。2008/4/24 Wang Xin <cber.w...@gmail.com>:
大量使用boost这样"强大"的库,最终导致的结果十有八九不会是代码简洁,而是整个team内部混乱不堪,项目迟迟不能交付(引自某位在某家对于C++使用颇激进的公司内的朋友的原话,该公司的名我就不点了,反正是业界著名的一家公司)
所以我倾向于只用 boost 里面2,3分钟可以学会使用, 出错的编译信息也不会难到
天书一样看不懂的部分.
> 话说读懂代码,你找个不熟悉业务逻辑的人来读,虽然代码容易看懂了,如果项
> 目没有健全的单元测试,很有可能新人改个东西,把系统干掉了。
> 而反观boost,实际上boost对代码起到的作用不仅仅是提供了特性,更是简化了
> 很多操作逻辑!
>
单元测试, 那是两回事, 用boost 仍然必须有单元测试不是 ?
至于简化逻辑, 是通过 非 well-known 的知识, 难以检查的出错信息简化的逻辑,
是有成本的.
--
金庆
欢迎访问:金庆的专栏 ( http://blog.csdn.net/jq0123 )
欢迎加入:上海程序员 ( http://groups.google.com/group/programmers_sh )
"国内",记得我没有在前面提过那家公司是国内的公司吧
那家公司是一家global的公司,而且据我那朋友说,大部分的麻烦其实是来自他们国外的colleague
2008/4/24 Wang Xin <cber.w...@gmail.com>:"国内",记得我没有在前面提过那家公司是国内的公司吧
那家公司是一家global的公司,而且据我那朋友说,大部分的麻烦其实是来自他们国外的colleague
怪不得耳朵发烫,一上来就看到这个。
汗颜~
在08-4-28,wing fire <wing...@gmail.com> 写道:2008/4/24 Wang Xin <cber.w...@gmail.com>:"国内",记得我没有在前面提过那家公司是国内的公司吧
那家公司是一家global的公司,而且据我那朋友说,大部分的麻烦其实是来自他们国外的colleague
怪不得耳朵发烫,一上来就看到这个。
汗颜~
汗啊,原来你来了……
偶不多说了,剩下的交给你了
2008/4/28 wing fire <wing...@gmail.com>:
但不能一棍子打死吧,Boost里的很多东西还是值得尝试的~~那个不提倡使用STL的同志还真是非常激进啊,呵呵
2008/4/28 Wang Xin <cber.w...@gmail.com>:在08-4-28,wing fire <wing...@gmail.com> 写道:2008/4/24 Wang Xin <cber.w...@gmail.com>:"国内",记得我没有在前面提过那家公司是国内的公司吧
那家公司是一家global的公司,而且据我那朋友说,大部分的麻烦其实是来自他们国外的colleague
怪不得耳朵发烫,一上来就看到这个。
汗颜~
汗啊,原来你来了……
偶不多说了,剩下的交给你了呵呵 你是连STL都不鼓励使用的,我还没到那个境界 。我自己是不自觉地对于自己不能彻底理解的东西保持审慎的态度。但是,大多数人不是啊。
Justin L wrote:
> 窃以为,编程如果是艺术创作,那如何使用C++,就如同画国画了。拿捏得体,张弛有度。
>
> 写了的程序,还要退回一步看一看,有些地方一定要留白,有的地方一定要重彩----这也是国画中的重点。
>
>
>
2008/4/29 lbaby <lba...@yahoo.com.cn>:
现在的项目我没有什么主导权。所以,只能就我以前的经验和个人项目的做法来谈。
1.单元测试库要尽量少地增加开发人员的负担。额外负担必须尽可能直白,傻瓜化。
市面上的许多讲到单元测试的书都是以XUnit为蓝本的,这导致CppUnit的接受程度颇高。CppUnit中规中矩,四平八稳,但不够犀利。个人认为boost.test最简单,只要一个BOOST_AUTO_TEST_CASE就可以开始了。CppUnit则要复杂一点,而这种复杂性是多余的,甚至是有害的。用CppUnit的时候,我看到有人为了共享测试代码,随便在test case里面加函数,然后复用,结果导致case不独立。boost.test倾向于不要建立.h文件,所以要复用不方便(或者,不习惯在Cpp中复用),反而不容易犯错误。
2.实施单元测试,必须能够让程序员看得到好处并尽快受益。新项目必须尽早引入单元测试,要早在正式编码之前。
想立刻让UT变得完美是不可能的,行政命令也不会有好结果。在推行单元测试的时候,教育很重要。必须让同事能理解单元测试为什么有效,如何工作,UT编写准则之类的问题。另外,在工作多年的程序员(对UT缺乏认识的)中推行单元测试,阻力更大。更要注意教育和反馈。最好的反馈就是帮助他们从单元测试中获益。例如,修改更轻松,思维更面向接口,bug更少,代码更容易理解等等。作为推动者,有义务去主动发现这些改善之处并积极地反馈给程序员。从而增强应用UT的信心和意愿。
3.必须充分自动化。
UT的任务之一是给代码编织一层细密的保护网。程序员应该认识到,单元测试是为自己服务的,所以,我们要的是完成任务而不是展示。能够自动地完成任务则是最好的。如果单元测试过多地干扰程序员的正常思考,就会招致更多的抵触(抵触总是存在的)或敷衍。敷衍是可怕的。我向来是把单元测试的运行作为build的一个步骤的。成功的单元测试不需要输出任何信息,最多在全部passs的时候给个OK就足够了。图形界面的测试工具在我看来也是鸡肋,新手的玩具而已。图形界面既不利于参数化运行,也不方便自动化,实在是降低开发效率的杀手。
4.不要追求完美的UT。
不是所有东西都很容易测试。UT要求被测试的东西可重现,可观测。 基本上,大部分的物理操作因为缺乏可重复性或可观察性,很难测试,例如database,GUI (注意,这不意味着在实现一个GUI库或db driver时就不能做UT了)。勉强UT全覆盖,既不现实,也不实惠。并且,这很可能让UT变得复杂,高成本,这是非常危险的和不值得的。我的主张是,很难测,那就不测,但要正确应对。我的做法是将难测的部分隔离到一些抽象层当中去。然后为这些抽象层写MockObject即可测试了。我曾经应用在数据库应用中,并很自然的得到一个良好的数据访问的抽象层,单元测试就只测了这个抽象层。而实际的数据库访问中的物理操作部分,则从单元测试中剥离出去。如果坚持分离物理操作和逻辑操作的话,这个剥离出去的部分一般很小很有限,也很容易测试。相反,如果不剥离,将导致单元测试的结果要依赖数据库的状态。这种额外的依赖性没什么好处。这里的关键是,必须让不可测的部分尽可能隔离,尽可能小,尽可能地将逻辑操作从物理操作中分离出来。被隔离部分所包含的逻辑操作仍然需要写UT。
对于我们已经学过, 会用的人, 自然觉得 pair 不复杂, 问题是, 别人还在山的那
边呢.
张鹏程 wrote:
> 我觉得pair还不错啊,怎么会造成难懂呢?
> 做作一种被发现而不是被发明出来的特性,不自然也是很正常的。但不能否认有
> 时候它会带来方便。
> 我觉得C++的缺点主要是给了太多选择,在这些选择间用到治如其分,是比学习
> 这些特性更难的过程。
>
>
1. cpu bound, 代码量不是很大的程序, 用 C
C 语言简单, 即使你说宏丑陋, 类型 cast 丑陋, 那也是简单的丑陋, 简陋, 而不
是复杂得要死的丑陋
2. 不是 cpu bound, 而且不用担心反编译的程序, 用 python
不想尝试 ruby了, 因为 python 简单
3. cpu bound, 或者担心反编译的程序, 用D + Tango
D 语言和很多语言比, 不简单, 但是 Tango 简单.
4. Javascript 这个没有办法了, 非用不可, 这个东西简单用, browser 兼容性不
好, 用类库, 复杂度又提高了.
回过头来, 再看 C 的做法, 要写通用算法, 用 void * 指针, 效率或者可能低一
点, 但是, 至少不用学习一大堆前置知识, 才能使用不是 ? 类型安全? 针对业务
类型再封装一下就不就可以了 ? 程序也容易读得多.
用C做一个算法和数据结构, 想要追赶 STL 的效率, 直接 copy & paste 代码进行
修改好了(或者就 copy 自 STL), 代码冗余是罪恶 ? 反正类似 STL 里面的经典代
码, 都已经成熟了, 算法也没有什么改进余地了, 弄完了就当作 readonly 的东西
扔一边, 反正以后也用不着改.
现在我觉得 代码冗余的罪恶 < 代码难读的罪恶.
翁翊成 wrote:
> 如果连pair都觉得很难。。。。
> 那Tuple看一眼就会翻白眼了。。。
> function一棒子就把他打晕了
>
呵呵,正如scott书中所说的。
C++是个语言的大集合,4大标准:兼容C/面向对象/泛型编程/STL。
确实造成了C++的极大的复杂性呀。
但是STL既然作为语言内置的标准,不应该因为使用这标准内的东西,而在程序员之间造成沟通障碍,不是么?
有沟通障碍的我认为还是恶补一下好:)
我一直在努力的学习C++, 最近被GP给搞得快爽死了, 同时我工作也是在维护代码,我看我们这个小公司的代码结构极其混乱,什么多态,模板,stl
根本没人用, 加上今天我看论坛里面有人问有多少人用boost库,好多人在工作中都没用,难道C++的这些高级特性真的成了摆设吗?到头来最重要的还
是良好的编程风格,高效的算法,对业务的精确理解能力,C++的这些高级玩意对我们的时间工作有多少帮助? 似乎实际上我们大多数时间并不需要这些高级
的特性。
大家都有同感吗? 刘老大出来解释解释。
每一种高级特性都被引入的理由,
但是越多的高级特性会带来越陡的学习曲线以及相对越大的错误使用的概率.
一般来说,是人都有学习的惰性,偏向于用自己掌握并熟悉的技术去解决问题.
这也常常是技术代沟出现的原因.
此外,高级特性不一定导致难读.
比如stl的那些algorithm,我觉得反而比c的循环好理解的多
--
张沈鹏,在路上...
http://zsp.javaeye.com/
感觉c++最大的问题是企图不改变语言本身而去用库解决一切.
这样导致了所谓的modern C++的各种奇技淫巧有了用武之地.
反观python,不断在语言本身上寻求改进,不断加入新的语法去取代原来的奇技淫巧
举一个简单的例子
python原来一直没有类似C的?:运算符
但是大家发明的 A and B or C的奇技淫巧来模拟这种运算,但是这样做也带来许多副作用,和C++中一样一不小心就会犯错.
到了python2.5加入了这样的语法
1 if 2>3 else 4
OK,一切都简单明了了.
同样,试想一想,如果C++语言本身提供了foreach,还需要去用非常hack的写一个Boost::foreach吗?
如果C++本身提供了lambda,还要挖空心思的写一个Boost::lambda干什么.
所以,个人认为,modern C++的奇技淫巧弊端的根源在于C++标准委员会的对语言本身变革/库选择保守(或曰谨慎).
而造成这种现象的原因又在于C++标准委员会和W3C一样,自己只负责指定标准,不提供实现.
从这种意义上说C++的弊端和Javascript兼容性的弊端是一样的.
此外,最近看<<Imperfect C++>>,上面提到了一个观点,因为需求的多变,所以不存在完美的封装.
而C++社区总有一种完美主义的DRY(Don't Repeat Yourself)的倾向.
从而导致抽象越来越高层,越来越难以理解.
反观python,从功能出发,不去执着于形式上的完美主义.这也是造成代码可读性区别的一个原因.
总结一下,
C++那些新潮的东西可以拿来用,不过千万不要去模仿他写代码,因为不是所有人有向你一样喜欢没事研究C++的角落特性:)
复制粘贴代码没有书本上说的那么可怕,过度抽象是罪恶的.
此外,把C++当脚本用也是罪恶的.
> > 每一种高级特性都被引入的理由,
> > 但是越多的高级特性会带来越陡的学习曲线以及相对越大的错误使用的概率.
> >
> > 一般来说,是人都有学习的惰性,偏向于用自己掌握并熟悉的技术去解决问题.
> > 这也常常是技术代沟出现的原因.
> >
> > 此外,高级特性不一定导致难读.
> > 比如stl的那些algorithm,我觉得反而比c的循环好理解的多
> >
>
>
>
>
>
> >
>
--
张沈鹏,在路上...
http://zsp.javaeye.com/