??xml version="1.0" encoding="utf-8" standalone="yes"?>一本久久久久久久,久久精品一区二区国产,69SEX久久精品国产麻豆http://www.shnenglu.com/susu/archive/2011/03/04/141118.html学习才能q步学习才能q步Fri, 04 Mar 2011 07:38:00 GMThttp://www.shnenglu.com/susu/archive/2011/03/04/141118.htmlhttp://www.shnenglu.com/susu/comments/141118.htmlhttp://www.shnenglu.com/susu/archive/2011/03/04/141118.html#Feedback0http://www.shnenglu.com/susu/comments/commentRss/141118.htmlhttp://www.shnenglu.com/susu/services/trackbacks/141118.html

许多q来Q我在不同的新闻l上p了很多时间与那些想知道如何得到数据库理?DBA)的工作或者如何成长ؓ一名DBA的IT行交谈,现在他们有了工作。这些年来许多h针对如何辑ֈq个目标提出了不同意见。本文即是那些意见的l合q且能够在如何才能出色的完成DBA的工作方面给出好的徏议。这文章同样对于如何让一名DBA变得对老板更有价倹{假如你已经是一名DBAQ那么也怽会希望蟩q文章的前几Dc?br>
我应该成Z名DBA?
  我曾问过的一个问题是一个h应该从事DBAq样的职业么。这个问题ƈ不容易回{,因ؓ它因异。有的h有成Z名好DBA所需要的天赋。而其他hq不认ؓ能够很容易掌握成为DBA的秘诀。DBA职业需要掌握一定的技能。而且q需要其他IT职业所不必需的要求。因此,Z回答q个问题Q我通常l将要成为DBA的h描述DBA职业所必需的要求。下面的D落中,我都以问题l尾。在l箋下一D以前请׃些时间考虑q且回答q些问题?br>  许多人因多原因而立志要成ؓDBA。其中一个主要原因是薪水。DBA是IT业中薪水最高的职业之一。其他hx为DBA是因为喜Ƣ赞?DBA是受到的荣誉Q或者因Z看上d?我个为,成ؓDBA是很值得的。它是一个很有意思,令h兴奋的职业。那么,你把DBA作ؓ一个可能的职业选择的原因是什么呢?
  除非你已l提前准备好了,否则你可能会发现从事DBA职业充满了挫折和令h头痛。一个数据库存在于操作系l和最l用户应用程序之间。同样地Q?DBA必须非常_N他的数据库所在的操作pȝ。DBAq不一定需要知道所有有x作系l的知识Q但是他知道得越多越好。数据库与操作系l联p非常紧密。理解这U关联是十分必要的。DBAq需要知道服务器g以及它如何媄响与帮助数据库。同ӞDBA必须理解应用软g。DBA可能会被要求帮助开发h员创建可靠,健全的数据库应用E序。还有,最重要的也是最明显的,DBA必须十分d的理解数据库引擎Q它是如何工作的Q所有的引擎是如何组合在一LQ以及如何媄响数据库引擎向最l用户和应用E序传送数据的能力。我见过的最好的DBA有非常深ȝ理解而且不仅仅在数据库本w。他们知道一些系l管理与应用开发。好多时候他们在成ؓDBA之前有其中一个或两个背景。无论如何,成ؓ一名合格的而不是出色的DBA也需要许多背景知识。你是否已经做好准备开始学习直C感到已经无法再学下去?
  许多和我交谈q的Q在开始DBA职业旉到困隄人,在尝试着吸收大量DBA所需了解的信息时实际上都会有一些问题。毕竟系l管理员是全职学习操作系l的l节。应用程序开发h员全职学习如何编写好的程序。DBA不仅要非怺解这两种不同的工作,而且q需要花Ҏ多的旉ȝ解数据库的体pȝ构,以及理解每一样东西的每一块是如何l合在一L!听v来是不是很让人畏~?有许多hp|后这hQƈ且把DBA工作看作一w常困隄事情。也有那些传播和理解所有这些信息,q且使用q些信息做出好的Q听hh技术性的军_的h。正如我以前是一名DBA时喜Ƣ说的,所有这些对我来说看上去像一个大谜团。把q些所有的很好的组合在一起就是挑战。你是哪一Uh?

  许多DBA是随时侯命的。他们会在白天或晚上的所有时间接到呼叫去解决他们的数据库出现的致命问题。数据库是商业信息技术基l织的必不可的l成部分。没有数据,没有必要拥有一个计机pȝ。数据推动商业。假如amazon.com的网站不能在数据库中搜烦产品q且假如没有够ؓ他们的品下订单Q那么它会变成什么样?它就不会在商业中存在很久。当数据库down掉,即只是很短的时_公司也会损失重大。基于这个原因,DBA到达现场后必d可能q速的解决问题。许多公司有自己的DBA团队以便可以轮流待命。这些DBA 24x7时的维持数据库应用E序。假如工作需要的话,你准备好随时候命了么?

  一些DBA的职责包括ؓ软g打补丁或者对数据库做些改变。通常Q这些操作不能在公司职员工作的时候做Q因为此时数据库必须q行以便他们能够工作。这意味着DBAl常不得不在很早或者深夜甚臛_末,MQ在正常工作旉以外来完成工作。你准备好在非正常时间工作,或者你在找一个朝九晚五的工作?

  对DBA而言Q需要掌握的一个重要内容就是通常被称?#8220;软技?#8221;的东ѝDBA需要在团队中很好的工作Q通常团队是在变化的,如系l管理员Q网l管理员Q应用程序开发h员,目l理和其他h。DBA要能够用利的英语解释复杂的技术概念,让团队中其他人明白。DBAq要能够在数据库相关问题上指挥团队队员。你的Y技术怎么?

  下面不是全部列表Q但是包括了DBA的典型职?

    · 把监视数据库实例当作每日必做工作以保证其可用性。解决不可用的问题?br>
  · 攉pȝl计和性能信息以便定向和配|分析?br>
   · 配置和调整数据库实例以便在应用程序特定要求下辑ֈ最x能?br>
   · 分析和管理数据库安全性。控制和监视用户Ҏ据库的访问。必要时审计数据库的使用?br>
  · 监视备䆾E序。必要时提供恢复。测试备份与恢复E序?br>
  · 升RDBMS软gq且在必要时使用补丁。必要时升或者迁UL据库实例?br>
  · 通过数据库相兛_作来支持应用E序开发h员?br>
   · 跟随数据库趋向和技术。当可应用时使用新技术。安装,试和评估Oracle新的相关产品?br>
  · 执行存储和物理设计。均衡设计问题以完成性能优化?br>
  · 创徏Q配|和设计信的数据库实例?br>
  · 诊断Q故障检和解决M数据库相关问题。必要时联系Oracle支持人员以便佉K题得到较好的解决?br>
  · 保Oracle|络软g(SQL*Net, Net8, Names, OiD)配置和运行的很好?br>
   · 与系l管理员(Unix& NT)一起工作以保证Oracle相关事务得到很好的处理?br>
   · 为有效的Q定期的l护数据库创ZQ何必要的脚本?br>
  前面各段的问题是Z使你考虑一名DBA该做些什么,帮助你决定这是不是适合你的职业。我q意味着假如你的目标是成为DBAq些会阻止你。我只是试着展现一些事实。我看到q一些DBA一旦被实际工作打击了就一y不振。他们花Ҏ__֊和一些金p得了他们的第一份DBA工作。我个h认ؓq个职业非常有h倹{而且我无法想像现在做M其他的会怎样。所以,q一D帮助你军_q是不是你希望从事的。假如它是,那么你所有去得到?

我怎样得到W一份DBA工作?

   你已l阅M前面的段落ƈ且认为成Z名DBA是一个好的职业。祝Z!我希望你的职业能变成你想像得那么令h兴奋和有意义。那么,你如何找到第一份DBA工作?q个问题我已l听别h问了许多许多遍?br>
  ?0q代早期Q因特网急速发展。它使公司象草一般萌芽。公司蜂拥而至q且开始创Z们在|上的Ş象。几乎所有这些有|站的公叔R需要一个数据库作ؓ web应用的后台。不q的是,当时在该领域却没有那么多DBA。在IT业,DBA变得奇缺。那D|间里Q得C份DBA工作看上d要可以拼?“Oracle”或者可能只是在大学里接触过一学期的数据库p。ؓ了生活变得更好QDBA的匮乏促使公总l有潜力的职员很高的薪水。假如你惌成ؓ一名DBAQ很ҎQ非常容易。你需要做的就是证明你了解什么是数据库然后工作就会比你预期的更早的出现在你面前。ITPUB个hI间!K&d7a

   然后因特|的泡沫破灭了。大量投产因特网的公司破产。许多给公司工作的DBA重新L工作。缺DBA的公司找C名有DBAl验的h比以前容易得多。在21世纪初期Q由于经ƈ不十分稳固,因此生活q不Ҏ(臛_在美国如?。公叔R勒紧了他们的裤腰带。所有这些{化ؓ更少的工作机会和DBA 候选h更少的工作空~?br>  得到W一份DBA工作的最艰难的部分是每一个职位都要求有一些工作经验。如果你从公司的角度出发Q你可以理解ؓ什么对DBA职位而言l验是必需的。假如他没有一点经验,你会付给q个人很高的工资让他L作,l护和运行你IT基础l织的最大最重要的一部分?你的公司会付q一名没有经验的 DBA?q且Q在{待他成长v来的q程中可能会损失上百万美元的收入。对大多数公司而言Q这些问题的{案肯定?#8216;?#8217;。所以,没有l验Q获得你的第一?DBA工作是很困难的?br>
   W一份DBA工作现在成了恶性@环的境遇。假如我没有Ml验Q我怎样才能得到DBA的工作呢?我没有工作的话又怎么能得到DBAl验?q是要战胜的最困难的障。最困难的部分是获得W一个DBA工作。这部分的剩下部分将针对实现你第一个DBA工作的目标给你一些徏议?br>
  提示#1:接受教育?-可能多的学习有x据库的知识。这很可能将占用你正常工作以外的部分旉也精力。参加本地大学D办的数据库培训班。许多培训公叔R会D办数据库理员的培训班。假如你的老板不资助你的学习,那么你可能不得不自己支付q笔费用。许多DBA职业要求臛_机U学或相关专业本U以上学历,因此你必至有那样的文凭?br>
  提示#2:ȝ成ؓDBA?-许多数据库供应商都允怽下蝲他们数据库系l的试版或评估版。下载一份ƈ且在自己的个人电脑上安装软g。练习用数据库。故意破坏数据库q且试修复它。尝试着履行你所能想到的可能多的DBA职责。测试和练你在自己的测试^C的技能这样你可以证明你的数据库理能力?br>
  提示#3:获得认证?--许多数据库提供商都提供自q数据库品的认证。许多公司现在都把认证看作是一U标准。需要记住的一件事是仅获得认证是不够的。通过DBA认证试q不意味着你知道如何管理一个数据库。它只是告诉你以后可能的老板Q现在你拥有了一定的技术。它q告诉你的老板你对DBA工作的态度是很认真的。我看到许多人抱怨他们已l得C认证但是没有l验Q却仍然不能得到W一份DBA工作。认证本wƈ不能使你得到工作Q但它是无害的。即使没有其他的Q在你进行认证的时候你也已l学C许多知识。只是不要依赖认证来l你带来你要扄工作。你需要的比这q要多。但它会在最后帮助你?br>
  提示#4:利用你现有的技能?-许多DBAhpȝ理员背景。其他的有应用程序开发背景。假如可能,查看你能否利用现有的技能来得到工作。现在的目标是Z和你的老板创造一个双赢的局面。例如,让我们假设你已经是一名系l管理员而想q入DBA领域。也怽会找C份工作,q䆾工作一部分旉里可以用C的系l管理技能,q且在剩下的旉里可以你涉及到数据库管理领域。假如你已经是一名某个品^C的DBA但你希望转到其他产品q_Q那么看看你能否扑ֈ一份同时接触两个品^台的工作。这P公司和你都得C惌的。在你定向到了DBA工作后,你可以试着得到一个能让你全职作它的职位,也许q可以在同一个公怸?br>
   提示#5:利用现在的机会?-有时候,一个hq入DBA领域仅仅需要的是正的地方和正的时机。假如你现在的老板有一个机会让你进行Q何数据库的项目,抓住q个Z!M数据库经验就比没有数据库l验要好。让你的理者知道你十分U极的在LM可能的数据库Z。他们就有可能在下次Z到来的时候想C。进行这些数据库目以及看到你要成ؓ一个DBA的望以后,他们可能会决定培训你Q提拔你。许多许多h都是以这U方式获得他的第一?DBA工作Q在q行了一些数据库相关的项目后不知不觉的成Z名较低的DBA。通常当一名DBAd公司后,公司在内部L一个候选hQ假如他们认名候选h是可训练的话?br>
  提示#6:L较低U的DBA职位?-假如你只是ؓ了一个较低的DBA工作Q看到DBA职位的需求描q说他们正在L高DBA或者其他的。所以,让我们严谨一些。你q没有一个高U方面的l验。我已经讨论q了对于q样的职位ؓ什么公怸会考虑你。但是他们会在低U的职位上考虑你。低U的 DBA在高UDBA的指g完成工作。他们摸索窍门。一般来_高DBAҎ据库承担责QQ同时也获得所有的荣誉。但是不要焦急。随着你的事业发展Q你会有越来越多的责Q和得到越来越多的信Q。因Z没有Ml验Q你应该从这里开始启航?br>
   我也听到q一些公司寻找一名高UDBAQ但是到最后,他们实际惌雇一名低U的DBA。你或许希望甌q样的职位虽然你也许没有资格。他们可能还是会军_雇䄦你。但是提前说明你仍然在摸索阶Dƈ且已l是较低U的DBA水^。不要试图欺骗他们让他们认ؓ你是高DBA的水q뀂这只会降低你得到这工作的Z?br>
   q些提示帮助你得到W一份DBA的工作。祝你在L工作时有好运气。当你已l找CW一份DBA工作后,l箋下面的部分来学习如何往下走下去?br>
  我刚得到我的W一份工?现在该怎样?

  贺?你现在是DBA׃部的正式成员?对于q䆾梦寐以求的o人激动的职业Q你准备好了?你的工作才刚开始ƈ且你在学习上已经落在后面。你会发现要成Z名高效的数据库管理员有大量的知识你必L握。你的第一q或前两q将p比以前更多的旉来学习。假如你发现学习知识的数量你大脑超负荷Q那么休息一下,歇口气,然后再回到学习中厅Rؓ了帮助你l箋C去,你可以按照下面的Ҏq行:

  步骤#1: 关系型数据库理论 –q部分我假设你将理的数据库是一?#8220;关系?#8221;数据库。其他数据库模型也存在,但是关系型模式是q二十年工业上占l治C的一U数据库模式。假如你的数据库pȝ是其他的模式Q那么学习它的理论。相x据库理论是十分重要的。它是其他一切的基础。我也看到许多蟩到数据库理职位的h从不惛_学习Ua的关pd数据库理论。不可避免的Q在他们的事业中对理论基的匮乏作为缺Ҏ露了出来。假如你对关pd数据库理论理解得很好Q那么你非常容易的在Q何^台的关系型数据库理pȝ(RDBMS)中{变。我使用Oracle数据库,或者IBM的DB2Q或者微软的SQL Server是无关紧要的。他们都是关pd数据库系l。他们在最底层都在做着相同的事情。区别在于他们怎样d相同的事情。纯_的关系型数据库理论对于较低U的DBA来说q必需的。但是假如你惌越低DBA的水q_是十分重要的。许多大学的教科书都很好的包含了关系型数据库的理论。其中一本被q泛使用的教U书是由Elmasri and Navathe~写的数据库pȝ基础Q?br>
  步骤#2: d的学习查询语a –数据库都有语a让你能够从数据库中得到数据,把数据放到数据库中,以及修改数据库中的数据。对于关pd数据库而言Q这U语a是l构化查询语a (SQL)。这门语a是你与数据库接触的工兗不能让q个工具成ؓ以后学习的障,q一点很重要。在你的试数据库中l习不同的SQL语句直到他们变成了你的习惯。这斚w的一本非常好的书叫做Oracle 9i完全参?Oracle 9i The Complete Reference)由Loney 和Koch~写QOracle Press。每一名Oracle DBA都应该在他事业的早期阅读q本书。Oracle 9i参考手?Oracle 9i SQL Reference manual)是另一个很重要的知识来源。在他们的技术网站TechNet?http://technet.oracle.com)你可以访...t上有一个̎受?br>
  步骤#3: 开始学习基本的数据库管理工?–q难道不是你最开始在q里的原?Z么它在列表的W三?我们试着建造一个知识的金字塔,我强烈的感觉C个h需要知道关pd数据库理论和SQLQƈ且在你学习如何进行基本的数据库管理工作时把他们当作工h使用。这些工作包括启动和关闭数据库,备䆾和恢复数据库Q以及创?删除/ 修改数据库对象。对于Oracle数据库管理而言Q在市面上有大量的书c可以给你所期望的一个很好的体会。这本书是Oracle 9i DBA手册(Oracle 9i DBA Handbook by Loney on Oracle Press)。我知道的大多数DBA都在他们事业的早期不只一遍的阅读q这本书。这里,你应该同旉d理解Oracle 9i 概念指导QOracle 9i理员指|以及Oracle 9i备䆾与恢复指?Oracle 9i Concepts Guide, the Oracle 9i Administrator’s Guide, and the Oracle 9i Backup and Recovery Guide)都来自Oracle文档?br>
   步骤#4: 阅读Q阅读,再阅?–׃你才刚开始你的DBA职业生Q因此你正在开始ؓ你的技能奠定基。这需要一D很长的旉dŞ成,吸收和领会所有你学到的知识。毫无疑问的Q比你资qDBAp多工作要做,因此他们可能不会L腑և大量旉辅导你的学习。你不得不靠自己学习很多东西。这是阅读的目的。市面上有许多书c可以解{许多数据库相关的话题。Oracle Press是Oracle公司的官方出版社Q有大量的Oracle相关书籍。同时也有其他的出版C,如Wrox Press ?O’Reilly Press。你也可以找到Oracle文档来阅诅Rƈ且还有许多网站和新闻l。尽可能多的M使你能够l箋下去。还有,不只一遍的阅读它们可以使你吸收你第一ơ阅L错过的内宏V?br>
  步骤#5: 创徏试案例 –我经常看到初学者问一些很基础的问题,其实假如他们׃些时间来考虑Q这些问题都是很Ҏ解答的。毫无疑问的Q在你开始学习Oracle的时候你会有许多的问题。看看这些问题你能不能自己回{出来。例如,我又一ơ被问到能不能向有唯一性约束的列中插入I倹{最开始,q看上去也许不是很容易回{的问题。但它却是非常容易去试验?只需要创Z个简单的表。在其中的一列,假如唯一性约束。尝试着在该列插入一个空倹{有效么?你应该能够非常容易的回答个问题了。那么,Z么要创徏q些案例?一个原因是q样做可以提高你解决问题的能力。创些案例需要的技能就是解决问题用到的技能。解决问题的技能将会对你的DBA事业有很大的帮助。另一个原因是随着你的事业的发展,你将l常需要创建更复杂的测试案例以便保证数据库和应用程序的成功。在来Q甚至简单的试案例也可以组成更复杂的数据库和应用程序分解?br>
  步骤#6: 找一个良?–一个良师能够ؓ你的DBA生(或者其它类似的职业)引领方向。他们能够给你指C,回答问题以及在你的DBA的成长过E中帮助你节U一些时间。但愿这文章能够在你事业发展的一D|间内起到良师益友的作用。假如你与一名资qDBA共同工作Q那么那个h应该有责Mؓ你的事业q行有益的指对{你也可以同旉择其他的h指导你?br>
  步骤#7: 参加本地用户?–许多跨国家的城市有本地用LQ他们定期聚会讨论数据库相关的话题。假如可能,参加其中一个本地用L。这给你一个与他h怺交流的很好的Ҏ?br>
  我如何能够从一名DBA初学者变Z个具有中U水q的DBA?

   你已l成为DBA一D|间了Q你现在希望你的技术水qx高一阶么?下一步该怎么?首先Q往回看前面的部分,认你已l完成了所有的步骤。彻底理?SQL语言是十分重要的。理解关pd数据库理论和掌握基本的数据库理d也是非常重要的。到如今Q你应该阅读文档和其他书c到已经郁闷了。假如没有,那么你还没准备好l箋深造,增长你的DBA的技术水q뀂假如你已经准备好l了Q我已ؓ你的l箋深造准备了一些方法?br>
  步骤#1: 学习操作pȝ和你的服务器g – 正如我前面所_数据库存在于操作pȝ和服务器g之上。理解这些组成部分如何工作是很必要的。你应该知道如何与特D的操作pȝ相合。你如何删除或者编辑文?假如你的操作pȝ是UnixQ你应该掌握命o行以及Unix命o如何辅助你工作。对于运行在Windows或其他操作系l上而言也是一L。你同时需要对服务器的g有一定的了解。物理内存和虚拟内存有什么区?RAID是什么以及不同的U别是如何生媄响的?Z么数据库喜欢更多的物理硬盘而非一个大盘?你需要知道这些事情以便你能够Ҏ的与pȝ理员进行如何配|好你的服务器以便它能够充分的支持数据库方面的交谈?br>
  步骤#2: 学习应用E序设计因ؓ它与数据库相?– 如前面所qͼ数据库存在于操作pȝ与数据库应用E序之间。你真的需要这两者。SQL语言是如何帮助创建好的应用程序的?l定变量是什么ƈ且ؓ什么他们很重要?Tom Kyte 写了一本非常好的书Q在Oracle应用E序设计上给Z很好的徏议。他的Expert One-on-one Oracle书可?Wrox Press扑ֈ。我强烈推荐阅读此书。他详细的叙qC那些能够生成和破坏Oracle应用E序的东ѝ你需要知道这些,因ؓ你的应用E序开发h员希望从你这里得到指导和数据库知识。学习Q何与应用E序设计有关的知识。也许参加一个关于Y件工E,操作pȝ或数据结构的评班会有好处?br>
  步骤#4: 取得认证 – 也许你的工作q不需要,但是取得认证一定对你有益。作为DBA的每一天里Q你学到了许多新的和令hȀ动的事情。也许在你职业生涯的q段旉里,有几天你没学CQ何新的东ѝ但你仍然有很多要学习。成Z名OCP(Oracle Certified Professional) DBA要求你必dl学C数据库管理所有方面的基础。我发现在OCP考试的学习过E中Q我学到了在我工作中从未接触q的东西。一ơ我学到了我从未到q的一个特D课题,在后来的日子里我p够用那个知识解决问题。假如我从ؓ?OCP考试中学倒它Q那么我永远也不会用那种Ҏ的方法去解决问题。这已经一ơ次的发生在我的面前。有的h可能会说认证实际上真的不值得。我要说它只会对你有益无実뀂所以,d得认证吧!

  步骤#5: 获得一个资源库 – 在前面的部分中,我指出每个DBA都应该在Technet上有个̎受这是你其中一个主要资源。但是同时还有许多其他资源。很多h׃n他们的Oracle 知识。假如你q没有开始,你应该用|络览器去搜烦q收集很多Oracle资源。愿意的话,你可以从讉K我的|站(http: //www.peasland.net)开始。下面是一些Oracle DBA必须了解得网站列?

  Ask Tom –http://asktom.oracle.com

   Jonathan Lewis web site -http://www.jlcomp.demon.co.uk/ITPUB个hI间/HFcu N

  Ixora (Steve Adams) –http://www.ixora.com.au

   Orapub –http://www.orapub.com

  Metalink (Oracle支持|站) –http://metalink.oracle.com

    国内的:

    ITPUB论坛-http://www.itpub.net

    Oracle技术网 -http://www.oradb.net

    CSDNC֌ -http://community.csdn.net

   q有许多其它的好|站

   步骤#6: 开始在不同的新ȝ和论坛上交流 – 也许你已l发C他们Q但假如现在你还没有那么是时候去开始了。有许多的新ȝ和论坛可以回{你的Q何Oracle问题。在Oracle落里还有许多高手愿意和你共享他们的知识。你所要做的就是提问。下面是一个列表包含了可以开始交的最好的因特|团?

  Usenet newsgroups – comp.databases.oracle.server?comp.databases.oracle.misc 是两个可以交的非常著名的世界性的新闻l。他们拥有大量的针对Oracle问题的交卷宗。观看这些组的最好的Ҏ式用新d播员。但是假如你想通过Zweb的方式访问,也可以通过Google搜烦引擎搜烦它?(http://groups.google.com/groups?hl=...atabases.oracle)

  Quest Pipelines – 当他们在最开始还属于软g提供商RevealNet的时候,被称为the RevealNet Pipelines。现在,Quest购买了RevealNet q且拥有Pipelines 。因为Pipelines是中{的Q所以这些是我最喜欢的。你可以在这里找到Pipelines (http://www.quest-pipelines.com/index.asp)?br>
  观察别h是如何经历考验和磨隄是一件好事。假如你有问题,可以自由的在里提出来。假如你要提出问题,通常应该包括一些信息,比如你的 Oracle版本和Oracleq行的^台。这些将会得到有很大的差别的{案。假如你忘记了,会有人提醒你!甚至你不用提问也可以从其他h的答案中学到许多知识。我已经C得多次我之所以能够解决问题完全是因ؓ我记得其他h在新ȝ里问q相同的问题?

学习才能q步 2011-03-04 15:38 发表评论
]]>
html的body标签http://www.shnenglu.com/susu/archive/2008/04/29/48401.html学习才能q步学习才能q步Tue, 29 Apr 2008 03:09:00 GMThttp://www.shnenglu.com/susu/archive/2008/04/29/48401.htmlhttp://www.shnenglu.com/susu/comments/48401.htmlhttp://www.shnenglu.com/susu/archive/2008/04/29/48401.html#Feedback0http://www.shnenglu.com/susu/comments/commentRss/48401.htmlhttp://www.shnenglu.com/susu/services/trackbacks/48401.html
  作ؓ|页M内容的BODY部分直接显C在览器的H口中,它里面的内容直接影响着整个|页的好坏,在网设计中L臛_重要的作用?

  在开始编写具体页面内容之前,我们需要对面q行整体的基本规划和讄Q如整个面的背景色、背景图案、前景(文字Q色、页面左/上边距大等{,在HTML中,我们?lt;body>标签内指定参数来讄Q?br><body bgcolor="Q? background="Q?text="Q? leftmargin="Q? topmargin="Q?link="Q? alink="Q? vlink="Q?>…..</body>
其中各参CؓQ?br>BgcolorQ指定网背景色Q可指定光色|例:bgcolor="#E2E2FF"Q?br>BackgroundQ指定网背景图案地址Q如background="images/back.gif"Q?br>TextQ指定网内文字颜色Q如Qtext="#000000"Q?br>LeftmarginQ指定网늚左边距,如:leftmargin="0"Q?br>TopmarginQ指定网上边距Q同上?
LinkQ指定链接文字的颜色Q如Qlink="blue"Q?br>AlinkQ指定当鼠标Ud到链接文字上时文字的颜色Q如Qalink="red"Q?br>VlinkQ指定当我们讉Kq后的链接颜Ԍ如:vlink="#555555"Q?br>盗版它h|站的内容可耻,您查看的内容盗版于★点击设计★www.djasp.Net
CZQ网背景ؓ白色Q文字ؓU色Q链接色为绿Ԍ讉Kq的链接也ؓl色Q网左边距?0像素Q上边距?像素?
代码如下Q?br><html>
<head><title>点击设计</title></head>
<body bgcolor="#ffffff" text="red" link="green"vlink="green" leftmargin=10 topmargin=3>
|页正文内容….
</body>
</html>



学习才能q步 2008-04-29 11:09 发表评论
]]>
【{】触发器使用http://www.shnenglu.com/susu/archive/2008/04/18/47509.html学习才能q步学习才能q步Fri, 18 Apr 2008 08:09:00 GMThttp://www.shnenglu.com/susu/archive/2008/04/18/47509.htmlhttp://www.shnenglu.com/susu/comments/47509.htmlhttp://www.shnenglu.com/susu/archive/2008/04/18/47509.html#Feedback0http://www.shnenglu.com/susu/comments/commentRss/47509.htmlhttp://www.shnenglu.com/susu/services/trackbacks/47509.html
定义Q?何ؓ触发器?在SQL Server里面也就是对某一个表的一定的操作Q触发某U条Ӟ从而执行的一D늨序。触发器是一个特D的存储q程?br>常见的触发器有三U:分别应用于Insert , Update , Delete 事g?SQL Server 2000定义了新的触发器Q这里不提)

我ؓ什么要使用触发器?比如Q这么两个表Q?br>
Create Table Student( --学生?br>StudentID int primary key, --学号
....
)

Create Table BorrowRecord( --学生借书记录?br>BorrowRecord int identity(1,1), --水?
StudentID int , --学号
BorrowDate datetime, --借出旉
ReturnDAte Datetime, --归还旉
...
)

用到的功能有:
1.如果我更改了学生的学?我希望他的借书记录仍然与这个学生相?也就是同时更改借书记录表的学号);
2.如果该学生已l毕业,我希望删除他的学L同时Q也删除它的借书记录?br>{等?br>
q时候可以用到触发器。对?Q创Z个Update触发器:

Create Trigger truStudent
On Student
for Update
As
if Update(StudentID)
begin

Update BorrowRecord
Set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i
Where br.StudentID=d.StudentID

end

理解触发器里面的两个临时的表QDeleted , Inserted 。注意Deleted 与Inserted分别表示触发事g的表“旧的一条记?#8221;?#8220;新的一条记?#8221;?br>一个Update 的过E可以看作ؓQ生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录q写入新U录?br>
对于2Q创Z个Delete触发?br>Create trigger trdStudent
On Student
for Delete
As
Delete BorrowRecord
From BorrowRecord br , Delted d
Where br.StudentID=d.StudentID

从这两个例子我们可以看到了触发器的关键:A.2个时的表;B.触发机制?br>q里我们只讲解最单的触发器。复杂的容后说明?br>事实上,我不鼓励使用触发器。触发器的初始设计思想Q已l被“U联”所替代.

学习才能q步 2008-04-18 16:09 发表评论
]]>
[转]多层架构 q?/title><link>http://www.shnenglu.com/susu/archive/2008/04/17/47411.html</link><dc:creator>学习才能q步</dc:creator><author>学习才能q步</author><pubDate>Thu, 17 Apr 2008 09:13:00 GMT</pubDate><guid>http://www.shnenglu.com/susu/archive/2008/04/17/47411.html</guid><wfw:comment>http://www.shnenglu.com/susu/comments/47411.html</wfw:comment><comments>http://www.shnenglu.com/susu/archive/2008/04/17/47411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/susu/comments/commentRss/47411.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/susu/services/trackbacks/47411.html</trackback:ping><description><![CDATA[使用多层架构q行pȝ开发是Cpȝ设计的流行趋ѝ通过分解业务l节Q将不同的功能代码分散开来,更利于系l的设计和开发,同时为可能的变更提供了更的单元?br><br>以下是一个典型的多层体系l构图?br><br> <div style="OVERFLOW-X: auto; WIDTH: 100%"><a target=_blank><img alt=uploads/200607/24_142206_mt.png src="http://www.rainsts.net/uploads/200607/24_142206_mt.png"></a></div> <br><br>首先我们?#8220;订单(Order)”ZQ进行一个简单的业务分解?br><br>1. 订单自然包括订单的内?OrderInfo)Q其中有诸如订单~号、商品名U、数量,以及金额{信息?br>2. 有了订单信息Q我们还需要一个存储订单的场所Q那么自焉要有个操作读写的对象(OrderAccess)?br>3. Z外界能进行相关的订单操作Q我们还需要有个业务逻辑对象(Order)Q它提供创徏新订单,向订单插?删除商品Q保存订单等操作?br><br>通过上面的分析,我们基本上可以将一个业务逻辑完整地分割ؓQ?br><br>业务实体 ---> OrderInfo<br>数据讉K ---> OrderAccess<br>业务逻辑 ---> Order<br><br>Zpȝ架构考虑Q我们将q些对象分别攄在不同的逻辑单元中,q些逻辑单元q成了“多层”?br><br>业务实体?Model) ---> 业务实体 ---> OrderInfo<br>数据讉K?DAL) ---> 数据讉K ---> OrderAccess<br>业务逻辑?BLL) ---> 业务逻辑 ---> Order<br><br>同样以上面订单ؓ例,我们q一步讲q各层对象的实现l节?br><br>1. 客户基本上只依赖?Order ?OrderInfoQ通过他们可以操作业务的全部Q它q不兛_业务存储{细节?br><br>2. 大多数时候我们会?OrderAccess 设计?Internal Protected 方式QOrderAccess 可以是一个抽象类或者接口。我更习惯于其实现为抽象类Q因为某些方法是调用其他Ҏ来实现的Q抽象类的设计可以减实现类的代码数量。另外将该抽象类设计成工厂方法模式,通过 IoC 或?"配置反射" 来获得具体的实现c,可以减少层之间的耦合Q也便于数据pȝ的替换?br><br>3. Order 多数时候可以实Cؓ Singleton 或者静态类Q它只是提供了一pd的方法来操作某些逻辑Q通过接受 OrderInfo 参数来获取信息。其本n无需保存M状态。如果需要实现购物RQ只需?OrderInfo 存储?Session 之中卛_?br><br>通过上面的例子,我们q可以发现多层的另外一个好处就是更利于团队协作开发。架构设计h员无需考虑具体的数据库实现代码Q而将设计重点攑֜业务层面Q数据库开发h员自然也可将重心攑֜数据库访问优化上。团队成员之间不再是一责一个业务模块,不再有了 n 个数据访问类Q不再有 n U不同的对象模式{等。从传统?"瓦罐作坊" 演变?"工业水U?Q更利于Ҏ技术能力和业务熟悉度的差别来划分不同的角色?br> <img src ="http://www.shnenglu.com/susu/aggbug/47411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/susu/" target="_blank">学习才能q步</a> 2008-04-17 17:13 <a href="http://www.shnenglu.com/susu/archive/2008/04/17/47411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]多层架构 q?/title><link>http://www.shnenglu.com/susu/archive/2008/04/17/47410.html</link><dc:creator>学习才能q步</dc:creator><author>学习才能q步</author><pubDate>Thu, 17 Apr 2008 09:13:00 GMT</pubDate><guid>http://www.shnenglu.com/susu/archive/2008/04/17/47410.html</guid><wfw:comment>http://www.shnenglu.com/susu/comments/47410.html</wfw:comment><comments>http://www.shnenglu.com/susu/archive/2008/04/17/47410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/susu/comments/commentRss/47410.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/susu/services/trackbacks/47410.html</trackback:ping><description><![CDATA[使用多层架构q行pȝ开发是Cpȝ设计的流行趋ѝ通过分解业务l节Q将不同的功能代码分散开来,更利于系l的设计和开发,同时为可能的变更提供了更的单元?br><br>以下是一个典型的多层体系l构图?br><br> <div style="OVERFLOW-X: auto; WIDTH: 100%"><a target=_blank><img alt=uploads/200607/24_142206_mt.png src="http://www.rainsts.net/uploads/200607/24_142206_mt.png"></a></div> <br><br>首先我们?#8220;订单(Order)”ZQ进行一个简单的业务分解?br><br>1. 订单自然包括订单的内?OrderInfo)Q其中有诸如订单~号、商品名U、数量,以及金额{信息?br>2. 有了订单信息Q我们还需要一个存储订单的场所Q那么自焉要有个操作读写的对象(OrderAccess)?br>3. Z外界能进行相关的订单操作Q我们还需要有个业务逻辑对象(Order)Q它提供创徏新订单,向订单插?删除商品Q保存订单等操作?br><br>通过上面的分析,我们基本上可以将一个业务逻辑完整地分割ؓQ?br><br>业务实体 ---> OrderInfo<br>数据讉K ---> OrderAccess<br>业务逻辑 ---> Order<br><br>Zpȝ架构考虑Q我们将q些对象分别攄在不同的逻辑单元中,q些逻辑单元q成了“多层”?br><br>业务实体?Model) ---> 业务实体 ---> OrderInfo<br>数据讉K?DAL) ---> 数据讉K ---> OrderAccess<br>业务逻辑?BLL) ---> 业务逻辑 ---> Order<br><br>同样以上面订单ؓ例,我们q一步讲q各层对象的实现l节?br><br>1. 客户基本上只依赖?Order ?OrderInfoQ通过他们可以操作业务的全部Q它q不兛_业务存储{细节?br><br>2. 大多数时候我们会?OrderAccess 设计?Internal Protected 方式QOrderAccess 可以是一个抽象类或者接口。我更习惯于其实现为抽象类Q因为某些方法是调用其他Ҏ来实现的Q抽象类的设计可以减实现类的代码数量。另外将该抽象类设计成工厂方法模式,通过 IoC 或?"配置反射" 来获得具体的实现c,可以减少层之间的耦合Q也便于数据pȝ的替换?br><br>3. Order 多数时候可以实Cؓ Singleton 或者静态类Q它只是提供了一pd的方法来操作某些逻辑Q通过接受 OrderInfo 参数来获取信息。其本n无需保存M状态。如果需要实现购物RQ只需?OrderInfo 存储?Session 之中卛_?br><br>通过上面的例子,我们q可以发现多层的另外一个好处就是更利于团队协作开发。架构设计h员无需考虑具体的数据库实现代码Q而将设计重点攑֜业务层面Q数据库开发h员自然也可将重心攑֜数据库访问优化上。团队成员之间不再是一责一个业务模块,不再有了 n 个数据访问类Q不再有 n U不同的对象模式{等。从传统?"瓦罐作坊" 演变?"工业水U?Q更利于Ҏ技术能力和业务熟悉度的差别来划分不同的角色?br> <img src ="http://www.shnenglu.com/susu/aggbug/47410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/susu/" target="_blank">学习才能q步</a> 2008-04-17 17:13 <a href="http://www.shnenglu.com/susu/archive/2008/04/17/47410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二叉树问?/title><link>http://www.shnenglu.com/susu/archive/2007/04/09/21541.html</link><dc:creator>学习才能q步</dc:creator><author>学习才能q步</author><pubDate>Mon, 09 Apr 2007 08:25:00 GMT</pubDate><guid>http://www.shnenglu.com/susu/archive/2007/04/09/21541.html</guid><wfw:comment>http://www.shnenglu.com/susu/comments/21541.html</wfw:comment><comments>http://www.shnenglu.com/susu/archive/2007/04/09/21541.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/susu/comments/commentRss/21541.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/susu/services/trackbacks/21541.html</trackback:ping><description><![CDATA[二叉树是一U非U性的数据l构Q在对它q行操作ӞL需要逐一Ҏ个数据元素实? <p align=left>     操作Q这样就存在一个操作顺序问题,由此提出了二叉树的遍历操作。所谓遍历二叉树?nbsp; </p> <p align=left>     是按某种序讉K二叉树中的每个结点一ơ且仅一ơ的q程。这里的讉K可以是输出、比 </p> <p align=left>     较、更新、查看元素内容等{各U操作?br></p> <p align=left>     二叉树的遍历方式分ؓ两大c:一cL栏V左子树和右子树三个部分q行讉KQ另一cL</p> <p align=left>     层次讉K。下面我们将分别q行讨论?/p> <p align=left><br>    <strong>1?按根、左子树和右子树三部分进行遍?</strong></p> <p align=left>遍历二叉树的序存在下面6U可能:</p> <p align=left>    TLRQ根左右Q? TRLQ根叛_Q?/p> <p align=left>    LTRQ左根右Q? RTLQ右根左Q?/p> <p align=left>    LRTQ左xQ? RLTQ右左根Q?/p> <p align=left>     其中QTRL、RTL和RLT三种序在左叛_树之间均是先叛_树后左子树,q与Z先左后右</p> <p align=left>的习惯不同,因此Q往往不予采用。余下的三种序TLR、LTR和LRTҎ根访问的位置不同分别</p> <p align=left>被称为先序遍历、中序遍历和后序遍历?/p> <p align=left>Q?Q先序遍?/p> <p align=left>若二叉树为空Q则l束遍历操作Q否?/p> <p align=left>讉K根结点;</p> <p align=left>先序遍历左子树;</p> <p align=left>先序遍历叛_树?/p> <p align=left>Q?Q中序遍历若二叉树ؓI,则结束遍历操作;否则</p> <p align=left>中序遍历左子树;</p> <p align=left>讉K根结点;</p> <p align=left>中序遍历叛_树?/p> <p align=left>Q?Q后序遍?/p> <p align=left>若二叉树为空Q则l束遍历操作Q否?/p> <p align=left>后序遍历左子树;</p> <p align=left>后序遍历叛_树;</p> <p align=left>讉K根结炏V?/p> <p align=left>例如。以下是一二叉树及其l过三种遍历所得到的相应遍历序?/p> <p align=left><img height=126 src="http://210.44.195.20/data/ja/48.jpg" width=449></p> <p align=left>二叉树的两种遍历ҎQ?/p> <p align=left>Q?Q对一二叉树中序遍历Ӟ若我们将二叉树严格地按左子树的所有结点位于根l点的左</p> <p align=left>侧,叛_树的所有结点位于根右侧的Ş式绘Ӟ可以对每个l点做一条垂U,映射C面的</p> <p align=left>水^U上Q由此得到的序是该二叉树的中序遍历序?br><img height=173 src="http://210.44.195.20/data/ja/49.jpg" width=267></p> <p align=left>Q?QQ何一二叉树都可以将它的外部轮廓用一条线l制出来Q我们将它称Z叉树的包U,</p> <p align=left>q条包线对于理解二叉树的遍历q程很有用?/p> <p align=left><img height=162 src="http://210.44.195.20/data/ja/50.jpg" width=239></p> <p align=left>     由此可以看出Q(1Q遍历操作实际上是将非线性结构线性化的过E,其结果ؓU性序列,</p> <p align=left>q根据采用的遍历序分别UCؓ先序序列、中序序列或后序序列Q(2Q遍历操作是一个递归?/p> <p align=left>q程Q因此,q三U遍历操作的法可以用递归函数实现?/p> <p align=left>Q?Q先序遍历递归法<br>void PreOrder(BTree BT) {<br>      if (BT) { Visit(BT);<br>      PreOrder(BT->Lchild);<br>      PreOrder(BT->Rchild); <br>}</p> <p align=left>Q?Q中序遍历递归法<br>void InOrder(BTree BT) {<br>      if (BT) {<br>         InOrder(BT->Lchild);<br>         Visit(BT);<br>         InOrder(BT->Rchild);<br>       }<br>    }</p> <p align=left>Q?Q后序遍历递归法<br>void PostOrder(BTree BT) {<br>     if (BT) {<br>        PostOrder(BT->Lchild);<br>        PostOrder(BT->Rchild);<br>        Visit(BT);<br>       }<br>    }</p> <p align=left><strong>   2 、按层次遍历二叉?/strong></p> <p align=left>     实现ҎZ上层C层,每层中从左侧到右侧依ơ访问每个结炏V下面我们将l出一?/p> <p align=left>二叉树及其按层次序讉K其中每个l点的遍历序列?br><img height=415 src="http://210.44.195.20/data/ja/51.jpg" width=457></p> <p align=left>void LevelOreder(QBTree BT) {<br>     for (i=1;i<=BT.n;i++)<br>     if (BT.elem[i]!='#') Visite(BT.elem[i]);<br>}</p> <p align=left>二叉树用铑ּ存储l构表示Ӟ按层遍历的算法实?/p> <p align=left>讉Kq程描述如下Q?/p> <p align=left>讉K根结点,q将该结点记录下来;</p> <p align=left>若记录的所有结炚w已处理完毕,则结束遍历操作;否则重复下列操作?/p> <p align=left>取出记录中第一个还没有讉K孩子的结点,若它有左孩子Q则讉K左孩子,q将记录下来Q?/p> <p align=left>若它有右孩子Q则讉K叛_子,q记录下来?/p> <p align=left>     在这个算法中Q应使用一个队列结构完成这Ҏ作。所谓记录访问结点就是入队操作;</p> <p align=left>     而取录的l点是出队操作。这样一来,我们的算法就可以描述成下列Ş式:</p> <p align=left>Q?Q访问根l点Qƈ根l点入队Q?/p> <p align=left>Q?Q当队列不空Ӟ重复下列操作Q?/p> <p align=left>从队列退Z个结点;</p> <p align=left>若其有左孩子Q则讉K左孩子,q将其左孩子入队Q?/p> <p align=left>若其有右孩子Q则讉K叛_子,q将其右孩子入队Q?/p> <p align=left>void LevelOrder(BTree *BT) {<br>      if (!BT) exit;<br>      InitQueue(Q); p=BT; //初始?br>      Visite(p); EnQueue(&Q,p); //讉K根结点,q将根结点入?br>      while (!QueueEmpty(Q)) { //当队非空旉复执行下列操?br>      DeQueue(&Q,&p); //出队<br>      if (!p->Lchild) {Visite(p->Lchild);EnQueue(&Q,p->Lchild); //处理左孩?br>      if (!p->Rchild) {Visite(p->Rchild);EnQueue(&Q,p->Rchild); //处理叛_?br>   }<br>}</p> <p><br>   五?strong>典型二叉树的操作法</strong></p> <p><strong>     1?输入一个二叉树的先序序列,构造这二叉树</strong></p> <p>     Z保证唯一地构造出所希望的二叉树Q在键入q棵树的先序序列Ӟ需要在所有空二叉</p> <p>    树的位置上填补一个特D的字符Q比如,'#'。在法中,需要对每个输入的字W进行判</p> <p>    断,如果对应的字W是'#'Q则在相应的位置上构造一늩二叉树;否则Q创Z个新l?/p> <p>    炏V整个算法结构以先序遍历递归法为基Q二叉树中结点之间的指针q接是通过指针</p> <p>    参数在递归调用q回时完成?/p> <p>法Q?/p> <p>BTree Pre_Create_BT( ) {<br>      getch(ch);<br>      if (ch=='#') return NULL;                     //构造空?br>      else { BT=(BTree)malloc(sizeof(BTLinklist)); //构造新l点<br>      BT->data=ch;<br>      BT->lchild =Pre_Create_BT( );                 //构造左子树<br>      BT->rchild =Pre_Create_BT( );                 //构造右子树<br>      return BT;<br>    }<br>}</p> <p><strong>   2?计算一二叉树的叶子结Ҏ?/strong></p> <p>     q个操作可以使用三种遍历序中的M一U,只是需要将讉K操作变成判断该结Ҏ?/p> <p>     为叶子结点,如果是叶子结点将累加器加1卛_。下面这个算法是利用中序遍历实现的?/p> <p>法Q?/p> <p>void Leaf(BTree BT,int *count) {<br>      if (BT) {<br>      Leaf(BT->child,&count); //计算左子树的叶子l点个数<br>      if (BT->lchild==NULL&&BT->rchild==NULL) (*count)++;<br>      Leaf(BT->rchild,&count); //计算叛_树的叶子l点个数<br>    }<br>}</p> <p><strong>   3?交换二叉树的左右子树</strong></p> <p><strong>    </strong> 许多操作可以利用三种遍历序的Q何一U,只是某种遍历序实现h更加方便一  </p> <p>些。而有些操作则不然Q它只能使用其中的一U或两种遍历序。将二叉树中所有结点的左右</p> <p>子树q行交换q个操作属于这cLc?/p> <p>法Q?/p> <p>void change_left_right(BTree BT) {<br>      if (BT) {<br>         change_left_right(BT->lchild);<br>         change_left_right(BT->rchild);<br>         BT->lchild<->BT->rchild;<br>       }<br>   }</p> <p><strong>   4 、求二叉树的高度</strong></p> <p>     q个操作使用后序遍历比较W合Z求解二叉树高度的思维方式。首先分别求出左叛_?</p> <p>的高度,在此基础上得|的高度,卛_叛_树较大的高度值加1?/p> <p>法Q?/p> <p>int hight(BTree BT) {     //h1和h2分别是以BT为根的左叛_树的高度<br>     if (BT==NULL) return 0;<br>     else {<br>         h1=hight(BT->lchild);<br>         h2=hight(BT->right);<br>         return max{h1,h2}+1;<br>        }<br>   }</p> <p>   六?strong>树、森林与二叉树的转换</strong></p> <p><strong>   1?树、森林{换成二叉?/strong></p> <p>     一|转换成二叉树的方法:</p> <p>     一|转换成二叉树实际上就是将q棵树用孩子兄弟表示法存储即可,此时Q树中的?/p> <p>个结Ҏ多有两个指针Q一个指针指向第一个孩子,另一个指针指向右侧第一个兄弟。当你将</p> <p>q两个指针看作是二叉树中的左孩子指针和孩子右指针Ӟ是一二叉树了?/p> <p>     特点Q一|转换成二叉树后,根结Ҏ有右孩子?/p> <p>     森林{换成二叉树的Ҏ与一|转换成二叉树的方法类|只是把森林中所有树的根 </p> <p>      l点看作兄弟关系Qƈ对其中的每棵树依依地q行转换?/p> <p><strong>    2 、二叉树q原成树或森?/strong></p> <p>     q个q程实际上是树、森林{换成二叉树的逆过E,卛_该二叉树看作是树或森林的孩子</p> <p>兄弟表示法。比如,若二叉树为空Q树也ؓI;否则Q由二叉树的根结点开始,延右指针向下</p> <p>赎ͼ直到为空Q途经的结点个数是相应林所含树的棵敎ͼ若某个结点的左指针非I,说明q?/p> <p>个结点在树中必有孩子Qƈ且从二叉树中该结点左指针所指结点开始,延右指针向下赎ͼ直到</p> <p>为空Q途经的结点个数就是这个结点的孩子数目?/p> <img src ="http://www.shnenglu.com/susu/aggbug/21541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/susu/" target="_blank">学习才能q步</a> 2007-04-09 16:25 <a href="http://www.shnenglu.com/susu/archive/2007/04/09/21541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面向对象~程http://www.shnenglu.com/susu/archive/2007/04/06/21416.html学习才能q步学习才能q步Fri, 06 Apr 2007 09:08:00 GMThttp://www.shnenglu.com/susu/archive/2007/04/06/21416.htmlhttp://www.shnenglu.com/susu/comments/21416.htmlhttp://www.shnenglu.com/susu/archive/2007/04/06/21416.html#Feedback0http://www.shnenglu.com/susu/comments/commentRss/21416.htmlhttp://www.shnenglu.com/susu/services/trackbacks/21416.html

面向对象~程

  面向对象~程Q?a target=_new>Object Oriented ProgrammingQ?a target=_new>OOPQ?font face=Verdana color=#0000ff>面向对象E序设计Q是一U?a target=_new>计算?/font>~程架构。OOP 的一条基本原则是计算机程?/font>是由单个能够起到?a target=_new>E序作用的单元或对象l合而成。OOP 辑ֈ?a target=_new>软g工程的三个主要目标:重用性、灵zL和扩展性。ؓ了实现整体运,每个对象都能够接收信息、处理数据和向其它对象发送信息。OOP 主要有以下的概念?a target=_new>lgQ?

      lg Q?数据和功能一起在q行着的计机E序中Ş成的单元Q组件在 OOP 计算机程序中是模块和l构化的基础?
      抽象?Q?E序有能力忽略正在处理中信息的某些方面,卛_信息主要斚wx的能力?
      装 Q?也叫做信息封装:保lg不会以不可预期的方式改变其它lg的内部状态;只有在那些提供了内部状态改变方法的lg中,才可以访问其内部状态。每c?/font>lg都提供了一个与其它lg联系的接口,q规定了其它lgq行调用的方法?
      多态?Q?lg的引用和c集会涉及到其它许多不同cd的组Ӟ而且引用lg所产生的结果得依据实际调用的类型?
      l承?Q?允许在现存的lg基础上创建子cȝӞq统一q增Z多态性和装性。典型地来说是用类来对lgq行分组Q而且q可以定义新cMؓ现存的类的扩展,q样可以将cȝl成树Ş或网状结构,q体C动作的通用性?

  ׃抽象性、封装性、重用性以及便于用等斚w的原因,以组件ؓ基础的编E在脚本语言中已l变得特别流行。Python ?Ruby 是最q才出现的语aQ在开发时完全采用?OOP 的思想Q而流行的 Perl 脚本语言从版?开始也慢慢地加入了新的面向对象的功能组件。用lg代替“现实”上的实体成ؓ JavaScriptQECMAScriptQ?得以行的原因,有论证表明对lgq行适当的组合就可以在英特网上代?HTML ?XML 的文档对象模型(DOMQ?nbsp; 


一、oop的基本思想


      OOP的许多原始思想都来之于Simula语言Qƈ在Smalltalk语言的完善和标准化过E中得到更多的扩展和对以前的思想的重新注解。可以说OO思想和OOPL几乎是同步发展相互促q的。与函数?a target=_new>E序设计Qfunctional-programmingQ和逻辑式程序设计(logic-programmingQ所代表的接q于机器的实际计模型所不同的是QOOP几乎没有引入_的数学描叙,而是們֐于徏立一个对象模型,它能够近似的反映应用领域内的实体之间的关p,其本质是更接q于一Uhc认知事物所采用的哲学观的计模型。由此,D了一个自然的话题Q那是OOP到底是什么?[D&T 1988][B.S 1991] .。在OOP中,对象作ؓ计算MQ拥有自q名称Q状态以及接受外?a target=_new>消息的接口。在对象模型中,产生新对象,旧对象销毁,发送消息,响应消息构成OOP计算模型的根本?/p>

      对象的生有两种基本方式。一U是以原型(prototypeQ对象ؓ基础产生新的对象。一U是以类Q?a target=_new>classQؓ基础产生新对象。原型的概念已经在认知心理学中被用来解释概念学习的递增Ҏ,原型模型本n是企图通过提供一个有代表性的对象为基来生各U新的对象,q由此l生更W合实际应用的对象。而原?委托也是OOP中的对象抽象Q代码共享机制中的一U。一个类提供了一个或者多个对象的通用性描叙。从形式化的观点看,cMcd有关Q因此一个类相当于是从该cM产生的实例的集合。而这L观点也会带来一些矛盾,比较典型的就是在l承体系下,子集Q子c)对象和父集(父类Q对象之间的行ؓ相融性可能很难达刎ͼq也是OOP中常被引用的---子类型(subtypeQ不{于子类QsubclassQ[Budd 2002]。而在一U所有皆对象的世界观背景下,在类模型基础上还诞生Z一U拥有元c(metaclassQ的新对象模型。即cLw也是一U其他类的对象。以上三U根本不同的观点各自定义了三U基于类Qclass-basedQ?Z原型Qprototype-basedQ和Z元类Qmetaclass-basedQ的对象模型。而这三种对象模型也就D了许多不同的E序设计语言Q如果我们暂时把静态与动态的差别攑֜一边)。是的,我们l常接触的C++,Java都是使用Zcȝ对象模型Q但除此之外q有很多我们所没有接触的OOPL采用了完全不一L对象模型Q他们是在用另外一U观点诠释OOP的内c?/p>

      什么是oop的基本思想呢?把组件的实现和接口分开Qƈ且让lgh多态性。不q,两者还是有Ҏ的不同。oop在程序构造中语言要素的语法。你必须得承,使用c,使用对象Q对象传递消息。gp不关心你l承或是不承,它的开端是分析产品的分c,有些什么种c,他们的行为如何。就是说Q两件东西相{意味着什么?怎样正确地定义相{操作?不单单是相等操作那么单,你往深处分析׃发现“相等”q个一般观忉|味着两个对象部分Q或者至基本部分是相等的,据此我们可以有一个通用的相{操作。再说对象的U类。假讑֭在一个顺序序列和一l对于顺序序列的操作。那么这些操作的语义是什么?从复杂度权衡的角度看Q我们应该向用户提供什么样的顺序序列?该种序列上存在那些操作?那种排序是我们需要的Q只有对q些lg的概念型分类搞清楚了Q我们才能提到实现的问题Q用模ѝ承还是宏Q用什么语a和技术?gp的基本观Ҏ把抽象的软glg和它们的行ؓ用标准的分类学分c,出发点就是要建造真实的、高效的和不取决于语a的算法和数据l构。当然最l的载体q是语言Q没有语a没法~程。stl使用c++Q你也可以用ada来实玎ͼ用其他的语言来实C行,l果会有所不同Q但基本的东西是一L。到处都要用C分查扑֒排序Q而这是Z正在做的。对于容器的语义Q不同的语言会带来轻微的不同。但是基本的区别很清楚是gp所依存的语义,以及语义分解。例如,我们军_需要一个组件swapQ然后指个组件在不同的语a中如果工作。显焉Ҏ语义以及语义分类。而oop所的(我认为是q分的)是清楚的定义cM间的层次关系。oop告诉了你如何建立层次关系Q却没有告诉你这些关pȝ实质?br>Q这D不太好理解Q有一些术语可能要q一D|间才会有合适的中文译——译者)

      面向对象的编E方法OOP是九十年代才行的一UY件编E方法。它对象?#8220;抽象”?#8220;装”?#8220;l承”?#8220;多?#8221;。我们讲E序设计是由“数据l构”+“法”l成的。从宏观的角度讲QOOP下的对象是以~程Z心的Q是面向E序的对象。我们今天要讲的OOD是面向信息的对象Q是以用户信息ؓ中心的?

二、OOP技术的历史

  面向对象技术最初是从面向对象的E序设计开始的Q它的出C60q代simula语言为标志?0q代中后期,面向对象E序设计逐渐成熟Q被计算机界理解和接受,Z又开始进一步考虑面向对象的开发问题。这是九十q代以Microsoft VisualpdOOP软g的流行的背景?

  传统的结构化分析与设计开发方法是一个线性过E,因此Q传l的l构化分析与设计Ҏ要求现实pȝ的业务管理规范,处理数据齐全Q用戯全面完整地其业务需?/font>?

  传统?a target=_new>软gl构和设计方法难以适应软g生自动化的要求Q因为它以过Eؓ中心q行功能l合QY件的扩充和复用能力很差?

  对象是对现实世界实体的模拟,因面能更Ҏ地理解需求,即用户和分析者之间具有不同的教育背景和工作特点,也可很好地沟通?

  区别面向对象的开发和传统q程的开发的要素有:对象识别和抽象、封装、多态性和l承?

  对象(Object)是一个现实实体的抽象Q由现实实体的过E或信息牲来定义。一个对象可被认为是一个把数据Q属性)和程序(ҎQ封装在一L实体Q这个程序生该对象的动作或对它接受到的外界信号的反应。这些对象操作有时称为方法。对象是个动态的概念,其中的属性反映了对象当前的状态?

  c?Class)用来描述h相同的属性和Ҏ的对象的集合。它定义了该集合中每个对象所共有的属性和Ҏ。对象是cȝ实例?

  ׃分析不难看出Q尽OOP技术更看中用户的对象模型,但其目的都是以编Eؓ目的的,而不是以用户的信息ؓ中心的,L把用L信息U_到某个用户不感兴的“E序对象”中?

三、OOP 的优~点

      · OOP 的优点:使h们的~程与实际的世界更加接近Q所有的对象被赋予属性和ҎQ结果编E就更加富有人性化?/font>

      · OOP 的也有缺点,?C++ 而言Q由于面向更高的逻辑抽象层,使得 C++ 在实现的时候,不得不做出性能上面的牺Ԍ有时候甚x致命?( 所有对象的属性都l过内置多重指针的间接引用是其性能损失的主要原因之一Q不q,W者的局限性在于未使用q?VC++ 外的面向对象语言Q所以不是十分肯定,哈哈Q有人笑出来?#8230; )?/font>

      在计机速度飞速发展的今天Q你可能会说Q一丁点的性能牺牲没什么大不了。是的,从面向对象的角度Q的编E的l构更加清晰完整Q数据更加独立和易于理Q性能的牺牲可以带来这么多的好处,没有理由不做E的生意吧Q?/font>

      不过Q在某些寚w度要求极高Ҏ场合Q例如你做的是电信的交换pȝQ每U钟有超q百万的人同时进行电话交换,如果Q每一个数据交换过E都是一个对象,那么ȝ性能损失是天文数字Q!

      或者这个例子不够脓w,再D个例子吧。假如你受聘于一个游戏设计公司,老板希望做出来的游戏可以更多的兼ֈ更多?a target=_new>电脑使用者,游戏每秒钟的q行的可以更多Q子弹和爆炸物可以更多、更华丽。那么,你会发现使用 C++ 会你的E序变得W拙Q无法满你的需求,除非你非得要你的游戏q行于奔腑֛的机器上 ( 如果不是Q而你又坚持用 C++ 的对象编E,那么请减主角的枪的威力?)?/font>

      如果你是冥顽不宁的hQ你说不怿 OOP 会有性能上的损失Q那么,我记得曾看到?CSDN 上关?VB ?VC 执行效率的讨论的文章Q讲q的是使用?MFC 以后Q执行效率甚至低?VB 开发出来的东西。请各位验证一下:如果使用的是Ua?C 语言语法的话Q那么一定会比在 VB ~出来的东西要快很多 ( GetTickCount 函数可以查阅 MSDN ,如果x加精一些,可以使用 QueryPerformanceCounter 函数 )?/font>

四、OOP的未来(撰文/Bjarne Stroustrup & Tim Lindholm   ~译/孟岩Q?/strong>

在未来三q_E序员编写代码的方式会发生那些变化?

Stroustrup: 在C++中,假如没有合适的库在背后支撑Q完成Q何重要的工作都可能是很复杂的。而一旦有了合适的库,M东西都可以被我们操控于股掌之间。因此,构造和使用E序库的重要性与日俱增。这也暗C我们,泛型E序设计(generic programming)会来多地被q用。只有通过GPQ我们才能确保库的通用性和高效率。我q预期在分布式计和“lgQcomponentsQ?#8221;应用领域会出现喜人的增长。就大部分程序员而言Q通过使用方便适用的程序库Q这些开发工作会变得单明了?/font>

现在有一个趋势,~译器厂商试图把其特有的“对象模型”和图形界?GUI)l节推销l用戗比如微软的COM和Inprise的类属?#8220;properties”。对于用h_q既不必要,也不情愿。我所希望看到的程序库Q应该是用标准C++打造,界面灉|Q值得信赖的程序库。通常Q这些界面应该是q_无关的。C++的表达能力极强,即不用大量的宏,也应该以达成这一要求。就有些地Ҏ法百分之癄遵守q一原则Q也应该对于^台和厂家的依赖性限制v来。这个目标的完成情况Q可以反?a target=_new>软g工具产业对于应用E序开发行业的xE度。我怀疑目前对于那些独立的、跨q_厂商来说Qƈ不存在相应的市场。如果能够徏立这L市场Q也许能够促q厂商们为客户做?#8220;真正有用?#8221;产品?

Lindholm: 对于~写代码的开发者来_主要的驱动力量仍是两个Q网l和分布式——也是设计和开发非单机软g的需求。大部分的应用程序将不会是孤雉地运行在单一讑֤上,而是q用了类?a target=_new>EJB和JSP之类技术的Q^台无关的分布式程序。程序员们将不得不面对分布式计算的重重险阅R这对许多E序员所依赖?a target=_new>设计模式、技术和直觉构成严峻的挑战。这是选择~程语言之前必须认识到的Q尽不同语a的设计特性可能促q或者阻这一转化?/font>

在网l应用的增长中,一个很重要的部分是型Ud讑֤和特DInternet讑֤的爆炸性增ѝ这些设备各有各?a target=_new>操作pȝQ或者只在某U特定的讑֤领域内有共同的操作系l。我们现在还可以一一列D些设备——家庭接入设备、蜂H电话、电子报U、PDA、自动网l设备等{。但是这些设备领域的数量和深入程度将会很快变得难以估量。我们都知道q个市场大得惊hQPC的兴起与之相比不q小菜一。因此在q些讑֤的应用程序市ZQ竞争将会相当残酗获胜的重要手段之一Q就是尽快进入市场。开发h员需要优U的工Pq速高效地撰写和调试他们的软g。^台无x也是制胜秘诀之一Q它使得E序员能够开发出支持多种讑֤q_的Y件?/font>

我预期的另一个变化是Q我们对于代?Java)和数?XML)协同型应用程序的开发能力将会不断提高。这U协同是开发强大应用程序的核心目标之一。我们从XML的迅速流行和ebXML规范的进展中Q已l看Cq个势。ebXML是一个针?a target=_new>电子商务和国际N易的Q基于XML的开攑ּ基础构架Q由联合国N易促q和电子商务中心(UN/CEFACT)与结构性信息标准推q组l?OASIS)共同开发?

我们能否期望出现一个真正的面向lg(component-oriented)的语aQ它的创造者会是谁呢?

Stroustrup: 我怀疑,q个领域中之所以缺乏成果,正是因ؓZ——主要是那些非程序员们——对“lg”q个意义含糊的字眼寄予了太多的期望。这些h士梦惻I有朝一日,lg会以某种方式把程序员赶出历史舞台。以后那些称职的“设计?#8221;只需利用预先调整好的lgQ把鼠标拖一拖放一放,把pȝl合出来。对于Y件工具厂商来_q种xq有另一层意义,他们认ؓQ到时候只有他们才保留有必要的技术,有能力编写这Llg?/font>

q种x有一个最基本的谬误:q种lg很难获得q泛Ƣ迎。一个单独的lg?a target=_new>框架(framework)Q如果能够满一个应用程序或者一个业领域对所提出的大部分要求的话Q对于其刉者来说就是划的产品Q而且技术上也不是很困难。可是该产业内的几个竞争者很快就会发玎ͼ如果所有h都采用这些组Ӟ那么彼此之间的品就会变得天下大同,没什么区别,他们为简单的办事员,主要利润都将钻进那些lg/框架供应商的腰包里!

?#8220;lg”很有用,不过产生不了预期的杠杆效应。中型的、更通用的组仉常有用,但是构造时需要非同寻常的Ҏ?/font>

在C++中,我们l合q用不同׃n形式的类体系(class hierarchies)Q以及用templates_ֿ打造的接口Q在q方面取得了一定的q展。我期待在这个领域取得一些有和有用的成果,不过我认U成果很可能是一U新的C++E序设计风格Q而不是一U新的语a?

Lindholm: ~写面向lg的应用程序,好像更多的是个投资、设计和E序员管理方面的问题Q而不是一个编E语a问题。当然某些语a在这斚wh先天优势Q不q如果说有什么魔术般的新语言能够大大化组件的~写隑ֺQ那Ua是一U误对{?

微Y已经全部赌注押在C#上,其他语言何去何从Q?/font>

Stroustrup: C++在下一个十q里仍然是一U主语a。面Ҏ的挑战,它会奋v应对。一个创造了那么多出色系l的语言Q绝不会“坐视落花水春去?#8221;?/font>

我希望微软认识到Q它在C++(我指的是ISO标准C++)上有着巨大的利益,C++是它与IT世界内其他h之间的一座桥梁,是构造大型系l和嵌入式系l?/font>的有效工P也是满高性能需求的利器。其他语aQ似乎更注重那些四^八稳的商用程序?

竞争

C#会不会获得广泛的接受Qƈ且挤掉其他的语言Q?/font>

Lindholm: 通常Q一U语a既不会从别的语言那里获利Q也不会被挤掉。那些坚定的FortranE序员不q用着Fortran吗?对于个h来说Q语a的选择当然因时而异Q但整体而言Q语a的种cd会递增Q也是_它们之间的关pL“有你有我”而不?#8220;有你没我”?/font>

对于一个新语言的接受程度,往往取决于其能力所及。Java技术被q速接受,原因是多斚w的,Internet和World Wide Web接口Q在其他技术面前的挫折感,对于Java技术发展方向的全面影响能力Q都是原因。另一个重要的原因是Java独立于厂商,q意味着在兼容品面前可以从定w择?/font>

C#是否会获得广泛接受?视情况而定。ȝ来说Q那些对于^台无x和厂商无关性漠不关心的E序员,可能会喜ƢC#。那些跟微Yq_捆在一起h当然可能惌LVB 和VC的一个出色的替代品。但是对于程序跨q_执行能力特别x的程序员Q将会坚守Java之类的语a。这U能力对于多重访问设备(multiple access devicesQ和分布式计模型至关重要,而Java语言提供了一个标准的、独立于厂商q行时环境?/font>

 

Stroustrup: C#的流行程度几乎完全取决于微Y投入的资金多。看上去C#的兴赯定会牺牲掉其他一些语a的利益,但是事实上未必如此。Java的蓬勃发展ƈ没有lC++带来衰|。C++的应用仍然在E_增长Q当Ӟ已经不是爆炸性的增长了)。也许其他的语言也还能获得自q一席之地?/font>

不过Q我实在看不出有什么必要再发明一U新的专有语a。特别是微YQ既生VBQ何需C#Q?/font>

 

不同OOP语言各有什么优势和劣势Q?/font>

Stroustrup: C++的优点自始至l都是这么几条:灉|、高效,而且q专有语言。现在ISO C++标准的出玎ͼ巩固了最后一炏V?/font>

我认为C++的高效是它最基本的优炏V这U高效来自于其特有的数据和计模型,较之Java和C#Q这U模型更加脓q机器。不q,哪些E序才真正地渴望q么高的效率Q这是个问题。我认ؓq类E序非常多。h们对于计机的期望,永远都超硬件科技的发展速度。很昄QJava和C#的设计者的x不同Q他们认为,在很多地Ҏ率问题无关紧要?/font>

C++主要的缺点,归罪于糟p的教育Q是那些始终认ؓC++是个Ua面向对象语言的hQ和那些把C++当成C语言变体的hD了这U情况)Q归|于不同q_上的不一致性,归罪于不完整、不标准的编译器实现Q归|于q_无关的系lE序库的~少?/font>

q些问题归于一点,是~Z一个卓的厂商Q能够满x个C++C֌的需求,勇于投入大量的资金开发必要的E序库?/font>

 

Lindholm: Java技术的成功Q是因ؓ它在合适的旉Q出现在合适的地点Q而且合理地选择了语a和计^台的支持目标。Javaq不是在所有场合都优于其他OOP语言Q但是对于出现的新问题能够解军_很出艌Ӏ它面向Internet计算环境Q避免了C++中晦涩的l构Q成功翻了l承机制的恼人问题。垃圾收集机制显著地提高了生产率Q降低了复杂度。在|络背景下用虚拟机Q以及有兛_全性和动态加载的一pd设计选择Q迎合了正在出现的需求和愿望。这些特性Java不仅成ؓ现有E序员的新武器,而且也ؓ新的E序员创造了J荣的市场空间?/font>

此外QJava拥有一个标准化的、二q制形式的类库,提供了必要的Q当然ƈ非充分的Q^C厂商无关性。^C厂商无关性要求一Ҏ术必L清晰的规范,摒弃那些ȝ二进制标准实施的Ҏ。C++虽然有一个ISO标准Q但其实甚至对于相同pȝ与相同指令体pȝ各个q_Q也提不Z个实用的、各版本兼容的二q制标准?/font>

历史上很多用虚拟机的语a饱受责难Q是因ؓ其不够出色的性能问题Q而这要归q于~慢的解释器和糟p的垃圾攉器。Java的早期实C因ؓ同样的问题受C厉的批评。但是自那时P业界向新的虚拟机实现技术投入了大量资金Q取得了显著的效果,如今在大部分场合QJava的性能跟常规的静态编译语a相比毫不逊色。这使得E序员在获得q_和厂商无x的同时Q也不必付出性能上的代h?/font>

C++q没有强制?a target=_new>面向对象ҎQ因此ؓ了编写出色的面向对象代码Q就要求E序员们有相当强的纪律性。很多公司就是因个原因放弃了C++。作aQJava的一个突出的优点是强制面向对象ҎQ不允许非面向对象的l构?/font>

C#介于C++和Java之间Q脚t两只船Q因此既不够安全Q又׃复杂?/font>

 

对于公司来说Q采用新的语a要付出巨大代仗雇不到好的E序员(没h熟悉q种新语aQ,培训费用高得惊hQ学习过E中生率和产品质量下降Q多q的l验随风消逝,{等。一U语a如何克服q些障碍Q?/font>

Lindholm: 说得很对Q采用新东西实常常开销巨大。不q问题是Q这个新东西是否能够节省更多的开支,或者提供巨大的改进Q获取合理的回报Q很多公司发玎ͼ转向Java技术不论在开发的后端Q尽快进入市场、快速P代开发、维护简单性)q是前端Q跨q_发布Q适用范围从低端设备到高端服务器的技术,安全性)Q都能节省大W的开销?/font>

对于C物的接纳Q常常是在痛楚的压力之下。很大程度上Q这正是Java所l历的。Java的生,是对当时很多pȝ的缺h做出的反应。Java技术通过下面的手D减M开发者的痛楚Q?) ֏了网l计方面的需求,是应q而生?) 在技术能力的抉择上,保持良好的品位,֏了大众的心理?) 采用适度强制性策略推行设计决定。此外,Java技术已l成为大学教学中的主,q同样保证了Java开发者队伍的不断壮大?/font>

但是最重要的一ҎQ再没有另一U程序设计技术,能够像Java那样允许E序员开发基于Internet的不同^C上的应用E序。Javaq_在这斚w的杰玎ͼ已经被大量的实例证明。Java已经成ؓInternet上的~省应用E序q_QJava APIs也成为Internet应用E序开发的天然q_?/font>

 

Stroustrup: 微Y和Sun把大W的金钱扔在Java、VB和C#中,q不是因Z良心发现Q也不是因ؓ他们真的怿q些语言能够带给E序员更好的生z,而是利益使然?/font>

有一个说法,认ؓ软g工具厂商如果能够把应用程序开发者的专业技术Q务负担v来,获取巨大的l济利益。我对其背后的经分析颇为怀疑,我认很难成ؓ现实Q特别是当应用程序开发者用开攄、标准化的工hQ他们可以有多种选择Q从而上面的想法更加不可能?/font>

 

多年以前QC++已l具有泛型能?也就是templates和STL)Q有q算W重载,有枚丄型?我们会不会在Java的未来版本中看到q些Ҏ?Java是不是应该纳入这些特性呢Q?/font>

Strousturp:?988-89qvQC++已l有了templates。但是我们花了不时间来了解如何最好地q用q个工具Q早期各厂家对于template的支持在品质上也有很大的差异。有些编译器厂商动作q缓Q至有一个主要的~译器厂商(好像是指微YQ微软在Visual C++4.0才开始支持templateQ在此之前一直声Utemplate是过于复杂而又没什么用的技术,时至今日QVisual C++对于template的支持在L~译器中都属于最差的一档——译者注Q暗中鼓励声名狼藉的反template宣传Q直C们自q于学会了q项技术ؓ止。直C天,对于template的支持在品质上仍然有待改q?/font>

你上面提到的那些Ҏ,我认为JavaQ还有C#Q应该,也肯定会逐渐引入。那些对于程序员来说最有用的语aҎ和概念Q将会逐渐集中Q成为各家主语a的必然之选。也是_我认为类似析构函数和模板Ҏ化之cȝ机制Q远q比枚D{机刉要得多?/font>

 

LindholmQJava技术成功的原因之一Q就是很清楚哪些不该做。我们得多问几个Z么:q项Ҏ是不是必不可少Q增加它会带来哪些开销Q运符重蝲是C++中一Ҏ其强大的Ҏ,但是它也大大增加了C++语言的复杂度Q很多h都难以招架。Java在各U可能的权衡之中Q做Z明智的抉择,扑ֈ了能力与需求之间的完美q炏V?/font>

当然QJava也会发展Q而且最重要的是Q现在是开发者们在推动发展。Java增加泛型能力qg事,很好地展CZJava是如何通过整个开发者社的参与Q在权衡中决定正的q炏V关于增加泛型类型(generic typesQ的“Java规格甌”QJava Specification Request, JSRQ已l进?a target=_new>JCPQ?a target=_new>Java Community ProcessQ程序,而且已经开发了很长一D|_参见 http://java.sun.com/aboutJava/communityprocess/之JSR-014Q。现在,在JCP中,有超q?0个JSRs正在讨论中,q充分体C整个体系对开发者的U极反馈和高度合作,q正是驱动Javaq_不断q化的动力?/font>

 

发展 vs. 革新(Evolution vs. Revolution)

C++是一U发展型的语aQJava和C#g更像是革新型语言Q它们是从头设计的)Q什么时候,革新型的语言才是必需的呢Q?/font>

Lindholm: Java技术ƈ非凭I出世,反而更像是发展型的。Java所有的Ҏ,在Javaq_推出之前Q都臛_已经存在于另一U环境之中。Java的A献在于,在众多的Ҏ和权衡中,做出了合理的选择Q得品既实用Q又优雅。Java技术对于程序员的态度是:抚养Q但不h爱?/font>

 

StroustrupQ从技术上Ԍ我ƈ不认为Java和C#是什?#8220;从头设计?#8221;革新型语a。倘若Java是从技术原则出发,从头设计Q大概就不会模仿C/C++那种丑陋和病态的语法了(不必惊讶QStroustrup在很多场合表CQC++采用C的语法Ş式,实在是迫于兼Ҏ。他本h更偏爱Simula的语法——译者)?/font>

我认为,只有当程序员们面对的问题发生了根本的变化的时候,或者当我们发现了全新的、极其优的E序设计技术,又完全不能ؓ现存语言所支持的时候,我们才需要全新的语言。问题是Q我们恐怕永q也C到那?#8220;Ҏ”?#8220;全新”的情c?/font>

我以为,自从OOP问世以来Q可UCؓ“Ҏ”的新型程序设计技术,唯有泛型E序设计Qgeneric programmingQ和生成式程序设计(generative programmingQ技术,q两Ҏ术主要是源于C++ templates技术的q用Q也有一部分曄被视为面向对象和函数式语a(functional languages)的次要成分,现在都变成正式、可用和可承受的技术了。我对于目前C++模板(template)E序设计的成果非常兴奋。例如,像POOMA, Blitz++和MTL{程序库Q在很多地方改变了数D的方式?/font>

 

Java和C#的一?#8220;卖点”Q就是它们的单性。现在Java是不是快失去q个卖点了?

StroustrupQ新语言L宣称自己如何如何单,对老语a的复杂性颇多非议。其实这U所谓的“单?#8221;Q简单地_是不成熟性。语a的复杂性,是在解决现实世界中极为烦琐和Ҏ的复杂问题的q程中逐渐增加的。一个语a只要zȝ旉够长QM有某些地斚w渐复杂hQ或者是语言本nQ或者是E序库和工具。C++和Java昄都不例外Q我看C#也一栗如果一U语a能够度过自己的幼q时代,它会发现Q自己无论是体积q是复杂性都大大增加了?/font>

 

LindholmQJava技术的的功能在增加Q需要学习的东西也在增加。不q功能的增加q不一定带来复杂性的增加。Java技术的发展Qƈ没有使学习曲U更加陡峭,只是让它l箋向右方g展了?/font>

 

标准

标准化语a和开攑֞语言各自的优点和~点何在Q?/font>

LindholmQ对于一个开放、不允许专有扩展、具有权威的强制性标准语a或者运行环境来_不存在什么缺炏V允怸有扩展就意味着允许厂商下套子绑架客戗特别重要的是,必须让整个^収ͼ而不只是其中一部分完全标准化,才能杜绝厂商们利用高层次的专?a target=_new>API下套子。客戯求有选择厂商的自由,他们既要有创造性,又需要兼Ҏ?/font>

 

StroustrupQ对于一个语aQ如C/C++来说Q徏立正式标准(如ISO标准Q最大的好处Q在于可以防止某一个厂商操U这U语aQ把它当成自q摇钱树。多个厂商的竞争l用户带来的是较低的价位和较好的E_性?/font>

专有语言的好处,一是流行,二是便宜Q不q等你被套牢了之后,情况׃起变化)Q三是对于商业性需求可以做出快速的反应?/font>

标准化语a的特点之一是,它不能忽略特D用L需求。比如我在AT&T中所考虑的东西,其规模、可靠性和效率要求Q跟那些普通厂商关注的大众软g相比Q根本不可同日而语。那些公司很自然只关注主要的需求?/font>

然而,多数大机构和w处前沿的公司,都有着Ҏ的需求。C++的设计是开放、灵zd高效的,能够满我所能想象的M需求。跟其他的现代语a相比QC++的家长式作风可谓之又少Q原因就在这。当Ӟ不能赞赏q一点的Z诟病C++?#8220;危险”?/font>

拥有正式和开放标准的语言主要是ؓ~程工具的用者和客户服务的,而拥有专?#8220;标准”的语aQ主要是为厂商服务的?br>



]]>
真实的C++之父http://www.shnenglu.com/susu/archive/2007/04/06/21412.html学习才能q步学习才能q步Fri, 06 Apr 2007 08:35:00 GMThttp://www.shnenglu.com/susu/archive/2007/04/06/21412.htmlhttp://www.shnenglu.com/susu/comments/21412.htmlhttp://www.shnenglu.com/susu/archive/2007/04/06/21412.html#Feedback0http://www.shnenglu.com/susu/comments/commentRss/21412.htmlhttp://www.shnenglu.com/susu/services/trackbacks/21412.html真实?/span>C++之父

—?/span>Bjarne Stroustrup访谈?/span>

늎?/span>

Bjarne Stroustrup?/span>

 

 

许多重要人物之所以成名,或者是因ؓ其改变了历史或者是因ؓ其创造了历史Q?/span>Bjarne Stroustrup先生Q?/span>C++之父Q属于后者;归结个h成功的原因,理由可能有许多,但他只有显的两个一点点Q他比多Ch天真和理想主义那么一点点Q比多数在解决问题上的时间多一点点?/span>

C++E序设计语言是一U承前启后,被数以百万计的程序员应用在各个领域中的语aQ我们正在用的Windows操作pȝQ我们上|用的浏览器IE无不是出?/span>C++的手W?/span>

C++是一U重要的和比较流行的计算a之一Q也是未来十q内仍然发挥重要作用的语a?/span>C++语言是一U通用的应用广范的E序设计语言Q是一U既支持传统的结构化E序设计Q又支持面向对象E序设计的系l复杂的语言?/span>C++?/span>C语言的扩充首先由 Stroustrup先生?/span>1980q在贝尔实验室提出的Q于1983q改名ؓC++。尽?/span>C++的祖?/span>C语言是世界上最受喜爱和应用最q的专业E序设计语言之一Q但C++的发明是必需的?/span>C++的本质就是让E序员理解和理更大更复杂的E序。而对q种语言有着最大A献的C++之父又是怎样一个h呢?

Bjarne Stroustrup先生Q?/span>1950q生于丹麦港口城市奥胡斯,1975q在奥尔胡斯大学毕业Q?/span>1979q获得剑桥大学计机U学博士学位。他?/span>C++语言的设计者和实现者,现在是得克萨斯州A&M大学计算机系教授?/span>1979q他来到国的新泽西州ƈ加入贝尔实验室,?/span>C语言之父?/span>1983q图灵奖得主Dennis Ritchie以及大名鼎鼎?/span>Brian KernighanQ两人合著?/span>CE序设计语言》)׃多年Q期间参与了贝尔实验室的C语言标准化活动。他的研I兴十分广泛,包括分布式系l、操作系l、仿真、设计以及编E,Bjarneq积极推?/span>C++?/span>ANSI/ISO标准化?/span>

20世纪90q代以后Q?/span>Bjarne Stroustrup步入人生的最辉煌时期?/span>

1990q_Bjarne荣获《胦富》杂志评选的“国12位最q轻的科学家”U号?/span>

1993q_׃?/span>C++领域的重大A献,Bjarne获得?/span>ACM该年度的 Grace Murray Hopper大奖q成?/span>ACM院士Q成立于1947q的ACM协会是历史最悠久、目前世界上最大的教育和科学计协会,成ؓACM院士是个人成q里程)?/span>

1995q_BYTE杂志颁予?#8220;q?/span>20q来计算机工业最具媄响力?/span>20?#8221;的称受?/span>

除了他的专业研究领域外,他对历史Q通俗文学Q摄影,q动Q旅行和音乐{有q泛的兴。他?/span>C++语言的推q也做出了极大的贡献Q他写的?#8220;The C++ Programming Language?/span>C++E序设计语言?#8221;已经成ؓq种语言中最为流行的学习资料Q至被译?/span>18U语a?/span>

 

l中国程序员最好的祝?/span>

2004q?/span>12?/span>8日,杭州Q?/span>C++之父Bjarne Struostrup先生再次来到中国。我们有qR访到了这位大师!L大师l中国程序员的最好愿?/span>

问: 您对中国和中国的E序员有什么认识?您想对他们说点什么吗Q?/span>

Bjarne StroustrupQ?/span>中国是个大国Qƈ且她有许许多多有的文化。我惛_中国E序员说的和对其他国家的E序员说的是一LQ所以我有如下的回答Q优U软g所h的特点和技术在全世界都是通用的?/span>

 

?/span> C++之父l中国程序员最好的祝?/span>

 

现在Q成Z名电脑高手是许多q轻学生的梦惻I面对Stroustrupq样一位大师人物的出玎ͼ最令我们感兴趣的问题莫q于Q?/span>Bjarne成ؓ大师的历E是什么样子的呢?

Bjarne Stroustrup先生出生的奥胡斯市是日德兰半岛东v岸的一个美丽的城Q那里每安有自q公寓,公寓里有个小院,院是孩子们t球的地方Q那Ӟ成ؓ一名球明星比成ؓ一名电脑高手是更可行的xQ做一名电脑名星好象是很遥q的事情Q因ZZ太可能拥有一台昂늚计算机。很q运Q在大学时他q上了p里的计机Q它?/span>GIERQ是一台旧的丹麦计机Q有一个房间那么大Q程序都写在带上面Q他用它学习Algol 60E序设计?/span>

而对Bjarne生活产生质的变化的事情是什么呢Q?/span>

他认为在他的发展生中,最关键的一个项目是在剑桥大学攻d士学位时?/span>Simula67计算机做的模拟分布式pȝ。做q个目除了使他成ؓ一名顶的E序设计高手外,更他养成了E序员应h的沟通和交流能力Q这Z后来的发展奠定了坚实的基?/span>

 

 

B?/span>C

Bjarne?/span>C有缘?/span>

Bjarne Stroustrup先生?/span>CQ?/span>China中国Q有~,对他来说中国是一个神U、美丽而有的国度?/span>

Bjarne两度亲密接触中国Q第一ơ是2002q_曑֜中国的几所大学讲学Q而第二次是在江大学参加ICESS国际会议Q?span>ICESS 2004, http://www.cs.zju.edu.cn/icess2004/Q?/span>?/span>Bjarne Stroustrup先生两年前在中国有过长时间的旅程Q而在杭城的日子恰逢阴雨,q次到来Ҏ天的期望是强烈的Q何冉|杭州西湖景。作Z麦hQ也是卖火柴的女孩诞生的地方Q也是安徒生童话诞生的国度Q和中国有着很深的渊源,安徒生童话里恰y里面有一《夜莺》,那里写到了中国,?/span>Bjarne Stroustrup先生对于CQ中国)的认识又是什么呢?

他的回答很微妙,他自然知道安徒生童话Q他也很喜欢它们Q《夜莺》中描绘的中国纯是虚构,与当时的中国可能有也可能没有M关系Q安徒生创造了那个“中国”来泛指多个国家及其统治者。而作Z个教育者,他对中国的教育老祖师孔老夫子也有自q到的见解?/span>

作ؓW二?/span>CQ自然就?/span>C++了。勿庸置疑,C++对于IT的分量,和对?/span>Bjarne个h的媄响,都是巨大的。还有一?/span>CQ就是计机Q且看下面他如何描述自己与计机的联pR?/span>

问: 您的生活是怎样和计机联系在一LQ?/span>

Bjarne StroustrupQ?/span>我也不晓得自己到底是怎样和计机联系在一L。当我上高中Ӟ不知什么原因总觉得计机U学是数学的某种实用形式。而事实不完全是这P或者至从软g的发展上看ƈ不是如此Q但正是q种误解使得我在q不知计机Z物时选择?/span> “计算机科学数?#8221; Q作为我学习的专业,q获得了我的士学位。我写完W一个程序后Q就着了迷Q曾没有回过头。正象大家所看到的,很幸q,我找C一个自己的才能可以很好地发挥的位子?/span>

问:您怎样教育自己的孩子和学生们?

Bjarne StroustrupQ?/span>多数情况下,我是通过实例来进行教学的。我认ؓ多数高的估计了言语的影响力,而过低的估计了这U媄响力是怎样辑ֈ的过E。我量通过把理论和实践相结合v来以?/span>好地辑ֈ目的Q这样可以比仅用理论或仅用实늤例来教育更能取得事半功倍的成效。我量丑և实例Q从q些zȝ生的实例中引导归U_一般的规则和概c?/span>

 

C++是怎样炼成的,是什么促成了C++语言Q这象迷一L在我们的心头Q那什么又是计机语言呢?后者弄懂了Q前者看h也许更单了Q且看大师的回答Q?/span>

问: 您觉得计机语言和我们hcȝ语言有什么不同呢Q?/span>

Bjarne StroustrupQ?/span>计算a要比人类语言单的多,q且_的多Q那也是它应该具有的方式。我不赞成用自然语言L令电脑的x。一U程序语a是专家们的工Pq且和普通h相比Q是Ҏ有的专家来说用更加专业、定义的更加_的符号和术语来表辄工具?/span>

当然两者也有相同之处。那些用的较多的语言比那些用率较小的语a拥有更多的俗语、表达方式、词汇,q一Ҏ论是计算aq是自然语言都是一L。语aq有一个們֐是来易学,但却很难_N,象E++ 和英语。在两种语言当中Q我们都希望能从最初的基本的应用到真正的掌握。另外一个相同之处就是语a的发展都要适应一个群体的需求,q且一个大的群体或者说C֌本n有重要意义Q因Z个群体的一部分可以让你有更多的人来q行互动q且有更多的Z可以使用。所有鲜zȝ语言都是通过获得新的术语、俗语和表达方式来得到发展的。在C++中我们已l看C关于模板技术的q猛发展Q始因是STLQ注QSTL指标准模板库Q后面我们将采访STL之父 Stepanov先生Q他实有许多精彩的a论,?/span>Bjarne Stroustrup先生相比Q毫不逊色Q,也就是经常提到的泛型~程Q?/span>generic programmingQ?/span>和模板元E序Q?/span>template metaprogrammingQ?/span>。以后几q里Q我们将会在新的ISO C++标准中看刎ͼ?998q标准中Ҏ板技术更强的支持和更q的应用?/span>

 

那么Q究竟是什么促成了C++语言呢?

他的研究生Ӿl了他很大灵感,他所在的AT&T贝尔实验室是一个光荣的体Q那里有一非常出色的研究人员Q那里有许多著名?/span>IT人物Q他们彼此间的媄响十分深q。他曄?/span>C语言之父Dennis Ritchie亲密接触十多q_他们的办公室相距不远Q?/span>C++语言?/span>C的媄响是巨大的。而对?/span>C++来说Q尤其值得我们推崇的是Q作ZU学术性语aQ他是从商业性语a的重围中杀出的?/span>

1979q?/span>Bjarne在剑桥完成学业后Q到了贝实验室从事研究工作Q?/span>20世纪80q代Q?/span>AT&T曾拔?/span>5000元作ؓ市场预算Q创Z门语a的决心可能由此而始。在那里Q开始研I几个与分布式计有关的目。可是工作进展得q不利Q因为那时几乎所有程序设计工具都不适合完成此类工作。所以,他决定自己开发一个名?#8220;带类?/span>C”的工P它既允许以类gSimula的方式组l程序(q种方式现在被称为面向对象)Q同时也支持在硬件层ơ上q行pȝ软g开发。从1980q开始,“带类?/span>C”被应用于贝尔实验室的很多应用领域Q在应用q程中,他又学到了很多东西,?/span>C++正是?#8220;带类?/span>C”为基q结合了一些我们学到的C西发展而来的?/span>1983q夏天,Rick Mascittilv?/span>C++的名字,q个名字也象征着两种语言之间巨大的渊源?/span>

 

 

生活中更有意义的事情

对于Bjarne来说Q生zM更有意义的事情是什么呢Q是学习和教肌Ӏ这看v来象个沉重的话题Q而在Bjarnew上却显得如此生动,作ؓ教育ӞBjarne Stroustrup先生本n便是一个成才的典范Q他n于农场和“蓝领工h”家庭Q他在专业领域孜孜耕耘,取得了不菲业l。先?/span>AT&T的研I者,现在又兼L席,Bjarne从研I室又走q了大学Q直接面对大学的新学生!

C++?/span>Bjarne生命中最重要的事情,而还有一些更有意义的事情?/span>

他对大学教育情有独衷Q他现在?/span>A&M大学的教授,q种行动便是很好的说明,在这里,以一U在AT&T研究所中无法采用的方式研I和教学l合h。他认ؓ教学是一U与工业生不同的能影响世界q其变得更加美好的方式Q而且大学里的研究工作的成果与曄q行的工业研I的q不相同 - 不是说它更好Q仅仅只是不同而已?/span>

他的一些教育观点也非常值得我们深思:

他说Q不要只学习计算机和~程Q要U篏一U或多种领域的经验,要有其他专业知识Q这样就能明白什么东西值得我们ȝE实现。另外,学习多种语言也是他一再强调的Q如果只学一U,ҎD惌力的僵化。他本h爱好q范Q精通多U计机语言?/span>

 

 

 

问:您觉得怎样才是学编E的好方法?学习语言时一U好的工h不是必需的?

Bjarne StroustrupQ?/span> q是q去一q左右里一直占据我大部分注意力的一个问题。我志愿教授电子工程/ 计算机工E专业大学一q的学生编E,我认为我们目前教~程的传l方法不够严谨也不够qK。我们社会的文明q步是徏立在软g上的Q因而必dL好的软g专家。我认ؓ已经C我开始培L手程序员的时候了Q在我此之前我都是把_֊攑֜专家上。我基本的设x让学生成ZӞ使他们最l能够编出可靠ƈ且别人可以信赖的软gQ这意味着在培L手时要求更高Q要重Ҏ在对E序正确性和处理错误的训l上。既然目标是Z刉现实世界中可用的YӞ我也非常重视标准库的应用和设计。对于C++标准库工L教学Q例如向量(vectorQ和字符(string)从第一周就该开始应用,在第一个月之内c(classQ就应该介绍Q在W二个月之内介绍囑ŞQgraphicsQ和l承性(inheritanceQ。这U方法和传统的方法不同,那些教学Ҏ往往p数周的时间来区分那些令hqh的C++基本cdQƈ且浪费宝늚旉来处理诸如声明和循环上的一些迷目的语法细节。我U我的方法ؓ“深度优先?#8221;Q因为我们首先教我们的学生够的知识d一些有用的工作Q然后才在这有限的基上拓宽他们的理解能力和对工具的用能力?/span>

我所有的教学都是在实例的基础上进行的。我通过典型的例子来使学生理解,用亲w的体会来解释一些规则。自然地Q我要求学生写大量代?/span>?/font>如果你不M不写大量代码的话你就学不会编E。第一阶段如下Q学生必ȝq亲w写代码Q体会解题过E中出现的实际问题;W二个阶D必d好体会亲w所犯的错误Qƈ且学会克服他们。这其中Q调试、错误处理,q有学会大问题分解成小问题Q从最的lg来编E是非常重要的?/span>

 

?/span>:数学和计机U学有什么关pdQ?/span>

Bjarne StroustrupQ?/span> 两者ƈ没有很强的直接联p,但是有一部分~程的实质包含在里面-- -象学数学一P~程有时也需要很严密的思维。自从古希腊以来Q数学就被用来训lh们的逻辑思维Qƈ且我觉得如果不用数学的话很难惌怎样才能~出好程序来。当然也有一些计机领域Q用到高q数学知识。然而,q些领域通常是非怸业的。数学,特别是数学思维是计机的一个支柱。经验主义是另一支柱Q通过观察和测量来帮助理解实际的发展,用以调整我们的系l和行ؓ。两斚w我们都需要。计机U学不是仅仅用来证明定理的,也不是仅仅用来收集数据的。ؓ了有效地实践计算机科学和发展高质量YӞ更同旉要数学和l验的训l?/span>

问: 您以前在Ƨ洲学习而现在在国工作Q您觉得Ƨ美有什么学术传l区别?怎样才算是一U好的大学教育呢Q尤其对计算机科学来说。现在的大学有部分学生中途退学,您怎样看待q一现象呢?

Bjarne StroustrupQ?/span>q很隑֛{。欧z和国都幅员辽阔,而且有很多不同的学术传统。真的不好ȝQƈ且在两地都有一些非常好的大学科p,q不是很Ҏ区别和下l论的?/span>

很少有学生离开学校d公司Q较多的是离开学校M事一些有较高收入的工作,但大多数是完成了学业。我印象中那些放弃了计算机科学学习{而投入业界工作的是会为此感到后悔的。从长期眼光来看学位对一个好工作来说是重要的Q特别是学生在他们最后一q或最后几q的学习。当然也实有些相反的例子,但那些h通常永远不会再从事真正的技术工作,而{为商业管理h员了Q如果那是他们想做的Q那一个学位ƈ不是必须的。我一直认?span>:一个学生如果还未获得学位,最好不要离开学校?/span>

问:我们l常批评我们现在?span>C++教育不够C、不够科学,您是通过“深度优先?#8221;来教授学生的Q您是否觉得在一个学生学习早期有些难吗?我们该如何做呢?

Bjarne StroustrupQ?span>q是必然的。传l的教授~程的方法是不行的,学完q些评的学生写不出很好的代码。说得更Ȁq一点,他们甚至不知道什么是好的代码Q我的方法可以避免这U情况发生。我已在300 名学生n上实验成功。对于程序员来说q是非常关键的——包括新E序员——了解基本概念和基本技能。但仅仅了解E序设计语言的基本构造是不够的。另一斚wQ如果没有一U编E语a我们׃可能教授~程的技能和规则Q因此,对一U语a工具充分掌握Q做可能多的练习是必需的?/span>

很显Ӟq种教育问题不仅仅局限于C++语言。我的方法可以应用于M其他语言?/span>

 

面向金钱、面向未来和面向对象

面向对象是个有趣的问题,C++正是和面向对象有着非常联系的语aQ作ZU非商业化语aQ他已经影响了世界范围数十亿元的设计决{。而还有许多语ahq种特点,因而,关于各种语言的争论喋喋不休地q行了几十年?/span>

当有人问Bjarne Stroustrup先生Q有Java是纯_w向对象的Q而C#更胜一{,而还有很多h说它们纯_Ҏ面向金钱的。以您之见呢Q?/span>

Bjarne 的回{非帔R:我喜?#8220;面向金钱”q个?:-) q有Andrew Koenig的说?面向大话"我也喜欢。C++可不面向q两个东东。对q点我还x出,我认为纯_Ҏƈ非什么优炏VC++的优Ҏ恰在于其支持多种有效的编E风|多种思维模型吧,如果你一定要q么_及其l合。最优雅最有效也最Ҏl护的解x案常常涉及到一U以上的风格Q编E模型)。如果一定要用吸引h的字|C++是一U多思维模型的语a。在软g开发的庞大领域Q需求千变万化,L需要一U支持多U编E的设计风格的通用语言Q而且很可能需要一U以上呢。再_世界之大Qd得下好几U编E语a吧?那种认ؓ一U语aҎ有应用和每个E序员都是最好的看法Q根本就是荒谬的?/span>

他上面的回答很好地告诉了我们面向对象和面向金q关系Q也l我们的争论划上了圆满的句号?/p>

问:您对面向对象是怎样理解的?它是不是一U好的可接受的编E思考方式?有没有学?/span>OO必须的有用的工具Q?/span>

Bjarne StroustrupQ?/span>OO 技术在现在软g发展的扮演了非常重要的角Ԍ但ƈ不是唯一的方法。象泛型E序设计Qgeneric programmingQ?用C++ 模板是另一U方法,q些Ҏ必须通过l合应用来,才能创造出Q一的、最可读的、最易于l护的、最高效的程序。但没有M一U方法是适合所有要求的?/span>

我主要用C++来编E。我觉得C++是一U学习和实践OO思想很好的编E语a?/span>

 

?/span> 敢问路在何方

问: 您能?/span>IT的将来做一下预吗Q将来我们最有可能用什么语aQ?/span>

Bjarne StroustrupQ?/span>一个聪慧的q默大师曄说过Q预是困难的,特别是对来的预。但是我认ؓ未来十年之内我们用的东西在今天的实验室里是能够看到的。另外我们将用的最主要的语a也是今天最主要的。我们不可能因ؓ一些新东西和一些更好的东西的出现就重组整个工业领域Q因此在五到十年之内Q我们还是用C, C++, COBOL, Fortran, Java, Perl, PythonQ也许还有C#Q和其它许多U语a。没有一U语a能适合所有用途,q且好的E序员都懂ƈ且都能用好几U语a。懂好多U语a和多U程序设计技术会使我们可以更好地~程?/span>

对于IT我不惌太多Q很昄Q我们会l箋依赖ITq且它会延到越来越多的领域。当Ӟ肯定会有p|Q通常是因度的滥用引v的——但是在十年以后我们受IT的媄响肯定要比今天大得多?/span>

 

 

 

人物印象

 

很幸q,通过电邮采访的同时终于有Z和大师面寚w。想象中的大师和面对面见到的有太多的意想不到Q用一个词来ŞҎ“谦?#8221;?/span>

Bjarne到杭州下了飞机,便扑向美丽的西湖Q同ȝ是他的好?/span>STL之父Alex Stepanov先生。在未去杭州之前Q?/span>Bjarne Stroustrup先生通过电邮告诉我杭州城的美Q去了之后,有的好天气让我们碰上了Q爽Q夜里在旅馆见到了久q的大师Q一夜之间见C位大师,更爽Q?/span>

我对Bjarne Stroustrup先生有着Ҏ的感情,觉得他象位慈Ӟ而他正和我的父亲同样的年U。大师,慈父Q接触越多,?/span>Bjarne Stroustrup先生的感触越深。到了杭城,见到大师其hQ这U感觉越来越厚Q他又象P既有热情Q又能包宏V?/span>

采访大部是通过E?/span>mailq行的,采访的过E中Ҏ的问题孜孜以求,l我的回{细微备臻IE?/span>mail的好处在此发挥到了极_大洋q边的我沐着阛_Q那边的他在挑灯夜书?/span>

唯有谢谢众多C++E友和非C++朋友Ҏ的支持,唯有大师再来杭城Ӟ到最好的茉上好的龙井泡上Q亲手送到大师的手中!

2004q?/span>12?/span>19?/span>



]]>
new/delete 与malloc/free 的区?/title><link>http://www.shnenglu.com/susu/archive/2007/04/06/21407.html</link><dc:creator>学习才能q步</dc:creator><author>学习才能q步</author><pubDate>Fri, 06 Apr 2007 07:28:00 GMT</pubDate><guid>http://www.shnenglu.com/susu/archive/2007/04/06/21407.html</guid><wfw:comment>http://www.shnenglu.com/susu/comments/21407.html</wfw:comment><comments>http://www.shnenglu.com/susu/archive/2007/04/06/21407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/susu/comments/commentRss/21407.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/susu/services/trackbacks/21407.html</trackback:ping><description><![CDATA[1  new自动计算需要分配的I间Q而malloc需要手工计字节数<br>2  new是类型安全的Q而malloc不是Q比如:<br>int* p = new float[2]; // ~译时指出错?br>int* p = malloc(2*sizeof(float)); // ~译时无法指出错?br>new operator ׃步构成,分别?operator new ?construct<br>3  operator new对应于mallocQ但operator new可以重蝲Q可以自定义内存分配{略Q甚至不做内存分配,甚至分配到非内存讑֤上。而malloc无能为力<br>4  new调用constructorQ而malloc不能Qdelete调用destructorQ而free不能?br>5  malloc/free要库文g支持Qnew/delete则不要? <img src ="http://www.shnenglu.com/susu/aggbug/21407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/susu/" target="_blank">学习才能q步</a> 2007-04-06 15:28 <a href="http://www.shnenglu.com/susu/archive/2007/04/06/21407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>const使用详解http://www.shnenglu.com/susu/archive/2007/04/06/21391.html学习才能q步学习才能q步Fri, 06 Apr 2007 05:36:00 GMThttp://www.shnenglu.com/susu/archive/2007/04/06/21391.htmlhttp://www.shnenglu.com/susu/comments/21391.htmlhttp://www.shnenglu.com/susu/archive/2007/04/06/21391.html#Feedback1http://www.shnenglu.com/susu/comments/commentRss/21391.htmlhttp://www.shnenglu.com/susu/services/trackbacks/21391.html 如果const关键字不涉及到指针很好理解,下面是涉及到指针的情况:    
  int   b   =   500;  
  const   int*   a   =   &b;                             [1]  
  int   const   *a   =   &b;                             [2]  
  int*   const   a   =   &b;                             [3]  
  const   int*   const   a   =   &b;                  [4]  
   
  如果const位于星号的左侧,则const是用来修饰指针所指向的变量,x针指向ؓ帔RQ如果const位于星号的右侧,const是修饰指针本nQ即指针本n是常量。因此,[1]和[2]的情늛同,都是指针所指向的内容ؓ帔RQconst攑֜变量声明W的位置无关Q,q种情况下不允许对内容进行更Ҏ作,如不?a   =   3   Q[3]为指针本w是帔RQ而指针所指向的内容不是常量,q种情况下不能对指针本nq行更改操作Q如a++是错误的Q[4]为指针本w和指向的内容均为常量? 
  另外const   的一些强大的功能在于它在函数声明中的应用。在一个函数声明中Qconst   可以修饰函数的返回|或某个参敎ͼ对于成员函数Q还可以修饰是整个函数? 
  有如下几U情?  
  A&   operator=(const   A&   a);  
  void   fun0(const   A*   a   );    
  void   fun1(   )   const;         //   fun1(   )   为类成员函数  
  const   A   fun2(   );  
  ----------------------------------------------------------------------------------  
  const的初始化  
   
  先看一下const变量初始化的情况  
  1)   非指针const帔R初始化的情况Q? 
  A   b;  
  const   A   a   =   b;  
   
  2)   指针(引用)const帔R初始化的情况Q? 
  A*   d   =   new   A();  
  const   A*   c   =   d;  
  或者:const   A*   c   =   new   A();  
  引用Q? 
  A   f;  
  const   A&   e   =   f;       //   q样作e只能讉K声明为const的函敎ͼ而不能访问一般的成员函数Q? 
  ----------------------------------------------------------------------------------  
   
  作ؓ参数和返回值的const修饰W? 
   
  其实Q不论是参数q是q回|参数传入时候和函数q回的时候,初始化const变量  
  1   修饰参数的constQ如   void   fun0(const   A*   a   );   void   fun1(const   A&   a);  
  调用函数的时候,用相应的变量初始化const帔RQ则在函C中,按照const所修饰的部分进行常量化Q如形参为const   A*   aQ则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;如Ş参ؓconst   A&   aQ则不能对传递进来的引用对象q行改变Q保护了原对象的属性? 
  [注意]Q参数const通常用于参数为指针或引用的情?  
  2   修饰q回值的constQ如const   A   fun2(   );   const   A*   fun3(   );  
  q样声明了返回值后Qconst按照"修饰原则"q行修饰Qv到相应的保护作用? 
  const   Rational   operator*(const   Rational&   lhs,   const   Rational&   rhs)  
  {  
  return   Rational(lhs.numerator()   *   rhs.numerator(),  
  lhs.denominator()   *   rhs.denominator());  
  }  
   
  q回值用const修饰可以防止允许q样的操作发?  
  Rational   a,b;  
  Radional   c;  
  (a*b)   =   c;  
   
  一般用const修饰q回gؓ对象本nQ非引用和指针)的情况多用于二目操作W重载函数ƈ产生新对象的时候? 
  [ȝ]   一般情况下Q函数的q回gؓ某个对象Ӟ如果其声明为constӞ多用于操作符的重载。通常Q不用const修饰函数的返回值类型ؓ某个对象或对某个对象引用的情c? 
  原因如下Q? 
  如果q回gؓ某个对象为constQconst   A   test   =   A   实例Q或某个对象的引用ؓconstQconst   A&   test   =   A实例Q?  Q则q回值具有const属性,则返回实例只能访问类A中的公有Q保护)数据成员和const成员函数Qƈ且不允许对其q行赋值操作,q在一般情况下很少用到?   
  ----------------------------------------------------------------------------------  
  cL员函Cconst的? 
   
  一般放在函C后,形如Qvoid   fun()   const;  
  如果一个成员函数的不会修改数据成员Q那么最好将其声明ؓconstQ因为const成员函数中不允许Ҏ据成员进行修改,如果修改Q编译器报错,q大大提高了E序的健壮性?   
   
  ----------------------------------------------------------------------------------  
  使用const的一些徏? 
   
  1   要大胆的使用constQ这给你带来无的益处Q但前提是你必须搞清楚原委;  
  2   要避免最一般的赋值操作错误,如将const变量赋|具体可见思考题Q? 
  3   在参C使用const应该使用引用或指针,而不是一般的对象实例Q原因同上;  
  4   const在成员函C的三U用法(参数、返回倹{函敎ͼ要很好的使用Q? 
  5   不要L的将函数的返回值类型定为const;  
  6   除了重蝲操作W外一般不要将q回值类型定为对某个对象的const引用;  

const * ?* const

const *表示指向const对象的指针,可以指向一个const的对象,但是q不是指只能指向一个const对象Q指向const对象的指针同样可以指向一个非conscd的对象。但是const的对象只能由const*cd的指针指向,而不能由普通指针指向。const*cd的指针在使用q程中可以其改变Q即可以指向其他对象?/div>
const*cd的指针的真正含义是:如果一个指针是const*cd的指针表C指针指向的对象不能通过该指针进行修改(对象本n可能通过别的方式q行修改Q?nbsp;
*const expression表示指针(expression)本n是constQ即*constcd的指针初始化后不能改变,不能指向别的对象?nbsp;
char * point_char = new char('e');
const char char_char = 'f';
const char * const_star_char;                       // 可以不用初始?/div>
char *const  star_const_char = point_char;    // 必须初始?/div>
const_star_char = &char_char;                     // OK
star_const_char = &char_char;                     // 错误Q?const 不可改变
const_star_char = star_const_char;              // OK
star_const_char = const_star_char ;              // 错误 Q?const 不可改变
const char* const foo(char const * const str) const

W一个const表示q回cd为constQ也是不能把此函数的返回值当作左值来使用?br>
W二个const表示指针的不可变性,但在q是可以省略Q因cd已经是const?br>
W三个cosnt表示str的常量性,也就其内Ҏ不能改变Q可以写在其前面的char的前面?br>
W四个cosnt表示str的指针的帔R性,也就是此指针不能指向别的地址?br>
W五个cosnt表示此函数的帔R性(前提是类的成员函敎ͼQ不能修Ҏ在类的数据成员?br>

]]> ޹þþþþþ| þ99Ʒþþþ| ݺɫۺϾþ| þ޾ƷƷ| þþþþۺ| vĻþ 뾫ƷþɪӰ | þù޾Ʒ鶹| þþһ| AVպƷþþþþ| ޹ƷƬþ| þþžѾƷ6| þWWW˳һƬ| ŷ츾þþþþò| ˳ɾƷþþþ| þһ| ŷպþþƷһ| ޾ƷþþþþͼƬ| þþþþþƷͼƬ | ݲݾþþר| þۺϺݺɫۺ| þ91ᆱƷ2020| þˬˬAVƬ| ޹ŮƷþþþá| þþƷ99þ㽶ɫ| ޾Ʒþ| ޹˾þۺ| ˾þô߽AV| þ99þ99СݾƷӿ| þúݺɫۺ| պþëƬ | þþùƷ| һɫþۺ޾Ʒ| 97þþþ| þAAAAƬһ| þˮav뾫Ʒ鶹| Ʒvaþþþþþ| þþþþþƷο| ƷһþþƷ | þAVij| þþþƷsmվ| þþƷŮAV|