ITnews 版 (精华区)

发信人: petrel (紫燕*自在飞花轻似梦*燕燕于飞), 信区: ITnews
标  题: C++、C++学习之我见 RedStar81(原作)
发信站: 哈工大紫丁香 (Sat May  3 01:02:08 2003) , 转信



 C++、C++学习之我见    RedStar81(原作) 
  
关键字     C++、GP、STL 
  



-----------------------------------------------------------------------------
           声明:这篇文章是本人一段时间思考、认识和言论的自我总结
                 纯属个人观点、经历的描述,紧供参考
                 当然也欢迎大家[对本人]和[文中的观点]提出指点:)
-----------------------------------------------------------------------------


  有人认为后期的C++趋向学院派风格,走进了一味追求技术和难度的误区,
逐渐脱离主流的Programmers.
  有人认为C++由于复杂度导致在现代软件工程中的地盘不断缩水.
  也有人认为,C++无任对特定领域应用还是研究来说,都足够的优秀.

一、面对Object-Pascal、Java、C#等语言,还需要C++ ?

  首先,就方法学来说,不可否认,OO方法学本身具有构造的系统随着工程的进行复杂
度膨胀速度惊人.而且,对于上点规模的工程,为了构建OO系统,在OOA、OOD阶段,设计
者需要极高的水准.而以OOP为一典范亦作为OOP代表的C++在语法语义的设计上明显采用为
了功能而不惜增加设计复杂度的策略.然而这一切的复杂,自然带来了好处,包括系统的可扩
展性、可重用性等.这里好象存在一层很微妙的关系,上规模的系统为了可扩展性、可重用
性等优点选择OO方法学,然而在OOA、OOD阶段就需要极大的投入(也许在00方法学中,A和D在
软件工程中的地位体现的更明显吧~).

  这个世界关于语言之间的讨论可能时刻进行着,个人一直认为:
1.首先每种语言有自己的适用领域,就应用而言,没有必要将语言勉强的拿到一起比较.
  构建企业信息系统,自然会选择Java、dotNET或其它的方案(事实上,这种系统一般应
  该多种语言协同开发,以获得部件性能最佳).可能多种语言同适合某个项目,那么具体就
自己裁决了.譬如做一个信息管理系统,选择C++环境的绝对很少,PB或Delphi、VB都是不错
的选择.在初学习阶段"因爱而选(更多的具有偶然性或者与身处环境有关)"、对于开发者基
本是"因用而选".在成熟后,"因用而学"我感觉是根本也是最实际的指导原则.

2.关于语言复杂度的问题:语言是工具,是不需要也不能太复杂的.我一直支持语言应该朝专
业化(这里指针对义务和特定应用场合)和简单化方向发展.这才是语言的本质之所在.业务
是软件实施的根本.对于软件开发着来说很多情况下,业务是最难搞定的,或者说,用软件来
真实细致安全的模拟业务是很困难的.前几天,学籍管理科的老师还跟我说,他们的一个学籍
管理软件让两个研究生不断的完善,三年才算[完全符合他的业务要求].如果你只是耳闻某
某语言何等的复杂、难学而学之,那么可能你错了~就个人而言,为了技术而技术是不可取的
:)

3.然而这个世界是现实的,不如你想象的那样.并不是所有领域都有简单、强大、贴近业务
 的语言.在这个层次上说,对于献身企业级信息应用系统开发者,Java、C#、Object-Pasca
l等的确是福音~~然而在系统软件和其它对性能、控制程度要求较高的如
 工控系统、高性能计算,实时系统,军用软件等领域可就缺不了C++(C)(不过这些领域  
明显的专业知识占绝对部分的重量).可见,紧从语言上说,C++(C)依然占据着一片天地. 严
格来讲,C是作为C++的一竞争对手出现的(不管这些了:)).


二、C++是否真的走进了追求技术的误区
  
  自从,GP思想在C++上的第一个作品STL正式纳入标准库,关于C++走进技术误区的流言便没
有停止过,Boost、作为GP领军人物之一的Andrei Alexandrescu提倡并实践着(Loki)的编译
时编程、将设计模式思想引入库设计,使得流言快被提上日程讨论了:).
然而,GP真的只是技术吗?我一直认为,就OO来说,本人曾经作过这样的思考:
-----------------------------------------------------------------------------
真正的对象应该至少能够具有:自主的适应环境(维护足够的"意识") 
                            1.自发行为的意识更强
                            2.反应能力更强
                            3.对外有足够的独立性
现在的OO,更像是建立在PO上的,不过是对象代替了函数.
但事实上,无论对象能力多高,过程表现绝对少不了.

Agent :我想是表达和反应能力最强的.
COM : 比Object-Based手法构造出的对象表达、反应、适应能力高很多.
          不过There is no magic.还不过是一般的技巧构造出来的,看透了什么都没有了
:)
GP :不能将它看作无谓的技术追求,[从我们谈论的这个节点看来,它的实质我认为[至
        少]是]:提高了构造的对象的适应能力(不是自发行为能力)的一种手段.
     Andrei Alexandrescu的《Generic Programming :类型的else-if-then机制》 
     这篇文章可作为一精彩的证明.
-----------------------------------------------------------------------------

