|
|
发表于 2006-6-25 09:22:00
|
显示全部楼层
Re:小侃一下k&r和ms编程风格
我就针对我之前所提出的问题跟你们一起讨论吧,其实在我发帖的时候就预感到肯定有人驳斥我的说法,就像C++里的auto_ptr标准之争,永远都不会平息
---
你搞错了。关于auto_ptr,没什么争论。auto_ptr只是用于异常时的平滑过渡,不需要什么争论。争论的是smart_prt。
首先是学习困难这点,应该没人反对吧?
---
我反对。我最初学习stl是为了用于编写lalr parser。我没有买专门的stl专著,就买了本TCPL顺手翻翻。大约3天时间,整个库的设计思想和常用接口参数我都能背出来了。我相信其他人也可以。我有一个只用C和VB的同学,只是为了使用ACE而学的C++。他的基本功非常扎实,学stl也就用了一天。一天之后就能自己扩展了stl,用stl风格写了与C风格数组二进制兼容的容器、迭代器,hash容器(那个时候还是C98,stl里面没有hash容器)。
我不反对vector有多么的优秀,但在一般场合它确实没有CArray简洁方便,就单单看帮助文档也会感觉到CArray比vector简洁很多。
---
但是比较使用它们写出的代码,你就会知道vector比CArray简洁很多。当然,如果你只写hello,world。就当我什么都没说。
使用者所需要的方便是指简单的法则而不是强大的功能,正规表达式能取缔一切的find和replace操作,为何又要定义功能独立的find和replace呢?因为总是使用正规表达式去find东西会很不方便。
---
所以stl里面并没有任何正规式匹配的内容。我真是不知道你在说些什么。
再说,使用stl库往往需要一些额外的对象,例如iter,这些都是造成不方便的因素
---
使用iter得到的是高度的抽象,简洁,优雅。任何容器都被抽象为序列,不用再理会它是紧凑容器,松散容器,还是关联容器了。即便从二进制层面上考虑,也和用下标索引具有同样的效率。
而stl库一些命名法则设计不好也是导致不方便的原因
---
stl的命名很好,干净有效。当然,empty的确可以做动词用。不过只要一看它是常函数,那么就一切都明白了。这样的错误也只可能犯一次。
再有关于智能感知的问题,很多人不以为然,我不知道大家有没有用过vc2.0,用过就会明白那种像闭着眼开发的滋味了,我之前曾经放弃过VC转用BCB3.0就是因为它不支持智能感知,VC的IDE对智能感知确实有不少BUG,但模板不支持智能感知也不完全是IDE的问题,因为模板没有实例化是无法实现感知功能的,而要动态实例化模板则必须动态追踪类型,动态类型追踪是非常复杂的概念,它需要遍历所有CPP文件,其所耗时间往往跟编译相当,而且失败的匹配也会经常发生,所以要IDE实现这功能基本是不可能的,VC助手也实现不了这功能。总之,类库比模版库在这方面能获得更好的支持,至少目前是这样,未来很长一段时间也是
---
I 服了 you.模板的智能感知根本不需要实例化。你后面说的什么遍历cpp文件根本是胡扯,连模板最基本的特性——在每个需要使用的编译单元分别进行定义——都没搞清楚就来胡说八道了。哥们,扯编译技术也找对人好伐?我毕业设计是类C解释器,我前面说的那个一天学会stl的哥们在日本大学带队开发编译器。另外,vc2005对模板的智能感知已经很不错了,自己去用用再扯蛋吧。
无可否认,模板的出现令C++踏上也另一个巅峰,然而,C++高贵的身段又有多少人能够分享呢?
---
所以小白最好不要对C++/STL指手画脚。
模板给我们带来了无穷无尽的设计模式,但这些模式往往让人无所适从,它带来的节便性并没有语言的改变来得容易,近年来C++的发展速度已经被其它语言所超越了,C++的应用范围也越来越小,而我们却总是在这些概念复杂的领域里争执不休。我曾经这么想过,模板真的给C++带来巨大的优势了吗?还是说模板让C++走向了一个无底的胡同?这几年微软大力发展其.net计划,.net framework的程序铺天盖地,但.net技术并没有支持C++,可见微软对C++并不感冒,盖茨是做basic语言出身的,他提倡的是简易化编程,而模板并没有让C++变得容易,反观boost,loki,这些库一直没被列入标准,是因为太过于复杂而被拒绝吗?托管C++的出现告诉我们微软的一些想法,当然,制订标准是微软的爱好,但从这样的标准可以看到微软决心,它要彻底改变C++语言,而不是要从模板中提炼出精髓,因为再经典的设计模式也不及一个关键字。试想一下,如果在每个函数或变量前加上一个synchro的关键字就能使这条函数访问实现线程同步,那该是多美好的事情呀,我再也不会看到SingleLock这些奇怪的代码了。别的语言都没有stl,但它们有比C++更短的开放周期,足以证明再优雅的设计也不如实际节便的好。
---
实际上他们只证明了一件事情,人不如故,衣不如新。C++带有大量历史的包袱(对C/老式C++兼容),发展自然就慢。新出现的语言则没有这些问题。我们选择语言只是选择一种工具而已。用合适的工具做合适的工作,是我们唯一不变的style。 |
|