三、C++怎么学?
  
  首先声明:本人对之也只能说略之一二(C++太博大了:))
  孟岩先生曾经提过"C++需要自由的心",我要说"C++需要自由的心和手",我敢肯定我想的
自由和孟岩先生的自由是不同的.
因为我的自由就个人诠释是 :"用自己的思路来自由的写验证性的usecase"
  就个人的学习心得而言 :

1.在你学习C++的过程中,你首先需要扎实的实践一本C++基础教程,这个教程不在深而在全
.使你能够全览之.最好结合基本数据结构来练习.不要整天Hello World~~Hello MM的.

2.再下来你需要《(More)Effective C++》,它使你可以对C++也多了份思考,也了解到一些
技巧和误区,不过,你需要同步实践,不然可能一时你并不能真正掌握这些技巧、避开误区.


3.提高,你需要:(下面的书可能已经讲烂了:))

  《Design Pattern》 :个人感觉,设计模式虽说是一种思维方式,具体实现上,只是
                        对OOP语言的发掘和巧妙组合而已.而且这里组合是主要的,
                        特性是有限的,这本书中有几个模式没用虚特性的? 
   C++ Standard Document: 在你用它来做专项研究的时候,就会体会到什么才叫真正的
                                          全而深 (自然指在语法和语义的阐述上).
 
  《STL源码剖析》 :没有深厚的功底,想来个闭门造车独挑STL源码是不可能的.
                                  不过,这本说也重在关键技术的讲解和引导罢了~~
                                   这里关于GP和STL的名著不少,本人没看过。不做
品评。
  《 Inside The C++ Object Model》:最具价值的一本书,没了它,C++永远是个迷,哪怕

                                    你浸淫之N载~~
  《Moden In C++ Design》 :这里的很多思路是你自己的思维很难接触到的~~:)
                            我不得不佩服Andrei Alexandrescu.

  市面上其它的C++书籍可牛车载,我感觉除了《The Design And Evolution Of C++》是异
品,值得一读.其它的不建议花太多的时间,哪怕是Bjarne Stroustrup、Stanley B.Lippma
n等的作品.自然,你有时间读更好,反正我现在有点后悔,当初只顾多,不顾深读,反复读.经
典的书不在本数多,在于每本读的遍数多.一经验之谈,BBS上经常有人,在介绍COM技术书籍
时,想也不想的指出,入门级<<Inside The COM>>.是这样的吗?我想,正如Dale Rogerson所
说,将这本书完全看懂,你就是COM专家了~~书中,作者很多话可能你没有注意到,因为你还不
懂之,对之没感觉,一遍翻下来,感觉 哦~~简单~全看了 :) 这些书,跟国内的很多书籍最大
的不同就是
国内书籍的作者写的出,可能自己还不懂:)Copy什么资料上的:)??

4.浸淫一门语言本身的语法语义再久,你不一定能够深入它的精妙之处.
  你需要学习应用这门语言的实作品(技术),你可以研究一些FrameWork或是一些具体的技
术 如CORBA、COM等.就个人而已,有心接触C++十个月左右,对于Virtual的认识有过几次较
大的的改变.在《 Inside The C++ Object Model》中算第一次,在《COM本质论》中关于C
OM对二进制兼容布局需求而用虚机制来解决是第二次,到目前为止,使我对virtual流下最深
刻印象的是在Automation技术中组件由于环境是否有能力分析virtual结构而导致是否需要
分发接口的问题.如果,整天抱着《C++语法语义深入》这样的书,我不知你何时才能真正了
解C++很多的特性.
  即使你可以对别人说上一大套,这行啊~那不行啊~~云云~~:) 

在这整个的过程中,我喜欢这样对学弟说,你需要经常将C++的各种特性在脑中反复混合酝踉
,这也是我强调学基础时,要求教材知识点全的原因.经常的,为了研究某些特性而自由的写
、修改、增加UseCase,是我自认为很好的一个习惯.整天记他人的经验之言,不知几个月后
还记得几层:)?

   也许上面的叙述是概括了些:)?

   总之,我认为学习C++,需要多思考(譬如你想想为什么模板类继承不支持virtual、模板

                                   类继承,基类实例和继承类实例产生的关系是什么
样的)、
                      多写usecase、
                      多将一堆特性混合酝晾(譬如模板类
                                  成员签名、多种嵌套模板类成员签名、嵌套类与包
裹类生命期
                                 控制等等)
                      
                      要尽早选择应用方向(这点很重要,附加个人观点:大多数人认为
理论很
                                         难,可是我要说:应用一样是有难度的:))
.

                      将00工程学中的理论适时的来对照自己的行为.
     

后话:
    上面提到,就应用而已,比较语言的是没有什么意义的.然而我想说的是,不敢想象
没有经过C++锤炼的人,可以深入的研究C#(事实上,我一直也不人为C#比C++好学,只是他
们的深入点是不同的,冒昧说一句,C++中很多难度是人为制造出来的),就目前的情况来说
,还有就是由于C++历史、
社团、资源等因素.

共勉 :           
           因用而择、因爱而择
           学究其深
           勿以善小而不为 :)

 


--

※ 来源:.哈工大紫丁香 http://bbs.hit.edu.cn [FROM: 172.16.8.35]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:6.374毫秒