
2011年3月4日
作者介紹:Brian Peasland,Techtarget網站Searchoracle子站的資深專家,SGT, Inc.公司首席DBA。Oracle7.3,8和8i的OCP,計算機科學碩士學位,專攻數據庫方向。Brian 在IT行業從業已有20年,并且是從計算機操作人員到操作分析員、然后成為系統管理員,隨后成為應用軟件開發人員直至目前的DBA. 可以說,Brian本身的職業歷程就是一部完整的DBA成長指南,后來他應美國Techtarget網站之邀,寫了一個白皮書——《Grow that DBA Career》并發到了其個人的網站上 Peasland.net.
許多年來,我在不同的新聞組上花費了很多時間與那些想知道如何得到數據庫管理員(DBA)的工作或者如何成長為一名DBA的IT人進行交談,現在他們有了工作。這些年來許多人針對如何達到這個目標提出了不同意見。本文即是那些意見的綜合并且能夠在如何才能出色的完成DBA的工作方面給出好的建議。這篇文章同樣對于如何讓一名DBA變得對老板更有價值。假如你已經是一名DBA,那么也許你會希望跳過文章的前幾段。
我應該成為一名DBA么?
我曾問過的一個問題是一個人應該從事DBA這樣的職業么。這個問題并不容易回答,因為它因人而異。有的人有成為一名好DBA所需要的天賦。而其他人并不認為能夠很容易掌握成為DBA的秘訣。DBA職業需要掌握一定的技能。而且還需要其他IT職業所不必需的要求。因此,為了回答這個問題,我通常給將要成為DBA的人描述DBA職業所必需的要求。下面的段落中,我都將以問題結尾。在繼續下一段以前請花一些時間考慮并且回答這些問題。
許多人因為許多原因而立志要成為DBA。其中一個主要原因是薪水。DBA是IT業中薪水最高的職業之一。其他人想成為DBA是因為喜歡贊揚 DBA是受到的榮譽,或者因為他看上去很酷!我個人認為,成為DBA是很值得的。它是一個很有意思,令人興奮的職業。那么,你把DBA作為一個可能的職業選擇的原因是什么呢?
除非你已經提前準備好了,否則你可能會發現從事DBA職業充滿了挫折和令人頭痛。一個數據庫存在于操作系統和最終用戶應用程序之間。同樣地, DBA必須非常精通他的數據庫所在的操作系統。DBA并不一定需要知道所有有關操作系統的知識,但是他知道得越多越好。數據庫與操作系統聯系非常緊密。理解這種關聯是十分必要的。DBA還需要知道服務器硬件以及它如何影響與幫助數據庫。同時,DBA必須理解應用軟件。DBA可能會被要求幫助開發人員創建可靠,健全的數據庫應用程序。還有,最重要的也是最明顯的,DBA必須十分徹底的理解數據庫引擎,它是如何工作的,所有的引擎是如何組合在一起的,以及如何影響數據庫引擎向最終用戶和應用程序傳送數據的能力。我見過的最好的DBA有非常深刻的理解而且不僅僅在數據庫本身。他們知道一些系統管理與應用開發。好多時候他們在成為DBA之前有其中一個或兩個背景。無論如何,成為一名合格的而不是出色的DBA也需要許多背景知識。你是否已經做好準備開始學習直到你感到已經無法再學下去了?
許多和我交談過的,在開始DBA職業時遇到困難的人,在嘗試著吸收大量DBA所需了解的信息時實際上都會有一些問題。畢竟系統管理員是全職學習操作系統的細節。應用程序開發人員全職學習如何編寫好的程序。DBA不僅要非常了解這兩種不同的工作,而且還需要花費更多的時間去理解數據庫的體系結構,以及理解每一樣東西的每一塊是如何組合在一起的!聽起來是不是很讓人畏縮?有許多人失敗后這樣想,并且把DBA工作看作一項非常困難的事情。也有那些傳播和理解所有這些信息,并且使用這些信息做出好的,聽起來具有技術性的決定的人。正如我以前是一名DBA時喜歡說的,所有這些對我來說看上去像一個大謎團。把這些所有的很好的組合在一起就是挑戰。你是哪一種人?
許多DBA是隨時侯命的。他們會在白天或晚上的所有時間接到呼叫去解決他們的數據庫出現的致命問題。數據庫是商業信息技術基礎組織的必不可少的組成部分。沒有數據,就沒有必要擁有一個計算機系統。數據推動商業。假如amazon.com的網站不能在數據庫中搜索產品并且假如沒有人能夠為他們的產品下訂單,那么它會變成什么樣?它就不會在商業中存在很久。當數據庫down掉,即使只是很短的時間,公司也會損失重大。基于這個原因,DBA到達現場后必須盡可能迅速的解決問題。許多公司有自己的DBA團隊以便可以輪流待命。這些DBA 24x7小時的維持數據庫應用程序。假如工作需要的話,你準備好隨時候命了么?
一些DBA的職責包括為軟件打補丁或者對數據庫做些改變。通常,這些操作不能在公司職員工作的時候做,因為此時數據庫必須運行以便他們能夠工作。這意味著DBA經常不得不在很早或者深夜甚至周末,總之,在正常工作時間以外來完成工作。你準備好在非正常時間工作,或者你在找一個朝九晚五的工作?
對DBA而言,需要掌握的一個重要內容就是通常被稱為“軟技術”的東西。DBA需要在團隊中很好的工作,通常團隊是在變化的,如系統管理員,網絡管理員,應用程序開發人員,項目經理和其他人。DBA要能夠用流利的英語解釋復雜的技術概念,讓團隊中其他人明白。DBA還要能夠在數據庫相關問題上指揮團隊隊員。你的軟技術怎么樣?
下面不是全部列表,但是包括了DBA的典型職責:
· 把監視數據庫實例當作每日必做工作以保證其可用性。解決不可用的問題。
· 收集系統統計和性能信息以便定向和配置分析。
· 配置和調整數據庫實例以便在應用程序特定要求下達到最佳性能。
· 分析和管理數據庫安全性。控制和監視用戶對數據庫的訪問。必要時審計數據庫的使用。
· 監視備份程序。必要時提供恢復。測試備份與恢復程序。
· 升級RDBMS軟件并且在必要時使用補丁。必要時升級或者遷移數據庫實例。
· 通過數據庫相關動作來支持應用程序開發人員。
· 跟隨數據庫趨向和技術。當可應用時使用新技術。安裝,測試和評估Oracle新的相關產品。
· 執行存儲和物理設計。均衡設計問題以完成性能優化。
· 創建,配置和設計信的數據庫實例。
· 診斷,故障檢測和解決任何數據庫相關問題。必要時聯系Oracle支持人員以便使問題得到較好的解決。
· 確保Oracle網絡軟件(SQL*Net, Net8, Names, OiD)配置和運行的很好。
· 與系統管理員(Unix& NT)一起工作以保證Oracle相關事務得到很好的處理。
· 為有效的,定期的維護數據庫創建任何必要的腳本。
前面各段的問題是為了使你考慮一名DBA該做些什么,幫助你決定這是不是適合你的職業。我并非意味著假如你的目標是成為DBA這些會阻止你。我只是嘗試著展現一些事實。我看到過一些DBA一旦被實際工作打擊了就一蹶不振。他們花費時間,精力和一些金錢獲得了他們的第一份DBA工作。我個人認為這個職業非常有價值。而且我無法想像現在做任何其他的會怎樣。所以,這一段幫助你決定這是不是你希望從事的。假如它是,那么盡你所有去得到它!
我怎樣得到第一份DBA工作?
你已經閱讀了前面的段落并且認為成為一名DBA是一個好的職業。祝賀你!我希望你的職業能變成你想像得那么令人興奮和有意義。那么,你如何找到第一份DBA工作?這個問題我已經聽別人問了許多許多遍。
在90年代早期,因特網急速發展。它使公司象草一般萌芽。公司蜂擁而至并且開始創建他們在網上的形象。幾乎所有這些有網站的公司都需要一個數據庫作為 web應用的后臺。不幸的是,當時在該領域卻沒有那么多DBA。在IT業,DBA變得奇缺。那段時間里,得到一份DBA工作看上去只要可以拼出 “Oracle”或者可能只是在大學里接觸過一學期的數據庫就行。為了使生活變得更好,DBA的匱乏促使公司付給有潛力的職員很高的薪水。假如你想要成為一名DBA,很容易,非常容易。你需要做的就是證明你了解什么是數據庫然后工作就會比你預期的更早的出現在你面前。ITPUB個人空間!K&d7a
然后因特網的泡沫破滅了。大量投產因特網的公司破產。許多給公司工作的DBA重新尋找工作。缺少DBA的公司找到一名有DBA經驗的人比以前容易得多。在21世紀初期,由于經濟并不十分穩固,因此生活并不容易(至少在美國如此)。公司都勒緊了他們的褲腰帶。所有這些轉化為更少的工作機會和DBA 候選人更少的工作空缺。
得到第一份DBA工作的最艱難的部分是每一個職位都要求有一些工作經驗。如果你從公司的角度出發,你就可以理解為什么對DBA職位而言經驗是必需的。假如他沒有一點經驗,你會付給這個人很高的工資讓他去操作,維護和運行你IT基礎組織的最大最重要的一部分么?你的公司會付錢給一名沒有經驗的 DBA么?并且,在等待他成長起來的過程中可能會損失上百萬美元的收入。對大多數公司而言,這些問題的答案肯定是‘不’。所以,沒有經驗,獲得你的第一份 DBA工作是很困難的。
第一份DBA工作現在成了惡性循環的境遇。假如我沒有任何經驗,我怎樣才能得到DBA的工作呢?我沒有工作的話又怎么能得到DBA經驗呢?這是要戰勝的最困難的障礙。最困難的部分是獲得第一個DBA工作。這部分的剩下部分將針對實現你第一個DBA工作的目標給你一些建議。
提示#1:接受教育。--盡可能多的學習有關數據庫的知識。這很可能將占用你正常工作以外的部分時間也精力。參加本地大學舉辦的數據庫培訓班。許多培訓公司都會舉辦數據庫管理員的培訓班。假如你的老板不資助你的學習,那么你可能不得不自己支付這筆費用。許多DBA職業要求至少為計算機科學或相關專業本科以上學歷,因此你必須至少有那樣的文憑。
提示#2:鍛煉成為DBA。--許多數據庫供應商都允許你下載他們數據庫系統的測試版或評估版。下載一份并且在自己的個人電腦上安裝軟件。練習使用數據庫。故意破壞數據庫并且嘗試修復它。嘗試著履行你所能想到的盡可能多的DBA職責。測試和磨練你在自己的測試平臺上的技能這樣你就可以證明你的數據庫管理能力。
提示#3:獲得認證。 --許多數據庫提供商都提供自己的數據庫產品的認證。許多公司現在都把認證看作是一種標準。需要記住的一件事是僅獲得認證是不夠的。通過DBA認證測試并不意味著你知道如何管理一個數據庫。它只是告訴你以后可能的老板,現在你擁有了一定的技術。它還告訴你的老板你對DBA工作的態度是很認真的。我看到許多人抱怨他們已經得到了認證但是沒有經驗,卻仍然不能得到第一份DBA工作。認證本身并不能使你得到工作,但它是無害的。即使沒有其他的,在你進行認證的時候你也已經學到了許多知識。只是不要依賴認證來給你帶來你要找的工作。你需要的比這還要多。但它會在最后幫助你。
提示#4:利用你現有的技能。--許多DBA具有系統管理員背景。其他的有應用程序開發背景。假如可能,查看你能否利用現有的技能來得到工作。現在的目標就是為你和你的老板創造一個雙贏的局面。例如,讓我們假設你已經是一名系統管理員而想進入DBA領域。也許你會找到一份工作,這份工作一部分時間里可以用到你的系統管理技能,并且在剩下的時間里可以使你涉及到數據庫管理領域。假如你已經是一名某個產品平臺上的DBA但你希望轉到其他產品平臺,那么看看你能否找到一份同時接觸兩個產品平臺的工作。這樣,公司和你都得到了想要的。在你定向到了DBA工作后,你可以試著得到一個能讓你全職作它的職位,也許還可以在同一個公司中。
提示#5:利用現在的機會。--有時候,一個人進入DBA領域僅僅需要的是正確的地方和正確的時機。假如你現在的老板有一個機會讓你進行任何數據庫的項目,抓住這個機會!任何數據庫經驗就比沒有數據庫經驗要好。讓你的管理者知道你十分積極的在尋找任何可能的數據庫機會。他們就有可能在下次機會到來的時候想到你。進行這些數據庫項目以及看到你要成為一個DBA的渴望以后,他們可能會決定培訓你,提拔你。許多許多人都是以這種方式獲得他的第一個 DBA工作,在進行了一些數據庫相關的項目后不知不覺的成為一名較低級的DBA。通常當一名DBA離開公司后,公司將在內部尋找一個候選人,假如他們認為這名候選人是可訓練的話。
提示#6:尋找較低級的DBA職位。--假如你只是為了一個較低級的DBA工作,看到DBA職位的需求描述說他們正在尋找高級DBA或者其他的。所以,讓我們嚴謹一些。你并沒有一個高級方面的經驗。我已經討論過了對于這樣的職位為什么公司不會考慮你。但是他們會在低級的職位上考慮你。低級的 DBA在高級DBA的指導下完成工作。他們摸索竅門。一般來說,高級DBA對數據庫承擔責任,同時也獲得所有的榮譽。但是不要焦急。隨著你的事業發展,你將會有越來越多的責任和得到越來越多的信任。因為你沒有任何經驗,你應該從這里開始啟航。
我也聽到過一些公司尋找一名高級DBA,但是到最后,他們實際想要雇一名低級的DBA。你或許希望申請這樣的職位雖然你也許沒有資格。他們可能還是會決定雇傭你。但是提前說明你仍然在摸索階段并且已經是較低級的DBA水平。不要試圖欺騙他們讓他們認為你是高級DBA的水平。這只會降低你得到這項工作的機會。
這些提示將幫助你得到第一份DBA的工作。祝你在尋找工作時有好運氣。當你已經找到了第一份DBA工作后,繼續下面的部分來學習如何往下走下去。
我剛得到我的第一份工作!現在該怎樣?
祝賀你!你現在是DBA俱樂部的正式成員了!對于這份夢寐以求的令人激動的職業,你準備好了么?你的工作才剛開始并且你在學習上已經落在后面。你將會發現要成為一名高效的數據庫管理員有大量的知識你必須掌握。你的第一年或前兩年將花費比以前更多的時間來學習。假如你發現學習知識的數量使你大腦超負荷,那么休息一下,歇口氣,然后再回到學習中去。為了幫助你繼續走下去,你可以按照下面的方法進行:
步驟#1: 關系型數據庫理論 –這部分我假設你將管理的數據庫是一個“關系型”數據庫。其他數據庫模型也存在,但是關系型模式是近二十年工業上占統治地位的一種數據庫模式。假如你的數據庫系統是其他的模式,那么學習它的理論。相關數據庫理論是十分重要的。它是其他一切的基礎。我也看到許多跳到數據庫管理職位的人從不想去學習純粹的關系型數據庫理論。不可避免的,在他們的事業中對理論基礎的匱乏作為缺點暴露了出來。假如你對關系型數據庫理論理解得很好,那么你將非常容易的在任何平臺的關系型數據庫管理系統(RDBMS)中轉變。我使用Oracle數據庫,或者IBM的DB2,或者微軟的SQL Server是無關緊要的。他們都是關系型數據庫系統。他們在最底層都在做著相同的事情。區別在于他們怎樣去做相同的事情。純粹的關系型數據庫理論對于較低級的DBA來說并非必需的。但是假如你想要超越低級DBA的水平它就是十分重要的。許多大學的教科書都很好的包含了關系型數據庫的理論。其中一本被廣泛使用的教科書就是由Elmasri and Navathe編寫的數據庫系統基礎,
步驟#2: 徹底的學習查詢語言 –數據庫都有語言讓你能夠從數據庫中得到數據,把數據放到數據庫中,以及修改數據庫中的數據。對于關系型數據庫而言,這種語言就是結構化查詢語言 (SQL)。這門語言是你與數據庫接觸的工具。不能讓這個工具成為以后學習的障礙,這一點很重要。在你的測試數據庫中練習不同的SQL語句直到他們變成了你的習慣。這方面的一本非常好的書叫做Oracle 9i完全參考(Oracle 9i The Complete Reference)由Loney 和Koch編寫,Oracle Press。每一名Oracle DBA都應該在他事業的早期閱讀這本書。Oracle 9i參考手冊(Oracle 9i SQL Reference manual)是另一個很重要的知識來源。在他們的技術網站TechNet上(
http://technet.oracle.com)你可以訪...t上有一個賬號。
步驟#3: 開始學習基本的數據庫管理工作 –這難道不是你最開始在這里的原因?為什么它在列表的第三位?我們嘗試著建造一個知識的金字塔,我強烈的感覺到一個人需要知道關系型數據庫理論和SQL,并且在你學習如何進行基本的數據庫管理工作時把他們當作工具來使用。這些工作包括啟動和關閉數據庫,備份和恢復數據庫,以及創建/刪除/ 修改數據庫對象。對于Oracle數據庫管理而言,在市面上有大量的書籍可以給你所期望的一個很好的體會。這本書是Oracle 9i DBA手冊(Oracle 9i DBA Handbook by Loney on Oracle Press)。我知道的大多數DBA都在他們事業的早期不只一遍的閱讀過這本書。這里,你應該同時閱讀和理解Oracle 9i 概念指導,Oracle 9i管理員指導,以及Oracle 9i備份與恢復指導(Oracle 9i Concepts Guide, the Oracle 9i Administrator’s Guide, and the Oracle 9i Backup and Recovery Guide)都來自Oracle文檔。
步驟#4: 閱讀,閱讀,再閱讀 –由于你才剛開始你的DBA職業生涯,因此你正在開始為你的技能奠定基礎。這需要一段很長的時間去形成,吸收和領會所有你將學到的知識。毫無疑問的,比你資深的DBA由許多工作要做,因此他們可能不會總是騰出大量時間輔導你的學習。你不得不靠自己學習很多東西。這就是閱讀的目的。市面上有許多書籍可以解答許多數據庫相關的話題。Oracle Press是Oracle公司的官方出版社,有大量的Oracle相關書籍。同時也有其他的出版社,如Wrox Press 和 O’Reilly Press。你也可以找到Oracle文檔來閱讀。并且還有許多網站和新聞組。盡可能多的讀書使你能夠繼續下去。還有,不只一遍的閱讀它們可以使你吸收你第一次閱讀時錯過的內容。
步驟#5: 創建測試案例 –我經常看到初學者問一些很基礎的問題,其實假如他們花一些時間來考慮,這些問題都是很容易解答的。毫無疑問的,在你開始學習Oracle的時候你會有許多的問題。看看這些問題你能不能自己回答出來。例如,我又一次被問到能不能向有唯一性約束的列中插入空值。最開始,這看上去也許不是很容易回答的問題。但它卻是非常容易去試驗的!只需要創建一個簡單的表。在其中的一列,假如唯一性約束。嘗試著在該列插入一個空值。有效么?你應該能夠非常容易的回答出這個問題了。那么,為什么要創建這些案例呢?一個原因是這樣做可以提高你解決問題的能力。創建這些案例需要的技能就是解決問題用到的技能。解決問題的技能將會對你的DBA事業有很大的幫助。另一個原因是隨著你的事業的發展,你將經常需要創建更復雜的測試案例以便保證數據庫和應用程序的成功。在將來,甚至簡單的測試案例也可以組成更復雜的數據庫和應用程序分解。
步驟#6: 找一個良師 –一個良師能夠為你的DBA生涯(或者其它類似的職業)引領方向。他們能夠給你指示,回答問題以及在你的DBA的成長過程中幫助你節約一些時間。但愿這篇文章能夠在你事業發展的一段時間內起到良師益友的作用。假如你與一名資深的DBA共同工作,那么那個人應該有責任為你的事業進行有益的指導。你也可以同時選擇其他的人指導你。
步驟#7: 參加本地用戶群 –許多跨國家的城市有本地用戶群,他們定期聚會討論數據庫相關的話題。假如可能,參加其中一個本地用戶群。這將給你一個與他人相互交流的很好的方法。
我如何能夠從一名DBA初學者變為一個具有中級水平的DBA?
你已經成為DBA一段時間了,你現在希望你的技術水平提高一階么?下一步該怎么做?首先,往回看前面的部分,確認你已經完成了所有的步驟。徹底理解 SQL語言是十分重要的。理解關系型數據庫理論和掌握基本的數據庫管理任務也是非常重要的。到如今,你應該閱讀文檔和其他書籍到已經郁悶了。假如沒有,那么你還沒準備好繼續深造,增長你的DBA的技術水平。假如你已經準備好繼續了,我已為你的繼續深造準備了一些方法。
步驟#1: 學習操作系統和你的服務器硬件 – 正如我前面所說,數據庫存在于操作系統和服務器硬件之上。理解這些組成部分如何工作是很必要的。你應該知道如何與特殊的操作系統相合。你如何刪除或者編輯文件?假如你的操作系統是Unix,你應該掌握命令行以及Unix命令如何輔助你工作。對于運行在Windows或其他操作系統上而言也是一樣的。你同時需要對服務器的硬件有一定的了解。物理內存和虛擬內存有什么區別?RAID是什么以及不同的級別是如何產生影響的?為什么數據庫喜歡更多的物理硬盤而非一個大硬盤卷?你需要知道這些事情以便你能夠容易的與系統管理員進行如何配置好你的服務器以便使它能夠充分的支持數據庫方面的交談。
步驟#2: 學習應用程序設計因為它與數據庫相關 – 如前面所述,數據庫存在于操作系統與數據庫應用程序之間。你真的需要這兩者。SQL語言是如何幫助創建好的應用程序的?綁定變量是什么并且為什么他們很重要?Tom Kyte 寫了一本非常好的書,在Oracle應用程序設計上給出了很好的建議。他的Expert One-on-one Oracle書可在 Wrox Press找到。我強烈推薦閱讀此書。他詳細的敘述了那些能夠生成和破壞Oracle應用程序的東西。你需要知道這些,因為你的應用程序開發人員希望從你這里得到指導和數據庫知識。學習任何與應用程序設計有關的知識。也許參加一個關于軟件工程,操作系統或數據結構的課程班會有好處。
步驟#4: 取得認證 – 也許你的工作并不需要,但是取得認證一定對你有益。作為DBA的每一天里,你學到了許多新的和令人激動的事情。也許在你職業生涯的這段時間里,有幾天你沒學到任何新的東西。但你仍然有很多要學習。成為一名OCP(Oracle Certified Professional) DBA要求你必須已經學到了數據庫管理所有方面的基礎。我發現在OCP考試的學習過程中,我學到了在我工作中從未接觸過的東西。一次我學到了我從未碰到過的一個特殊課題,在后來的日子里我就能夠使用那個知識解決問題。假如我從為在 OCP考試中學倒它,那么我永遠也不會用那種特殊的方法去解決問題。這已經一次次的發生在我的面前。有的人可能會說認證實際上真的不值得。我要說它只會對你有益無害。所以,去取得認證吧!
步驟#5: 獲得一個資源庫 – 在前面的部分中,我指出每個DBA都應該在Technet上有個賬號。這是你其中一個主要資源。但是同時還有許多其他資源。很多人共享他們的Oracle 知識。假如你還沒有開始,你應該用網絡瀏覽器去搜索并收集很多Oracle資源。愿意的話,你可以從訪問我的網站(http: //
www.peasland.net)開始。下面是一些Oracle DBA必須了解得網站列表:
Ask Tom –
http://asktom.oracle.com Jonathan Lewis web site -
http://www.jlcomp.demon.co.uk/ITPUB個人空間/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 CSDN社區 -
http://community.csdn.net 還有許多其它的好網站
步驟#6: 開始在不同的新聞組和論壇上交流 – 也許你已經發現了他們,但假如現在你還沒有那么是時候去開始了。有許多的新聞組和論壇可以回答你的任何Oracle問題。在Oracle群落里還有許多高手愿意和你共享他們的知識。你所要做的就是提問。下面是一個列表包含了可以開始交流的最好的因特網團體:
Usenet newsgroups – comp.databases.oracle.server和 comp.databases.oracle.misc 是兩個可以交流的非常著名的世界性的新聞組。他們擁有大量的針對Oracle問題的交流卷宗。觀看這些組的最好的方法式使用新聞廣播員。但是假如你想通過基于web的方式訪問,也可以通過Google搜索引擎搜索它。 (
http://groups.google.com/groups?hl=...atabases.oracle)
Quest Pipelines – 當他們在最開始還屬于軟件提供商RevealNet的時候,被稱為the RevealNet Pipelines。現在,Quest購買了RevealNet 并且擁有Pipelines 。因為Pipelines是中等的,所以這些是我最喜歡的。你可以在這里找到Pipelines (
http://www.quest-pipelines.com/index.asp)。
觀察別人是如何經歷考驗和磨難的是一件好事。假如你有問題,可以自由的在群里提出來。假如你要提出問題,通常應該包括一些信息,比如你的 Oracle版本和Oracle運行的平臺。這些將會得到有很大的差別的答案。假如你忘記了,會有人提醒你!甚至你不用提問也可以從其他人的答案中學到許多知識。我已經記不得多少次我之所以能夠解決問題完全是因為我記得其他人在新聞組里問過相同的問題。
posted @
2011-03-04 15:38 學習才能進步 閱讀(209) |
評論 (0) |
編輯 收藏

2008年4月29日
簡述:
作為網頁主體內容的BODY部分將直接顯示在瀏覽器的窗口中,它里面的內容直接影響著整個網頁的好壞,在網頁設計中起著至關重要的作用。
在開始編寫具體頁面內容之前,我們需要對頁面進行整體的基本規劃和設置,如整個頁面的背景色、背景圖案、前景(文字)色、頁面左/上邊距大小等等,在HTML中,我們用<body>標簽內指定參數來設置:
<body bgcolor="?" background="?"text="?" leftmargin="?" topmargin="?"link="?" alink="?" vlink="?">…..</body>
其中各參數為:
Bgcolor:指定網頁背景色,可指定其顏色值;例:bgcolor="#E2E2FF";
Background:指定網頁背景圖案地址,如background="images/back.gif";
Text:指定網頁內文字顏色,如:text="#000000";
Leftmargin:指定網頁的左邊距,如:leftmargin="0";
Topmargin:指定網頁上邊距,同上。
Link:指定鏈接文字的顏色,如:link="blue";
Alink:指定當鼠標移動到鏈接文字上時文字的顏色,如:alink="red";
Vlink:指定當我們訪問過后的鏈接顏色,如:vlink="#555555";
盜版它人網站的內容可恥,您查看的內容盜版于★點擊設計★www.djasp.Net
示例:網頁背景為白色,文字為紅色,鏈接色為綠色,訪問過的鏈接也為綠色,網頁左邊距為10像素,上邊距為3像素。
代碼如下:
<html>
<head><title>點擊設計</title></head>
<body bgcolor="#ffffff" text="red" link="green"vlink="green" leftmargin=10 topmargin=3>
網頁正文內容….
</body>
</html>
posted @
2008-04-29 11:09 學習才能進步 閱讀(432) |
評論 (0) |
編輯 收藏

2008年4月18日
1、觸發器
定義: 何為觸發器?在SQL Server里面也就是對某一個表的一定的操作,觸發某種條件,從而執行的一段程序。觸發器是一個特殊的存儲過程。
常見的觸發器有三種:分別應用于Insert , Update , Delete 事件。(SQL Server 2000定義了新的觸發器,這里不提)
我為什么要使用觸發器?比如,這么兩個表:
Create Table Student( --學生表
StudentID int primary key, --學號
....
)
Create Table BorrowRecord( --學生借書記錄表
BorrowRecord int identity(1,1), --流水號
StudentID int , --學號
BorrowDate datetime, --借出時間
ReturnDAte Datetime, --歸還時間
...
)
用到的功能有:
1.如果我更改了學生的學號,我希望他的借書記錄仍然與這個學生相關(也就是同時更改借書記錄表的學號);
2.如果該學生已經畢業,我希望刪除他的學號的同時,也刪除它的借書記錄。
等等。
這時候可以用到觸發器。對于1,創建一個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
理解觸發器里面的兩個臨時的表:Deleted , Inserted 。注意Deleted 與Inserted分別表示觸發事件的表“舊的一條記錄”和“新的一條記錄”。
一個Update 的過程可以看作為:生成新的記錄到Inserted表,復制舊的記錄到Deleted表,然后刪除Student記錄并寫入新紀錄。
對于2,創建一個Delete觸發器
Create trigger trdStudent
On Student
for Delete
As
Delete BorrowRecord
From BorrowRecord br , Delted d
Where br.StudentID=d.StudentID
從這兩個例子我們可以看到了觸發器的關鍵:A.2個臨時的表;B.觸發機制。
這里我們只講解最簡單的觸發器。復雜的容后說明。
事實上,我不鼓勵使用觸發器。觸發器的初始設計思想,已經被“級聯”所替代.
posted @
2008-04-18 16:09 學習才能進步 閱讀(192) |
評論 (0) |
編輯 收藏

2008年4月17日
使用多層架構進行系統開發是現今系統設計的流行趨勢。通過分解業務細節,將不同的功能代碼分散開來,更利于系統的設計和開發,同時為可能的變更提供了更小的單元。
以下就是一個典型的多層體系結構圖。
首先我們以“訂單(Order)”為例,進行一個簡單的業務分解。
1. 訂單自然包括訂單的內容(OrderInfo),其中有諸如訂單編號、商品名稱、數量,以及金額等信息。
2. 有了訂單信息,我們還需要一個存儲訂單的場所,那么自然需要有個操作讀寫的對象(OrderAccess)。
3. 為了外界能進行相關的訂單操作,我們還需要有個業務邏輯對象(Order),它提供創建新訂單,向訂單插入/刪除商品,保存訂單等操作。
通過上面的分析,我們基本上可以將一個業務邏輯完整地分割為:
業務實體 ---> OrderInfo
數據訪問 ---> OrderAccess
業務邏輯 ---> Order
基于系統架構考慮,我們將這些對象分別放置在不同的邏輯單元中,這些邏輯單元就組成了“多層”。
業務實體層(Model) ---> 業務實體 ---> OrderInfo
數據訪問層(DAL) ---> 數據訪問 ---> OrderAccess
業務邏輯層(BLL) ---> 業務邏輯 ---> Order
同樣以上面訂單為例,我們進一步講述各層對象的實現細節。
1. 客戶基本上只依賴于 Order 和 OrderInfo,通過他們就可以操作業務的全部,它并不關心業務存儲等細節。
2. 大多數時候我們會將 OrderAccess 設計成 Internal Protected 方式,OrderAccess 可以是一個抽象類或者接口。我更習慣于將其實現為抽象類,因為某些方法是調用其他方法來實現的,抽象類的設計可以減少實現類的代碼數量。另外將該抽象類設計成工廠方法模式,通過 IoC 或者 "配置反射" 來獲得具體的實現類,可以減少層之間的耦合,也便于數據系統的替換。
3. Order 多數時候可以實現為 Singleton 或者靜態類,它只是提供了一系列的方法來操作某些邏輯,通過接受 OrderInfo 參數來獲取信息。其本身無需保存任何狀態。如果需要實現購物車,只需將 OrderInfo 存儲到 Session 之中即可。
通過上面的例子,我們還可以發現多層的另外一個好處就是更利于團隊協作開發。架構設計人員無需考慮具體的數據庫實現代碼,而將設計重點放在業務層面;數據庫開發人員自然也可將重心放在數據庫訪問優化上。團隊成員之間不再是一人負責一個業務模塊,不再有了 n 個數據訪問類,不再有 n 種不同的對象模式等等。從傳統的 "瓦罐作坊" 演變為 "工業流水線",更利于根據技術能力和業務熟悉度的差別來劃分不同的角色。
posted @
2008-04-17 17:13 學習才能進步 閱讀(217) |
評論 (0) |
編輯 收藏
使用多層架構進行系統開發是現今系統設計的流行趨勢。通過分解業務細節,將不同的功能代碼分散開來,更利于系統的設計和開發,同時為可能的變更提供了更小的單元。
以下就是一個典型的多層體系結構圖。
首先我們以“訂單(Order)”為例,進行一個簡單的業務分解。
1. 訂單自然包括訂單的內容(OrderInfo),其中有諸如訂單編號、商品名稱、數量,以及金額等信息。
2. 有了訂單信息,我們還需要一個存儲訂單的場所,那么自然需要有個操作讀寫的對象(OrderAccess)。
3. 為了外界能進行相關的訂單操作,我們還需要有個業務邏輯對象(Order),它提供創建新訂單,向訂單插入/刪除商品,保存訂單等操作。
通過上面的分析,我們基本上可以將一個業務邏輯完整地分割為:
業務實體 ---> OrderInfo
數據訪問 ---> OrderAccess
業務邏輯 ---> Order
基于系統架構考慮,我們將這些對象分別放置在不同的邏輯單元中,這些邏輯單元就組成了“多層”。
業務實體層(Model) ---> 業務實體 ---> OrderInfo
數據訪問層(DAL) ---> 數據訪問 ---> OrderAccess
業務邏輯層(BLL) ---> 業務邏輯 ---> Order
同樣以上面訂單為例,我們進一步講述各層對象的實現細節。
1. 客戶基本上只依賴于 Order 和 OrderInfo,通過他們就可以操作業務的全部,它并不關心業務存儲等細節。
2. 大多數時候我們會將 OrderAccess 設計成 Internal Protected 方式,OrderAccess 可以是一個抽象類或者接口。我更習慣于將其實現為抽象類,因為某些方法是調用其他方法來實現的,抽象類的設計可以減少實現類的代碼數量。另外將該抽象類設計成工廠方法模式,通過 IoC 或者 "配置反射" 來獲得具體的實現類,可以減少層之間的耦合,也便于數據系統的替換。
3. Order 多數時候可以實現為 Singleton 或者靜態類,它只是提供了一系列的方法來操作某些邏輯,通過接受 OrderInfo 參數來獲取信息。其本身無需保存任何狀態。如果需要實現購物車,只需將 OrderInfo 存儲到 Session 之中即可。
通過上面的例子,我們還可以發現多層的另外一個好處就是更利于團隊協作開發。架構設計人員無需考慮具體的數據庫實現代碼,而將設計重點放在業務層面;數據庫開發人員自然也可將重心放在數據庫訪問優化上。團隊成員之間不再是一人負責一個業務模塊,不再有了 n 個數據訪問類,不再有 n 種不同的對象模式等等。從傳統的 "瓦罐作坊" 演變為 "工業流水線",更利于根據技術能力和業務熟悉度的差別來劃分不同的角色。
posted @
2008-04-17 17:13 學習才能進步 閱讀(215) |
評論 (0) |
編輯 收藏

2007年4月9日
二叉樹是一種非線性的數據結構,在對它進行操作時,總是需要逐一對每個數據元素實施
操作,這樣就存在一個操作順序問題,由此提出了二叉樹的遍歷操作。所謂遍歷二叉樹就
是按某種順序訪問二叉樹中的每個結點一次且僅一次的過程。這里的訪問可以是輸出、比
較、更新、查看元素內容等等各種操作。
二叉樹的遍歷方式分為兩大類:一類按根、左子樹和右子樹三個部分進行訪問;另一類按
層次訪問。下面我們將分別進行討論。
1、 按根、左子樹和右子樹三部分進行遍歷
遍歷二叉樹的順序存在下面6種可能:
TLR(根左右), TRL(根右左)
LTR(左根右), RTL(右根左)
LRT(左右根), RLT(右左根)
其中,TRL、RTL和RLT三種順序在左右子樹之間均是先右子樹后左子樹,這與人們先左后右
的習慣不同,因此,往往不予采用。余下的三種順序TLR、LTR和LRT根據根訪問的位置不同分別
被稱為先序遍歷、中序遍歷和后序遍歷。
(1)先序遍歷
若二叉樹為空,則結束遍歷操作;否則
訪問根結點;
先序遍歷左子樹;
先序遍歷右子樹。
(2)中序遍歷若二叉樹為空,則結束遍歷操作;否則
中序遍歷左子樹;
訪問根結點;
中序遍歷右子樹。
(3)后序遍歷
若二叉樹為空,則結束遍歷操作;否則
后序遍歷左子樹;
后序遍歷右子樹;
訪問根結點。
例如。以下是一棵二叉樹及其經過三種遍歷所得到的相應遍歷序列

二叉樹的兩種遍歷方法:
(1)對一棵二叉樹中序遍歷時,若我們將二叉樹嚴格地按左子樹的所有結點位于根結點的左
側,右子樹的所有結點位于根右側的形式繪制,就可以對每個結點做一條垂線,映射到下面的
水平線上,由此得到的順序就是該二叉樹的中序遍歷序列

(2)任何一棵二叉樹都可以將它的外部輪廓用一條線繪制出來,我們將它稱為二叉樹的包線,
這條包線對于理解二叉樹的遍歷過程很有用。

由此可以看出:(1)遍歷操作實際上是將非線性結構線性化的過程,其結果為線性序列,
并根據采用的遍歷順序分別稱為先序序列、中序序列或后序序列;(2)遍歷操作是一個遞歸的
過程,因此,這三種遍歷操作的算法可以用遞歸函數實現。
(1)先序遍歷遞歸算法
void PreOrder(BTree BT) {
if (BT) { Visit(BT);
PreOrder(BT->Lchild);
PreOrder(BT->Rchild);
}
(2)中序遍歷遞歸算法
void InOrder(BTree BT) {
if (BT) {
InOrder(BT->Lchild);
Visit(BT);
InOrder(BT->Rchild);
}
}
(3)后序遍歷遞歸算法
void PostOrder(BTree BT) {
if (BT) {
PostOrder(BT->Lchild);
PostOrder(BT->Rchild);
Visit(BT);
}
}
2 、按層次遍歷二叉樹
實現方法為從上層到下層,每層中從左側到右側依次訪問每個結點。下面我們將給出一棵
二叉樹及其按層次順序訪問其中每個結點的遍歷序列。

void LevelOreder(QBTree BT) {
for (i=1;i<=BT.n;i++)
if (BT.elem[i]!='#') Visite(BT.elem[i]);
}
二叉樹用鏈式存儲結構表示時,按層遍歷的算法實現
訪問過程描述如下:
訪問根結點,并將該結點記錄下來;
若記錄的所有結點都已處理完畢,則結束遍歷操作;否則重復下列操作。
取出記錄中第一個還沒有訪問孩子的結點,若它有左孩子,則訪問左孩子,并將記錄下來;
若它有右孩子,則訪問右孩子,并記錄下來。
在這個算法中,應使用一個隊列結構完成這項操作。所謂記錄訪問結點就是入隊操作;
而取出記錄的結點就是出隊操作。這樣一來,我們的算法就可以描述成下列形式:
(1)訪問根結點,并將根結點入隊;
(2)當隊列不空時,重復下列操作:
從隊列退出一個結點;
若其有左孩子,則訪問左孩子,并將其左孩子入隊;
若其有右孩子,則訪問右孩子,并將其右孩子入隊;
void LevelOrder(BTree *BT) {
if (!BT) exit;
InitQueue(Q); p=BT; //初始化
Visite(p); EnQueue(&Q,p); //訪問根結點,并將根結點入隊
while (!QueueEmpty(Q)) { //當隊非空時重復執行下列操作
DeQueue(&Q,&p); //出隊
if (!p->Lchild) {Visite(p->Lchild);EnQueue(&Q,p->Lchild); //處理左孩子
if (!p->Rchild) {Visite(p->Rchild);EnQueue(&Q,p->Rchild); //處理右孩子
}
}
五、典型二叉樹的操作算法
1、 輸入一個二叉樹的先序序列,構造這棵二叉樹
為了保證唯一地構造出所希望的二叉樹,在鍵入這棵樹的先序序列時,需要在所有空二叉
樹的位置上填補一個特殊的字符,比如,'#'。在算法中,需要對每個輸入的字符進行判
斷,如果對應的字符是'#',則在相應的位置上構造一棵空二叉樹;否則,創建一個新結
點。整個算法結構以先序遍歷遞歸算法為基礎,二叉樹中結點之間的指針連接是通過指針
參數在遞歸調用返回時完成。
算法:
BTree Pre_Create_BT( ) {
getch(ch);
if (ch=='#') return NULL; //構造空樹
else { BT=(BTree)malloc(sizeof(BTLinklist)); //構造新結點
BT->data=ch;
BT->lchild =Pre_Create_BT( ); //構造左子樹
BT->rchild =Pre_Create_BT( ); //構造右子樹
return BT;
}
}
2、 計算一棵二叉樹的葉子結點數目
這個操作可以使用三種遍歷順序中的任何一種,只是需要將訪問操作變成判斷該結點是否
為葉子結點,如果是葉子結點將累加器加1即可。下面這個算法是利用中序遍歷實現的。
算法:
void Leaf(BTree BT,int *count) {
if (BT) {
Leaf(BT->child,&count); //計算左子樹的葉子結點個數
if (BT->lchild==NULL&&BT->rchild==NULL) (*count)++;
Leaf(BT->rchild,&count); //計算右子樹的葉子結點個數
}
}
3、 交換二叉樹的左右子樹
許多操作可以利用三種遍歷順序的任何一種,只是某種遍歷順序實現起來更加方便一
些。而有些操作則不然,它只能使用其中的一種或兩種遍歷順序。將二叉樹中所有結點的左右
子樹進行交換這個操作就屬于這類情況。
算法:
void change_left_right(BTree BT) {
if (BT) {
change_left_right(BT->lchild);
change_left_right(BT->rchild);
BT->lchild<->BT->rchild;
}
}
4 、求二叉樹的高度
這個操作使用后序遍歷比較符合人們求解二叉樹高度的思維方式。首先分別求出左右子樹
的高度,在此基礎上得出該棵樹的高度,即左右子樹較大的高度值加1。
算法:
int hight(BTree BT) { //h1和h2分別是以BT為根的左右子樹的高度
if (BT==NULL) return 0;
else {
h1=hight(BT->lchild);
h2=hight(BT->right);
return max{h1,h2}+1;
}
}
六、樹、森林與二叉樹的轉換
1、 樹、森林轉換成二叉樹
將一棵樹轉換成二叉樹的方法:
將一棵樹轉換成二叉樹實際上就是將這棵樹用孩子兄弟表示法存儲即可,此時,樹中的每
個結點最多有兩個指針:一個指針指向第一個孩子,另一個指針指向右側第一個兄弟。當你將
這兩個指針看作是二叉樹中的左孩子指針和孩子右指針時,就是一棵二叉樹了。
特點:一棵樹轉換成二叉樹后,根結點沒有右孩子。
將森林轉換成二叉樹的方法與一棵樹轉換成二叉樹的方法類似,只是把森林中所有樹的根
結點看作兄弟關系,并對其中的每棵樹依依地進行轉換。
2 、二叉樹還原成樹或森林
這個過程實際上是樹、森林轉換成二叉樹的逆過程,即將該二叉樹看作是樹或森林的孩子
兄弟表示法。比如,若二叉樹為空,樹也為空;否則,由二叉樹的根結點開始,延右指針向下
走,直到為空,途經的結點個數是相應森林所含樹的棵數;若某個結點的左指針非空,說明這
個結點在樹中必有孩子,并且從二叉樹中該結點左指針所指結點開始,延右指針向下走,直到
為空,途經的結點個數就是這個結點的孩子數目。
posted @
2007-04-09 16:25 學習才能進步 閱讀(1446) |
評論 (0) |
編輯 收藏

2007年4月6日
面向對象編程
面向對象編程(Object Oriented Programming,OOP,面向對象程序設計)是一種計算機編程架構。OOP 的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或對象組合而成。OOP 達到了軟件工程的三個主要目標:重用性、靈活性和擴展性。為了實現整體運算,每個對象都能夠接收信息、處理數據和向其它對象發送信息。OOP 主要有以下的概念和組件:
組件 - 數據和功能一起在運行著的計算機程序中形成的單元,組件在 OOP 計算機程序中是模塊和結構化的基礎。
抽象性 - 程序有能力忽略正在處理中信息的某些方面,即對信息主要方面關注的能力。
封裝 - 也叫做信息封裝:確保組件不會以不可預期的方式改變其它組件的內部狀態;只有在那些提供了內部狀態改變方法的組件中,才可以訪問其內部狀態。每類組件都提供了一個與其它組件聯系的接口,并規定了其它組件進行調用的方法。
多態性 - 組件的引用和類集會涉及到其它許多不同類型的組件,而且引用組件所產生的結果得依據實際調用的類型。
繼承性 - 允許在現存的組件基礎上創建子類組件,這統一并增強了多態性和封裝性。典型地來說就是用類來對組件進行分組,而且還可以定義新類為現存的類的擴展,這樣就可以將類組織成樹形或網狀結構,這體現了動作的通用性。
由于抽象性、封裝性、重用性以及便于使用等方面的原因,以組件為基礎的編程在腳本語言中已經變得特別流行。Python 和 Ruby 是最近才出現的語言,在開發時完全采用了 OOP 的思想,而流行的 Perl 腳本語言從版本5開始也慢慢地加入了新的面向對象的功能組件。用組件代替“現實”上的實體成為 JavaScript(ECMAScript) 得以流行的原因,有論證表明對組件進行適當的組合就可以在英特網上代替 HTML 和 XML 的文檔對象模型(DOM)。
一、oop的基本思想
OOP的許多原始思想都來之于Simula語言,并在Smalltalk語言的完善和標準化過程中得到更多的擴展和對以前的思想的重新注解。可以說OO思想和OOPL幾乎是同步發展相互促進的。與函數式程序設計(functional-programming)和邏輯式程序設計(logic-programming)所代表的接近于機器的實際計算模型所不同的是,OOP幾乎沒有引入精確的數學描敘,而是傾向于建立一個對象模型,它能夠近似的反映應用領域內的實體之間的關系,其本質是更接近于一種人類認知事物所采用的哲學觀的計算模型。由此,導致了一個自然的話題,那就是OOP到底是什么?[D&T 1988][B.S 1991] .。在OOP中,對象作為計算主體,擁有自己的名稱,狀態以及接受外界消息的接口。在對象模型中,產生新對象,舊對象銷毀,發送消息,響應消息就構成OOP計算模型的根本。
對象的產生有兩種基本方式。一種是以原型(prototype)對象為基礎產生新的對象。一種是以類(class)為基礎產生新對象。原型的概念已經在認知心理學中被用來解釋概念學習的遞增特性,原型模型本身就是企圖通過提供一個有代表性的對象為基礎來產生各種新的對象,并由此繼續產生更符合實際應用的對象。而原型-委托也是OOP中的對象抽象,代碼共享機制中的一種。一個類提供了一個或者多個對象的通用性描敘。從形式化的觀點看,類與類型有關,因此一個類相當于是從該類中產生的實例的集合。而這樣的觀點也會帶來一些矛盾,比較典型的就是在繼承體系下,子集(子類)對象和父集(父類)對象之間的行為相融性可能很難達到,這也就是OOP中常被引用的---子類型(subtype)不等于子類(subclass)[Budd 2002]。而在一種所有皆對象的世界觀背景下,在類模型基礎上還誕生出了一種擁有元類(metaclass)的新對象模型。即類本身也是一種其他類的對象。以上三種根本不同的觀點各自定義了三種基于類(class-based),基于原型(prototype-based)和基于元類(metaclass-based)的對象模型。而這三種對象模型也就導致了許多不同的程序設計語言(如果我們暫時把靜態與動態的差別放在一邊)。是的,我們經常接觸的C++,Java都是使用基于類的對象模型,但除此之外還有很多我們所沒有接觸的OOPL采用了完全不一樣的對象模型,他們是在用另外一種觀點詮釋OOP的內涵。
什么是oop的基本思想呢?把組件的實現和接口分開,并且讓組件具有多態性。不過,兩者還是有根本的不同。oop強調在程序構造中語言要素的語法。你必須得繼承,使用類,使用對象,對象傳遞消息。gp不關心你繼承或是不繼承,它的開端是分析產品的分類,有些什么種類,他們的行為如何。就是說,兩件東西相等意味著什么?怎樣正確地定義相等操作?不單單是相等操作那么簡單,你往深處分析就會發現“相等”這個一般觀念意味著兩個對象部分,或者至少基本部分是相等的,據此我們就可以有一個通用的相等操作。再說對象的種類。假設存在一個順序序列和一組對于順序序列的操作。那么這些操作的語義是什么?從復雜度權衡的角度看,我們應該向用戶提供什么樣的順序序列?該種序列上存在那些操作?那種排序是我們需要的?只有對這些組件的概念型分類搞清楚了,我們才能提到實現的問題:使用模板、繼承還是宏?使用什么語言和技術?gp的基本觀點是把抽象的軟件組件和它們的行為用標準的分類學分類,出發點就是要建造真實的、高效的和不取決于語言的算法和數據結構。當然最終的載體還是語言,沒有語言沒法編程。stl使用c++,你也可以用ada來實現,用其他的語言來實現也行,結果會有所不同,但基本的東西是一樣的。到處都要用到二分查找和排序,而這就是人們正在做的。對于容器的語義,不同的語言會帶來輕微的不同。但是基本的區別很清楚是gp所依存的語義,以及語義分解。例如,我們決定需要一個組件swap,然后指出這個組件在不同的語言中如果工作。顯然重點是語義以及語義分類。而oop所強調的(我認為是過分強調的)是清楚的定義類之間的層次關系。oop告訴了你如何建立層次關系,卻沒有告訴你這些關系的實質。
(這段不太好理解,有一些術語可能要過一段時間才會有合適的中文翻譯——譯者)
面向對象的編程方法OOP是九十年代才流行的一種軟件編程方法。它強調對象的“抽象”、“封裝”、“繼承”、“多態”。我們講程序設計是由“數據結構”+“算法”組成的。從宏觀的角度講,OOP下的對象是以編程為中心的,是面向程序的對象。我們今天要講的OOD是面向信息的對象,是以用戶信息為中心的。
二、OOP技術的歷史
面向對象技術最初是從面向對象的程序設計開始的,它的出現以60年代simula語言為標志。80年代中后期,面向對象程序設計逐漸成熟,被計算機界理解和接受,人們又開始進一步考慮面向對象的開發問題。這就是九十年代以Microsoft Visual系列OOP軟件的流行的背景。
傳統的結構化分析與設計開發方法是一個線性過程,因此,傳統的結構化分析與設計方法要求現實系統的業務管理規范,處理數據齊全,用戶能全面完整地其業務需求。
傳統的軟件結構和設計方法難以適應軟件生產自動化的要求,因為它以過程為中心進行功能組合,軟件的擴充和復用能力很差。
對象是對現實世界實體的模擬,因面能更容易地理解需求,即使用戶和分析者之間具有不同的教育背景和工作特點,也可很好地溝通。
區別面向對象的開發和傳統過程的開發的要素有:對象識別和抽象、封裝、多態性和繼承。
對象(Object)是一個現實實體的抽象,由現實實體的過程或信息牲來定義。一個對象可被認為是一個把數據(屬性)和程序(方法)封裝在一起的實體,這個程序產生該對象的動作或對它接受到的外界信號的反應。這些對象操作有時稱為方法。對象是個動態的概念,其中的屬性反映了對象當前的狀態。
類(Class)用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
由上分析不難看出,盡管OOP技術更看中用戶的對象模型,但其目的都是以編程為目的的,而不是以用戶的信息為中心的,總想把用戶的信息納入到某個用戶不感興趣的“程序對象”中。
三、OOP 的優缺點
· OOP 的優點:使人們的編程與實際的世界更加接近,所有的對象被賦予屬性和方法,結果編程就更加富有人性化。
· OOP 的也有缺點,就 C++ 而言,由于面向更高的邏輯抽象層,使得 C++ 在實現的時候,不得不做出性能上面的犧牲,有時候甚至是致命的 ( 所有對象的屬性都經過內置多重指針的間接引用是其性能損失的主要原因之一;不過,筆者的局限性在于未使用過 VC++ 外的面向對象語言,所以不是十分肯定,哈哈,有人笑出來了… )。
在計算機速度飛速發展的今天,你可能會說,一丁點的性能犧牲沒什么大不了。是的,從面向對象的角度,使的編程的結構更加清晰完整,數據更加獨立和易于管理,性能的犧牲可以帶來這么多的好處,沒有理由不做穩賺的生意吧?
不過,在某些對速度要求極高特殊場合,例如你做的是電信的交換系統,每秒鐘有超過百萬的人同時進行電話交換,如果,每一個數據交換過程都是一個對象,那么總的性能損失將是天文數字!!
或者這個例子不夠貼身,再舉個例子吧。假如你受聘于一個游戲設計公司,老板希望做出來的游戲可以更多的兼顧到更多的電腦使用者,游戲每秒鐘的運行的幀可以更多,子彈和爆炸物可以更多、更華麗。那么,你會發現使用 C++ 會使你的程序變得笨拙,無法滿足你的需求,除非你非得要你的游戲運行于奔騰四的機器上 ( 如果不是,而你又堅持用 C++ 的對象編程,那么請減少主角的槍的威力吧 )。
如果你是冥頑不寧的人,你說不相信 OOP 會有性能上的損失,那么,我記得曾看到在 CSDN 上關于 VB 和 VC 執行效率的討論的文章,講述的就是使用了 MFC 以后,執行效率甚至低于 VB 開發出來的東西。請各位驗證一下:如果使用的是純粹的 C 語言語法的話,那么一定會比在 VB 編出來的東西要快很多 ( GetTickCount 函數可以查閱 MSDN ,如果想更加精確一些,可以使用 QueryPerformanceCounter 函數 )。
四、OOP的未來(撰文/Bjarne Stroustrup & Tim Lindholm 編譯/孟巖)
在未來三年,程序員編寫代碼的方式會發生那些變化?
Stroustrup: 在C++中,假如沒有合適的庫在背后支撐,完成任何重要的工作都可能是很復雜的。而一旦有了合適的庫,任何東西都可以被我們操控于股掌之間。因此,構造和使用程序庫的重要性與日俱增。這也暗示我們,泛型程序設計(generic programming)將會越來越多地被運用。只有通過GP,我們才能確保庫的通用性和高效率。我還預期在分布式計算和“組件(components)”應用領域會出現喜人的增長。就大部分程序員而言,通過使用方便適用的程序庫,這些開發工作會變得簡單明了。
現在有一個趨勢,編譯器廠商試圖把其特有的“對象模型”和圖形界面(GUI)細節推銷給用戶。比如微軟的COM和Inprise的類屬性“properties”。對于用戶來說,這既不必要,也不情愿。我所希望看到的程序庫,應該是用標準C++打造,界面靈活,值得信賴的程序庫。通常,這些界面應該是平臺無關的。C++的表達能力極強,即使不使用大量的宏,也應該足以達成這一要求。就算有些地方無法百分之百的遵守這一原則,也應該將對于平臺和廠家的依賴性限制起來。這個目標的完成情況,可以反映軟件工具產業對于應用程序開發行業的關注程度。我懷疑目前對于那些獨立的、跨平臺廠商來說,并不存在相應的市場。如果能夠建立這樣的市場,也許能夠促進廠商們為客戶做出“真正有用的”產品。
Lindholm: 對于編寫代碼的開發者來說,主要的驅動力量仍將是兩個:網絡和分布式——也就是設計和開發非單機軟件的需求。大部分的應用程序將不會是孤零零地運行在單一設備上,而是運用了類似EJB和JSP之類技術的,平臺無關的分布式程序。程序員們將不得不面對分布式計算的重重險阻。這將對許多程序員所依賴的設計模式、技術和直覺構成嚴峻的挑戰。這是選擇編程語言之前必須認識到的,盡管不同語言的設計特性可能促進或者阻礙這一轉化。
在網絡應用的增長中,一個很重要的部分是小型移動設備和特殊Internet設備的爆炸性增長。這些設備各有各的操作系統,或者只在某種特定的設備領域內有共同的操作系統。我們現在還可以一一列舉出這些設備——家庭接入設備、蜂窩電話、電子報紙、PDA、自動網絡設備等等。但是這些設備領域的數量和深入程度將會很快變得難以估量。我們都知道這個市場大得驚人,PC的興起與之相比不過小菜一碟。因此在這些設備的應用程序市場上,競爭將會相當殘酷。獲勝的重要手段之一,就是盡快進入市場。開發人員需要優秀的工具,迅速高效地撰寫和調試他們的軟件。平臺無關性也是制勝秘訣之一,它使得程序員能夠開發出支持多種設備平臺的軟件。
我預期的另一個變化是,我們對于代碼(Java)和數據(XML)協同型應用程序的開發能力將會不斷提高。這種協同是開發強大應用程序的核心目標之一。我們從XML的迅速流行和ebXML規范的進展中,已經看到了這個趨勢。ebXML是一個針對電子商務和國際貿易的,基于XML的開放式基礎構架,由聯合國貿易促進和電子商務中心(UN/CEFACT)與結構性信息標準推進組織(OASIS)共同開發。
我們能否期望出現一個真正的面向組件(component-oriented)的語言?它的創造者會是誰呢?
Stroustrup: 我懷疑,這個領域中之所以缺乏成果,正是因為人們——主要是那些非程序員們——對“組件”這個意義含糊的字眼寄予了太多的期望。這些人士夢想,有朝一日,組件會以某種方式把程序員趕出歷史舞臺。以后那些稱職的“設計員”只需利用預先調整好的組件,把鼠標拖一拖放一放,就把系統組合出來。對于軟件工具廠商來說,這種想法還有另一層意義,他們認為,到時候只有他們才保留有必要的技術,有能力編寫這樣的組件。
這種想法有一個最基本的謬誤:這種組件很難獲得廣泛歡迎。一個單獨的組件或框架(framework),如果能夠滿足一個應用程序或者一個產業領域對所提出的大部分要求的話,對于其制造者來說就是劃算的產品,而且技術上也不是很困難。可是該產業內的幾個競爭者很快就會發現,如果所有人都采用這些組件,那么彼此之間的產品就會變得天下大同,沒什么區別,他們將淪為簡單的辦事員,主要利潤都將鉆進那些組件/框架供應商的腰包里!
小“組件”很有用,不過產生不了預期的杠桿效應。中型的、更通用的組件非常有用,但是構造時需要非同尋常的彈性。
在C++中,我們綜合運用不同共享形式的類體系(class hierarchies),以及使用templates精心打造的接口,在這方面取得了一定的進展。我期待在這個領域取得一些有趣和有用的成果,不過我認為這種成果很可能是一種新的C++程序設計風格,而不是一種新的語言。
Lindholm: 編寫面向組件的應用程序,好像更多的是個投資、設計和程序員管理方面的問題,而不是一個編程語言問題。當然某些語言在這方面具有先天優勢,不過如果說有什么魔術般的新語言能夠大大簡化組件的編寫難度,那純粹是一種誤導。
微軟已經將全部賭注押在C#上,其他語言何去何從?
Stroustrup: C++在下一個十年里仍然將是一種主流語言。面對新的挑戰,它會奮起應對。一個創造了那么多出色系統的語言,絕不會“坐視落花流水春去也”。
我希望微軟認識到,它在C++(我指的是ISO標準C++)上有著巨大的利益,C++是它與IT世界內其他人之間的一座橋梁,是構造大型系統和嵌入式系統的有效工具,也是滿足高性能需求的利器。其他語言,似乎更注重那些四平八穩的商用程序。
競爭
C#會不會獲得廣泛的接受,并且擠掉其他的語言?
Lindholm: 通常,一種語言既不會從別的語言那里獲利,也不會被擠掉。那些堅定的Fortran程序員不還用著Fortran嗎?對于個人來說,語言的選擇當然因時而異,但就整體而言,語言的種類只會遞增,也就是說,它們之間的關系是“有你有我”而不是“有你沒我”。
對于一個新語言的接受程度,往往取決于其能力所及。Java技術被迅速接受,原因是多方面的,Internet和World Wide Web接口,在其他技術面前的挫折感,對于Java技術發展方向的全面影響能力,都是原因。另一個重要的原因是Java獨立于廠商,這意味著在兼容產品面前可以從容選擇。
C#是否會獲得廣泛接受?視情況而定。總的來說,那些對于平臺無關性和廠商無關性漠不關心的程序員,可能會喜歡C#。那些跟微軟平臺捆在一起人當然可能想要尋找VB 和VC的一個出色的替代品。但是對于程序跨平臺執行能力特別關注的程序員,將會堅守Java之類的語言。這種能力對于多重訪問設備(multiple access devices)和分布式計算模型至關重要,而Java語言提供了一個標準的、獨立于廠商運行時環境。
Stroustrup: C#的流行程度幾乎完全取決于微軟投入的資金多少。看上去C#的興起肯定會犧牲掉其他一些語言的利益,但是事實上未必如此。Java的蓬勃發展并沒有給C++帶來衰敗。C++的應用仍然在穩定增長(當然,已經不是爆炸性的增長了)。也許其他的語言也還能獲得自己的一席之地。
不過,我實在看不出有什么必要再發明一種新的專有語言。特別是微軟,既生VB,何需C#?
不同OOP語言各有什么優勢和劣勢?
Stroustrup: C++的優點自始至終都是這么幾條:靈活、高效,而且并非專有語言。現在ISO C++標準的出現,鞏固了最后一點。
我認為C++的高效是它最基本的優點。這種高效來自于其特有的數據和計算模型,較之Java和C#,這種模型更加貼近機器。不過,哪些程序才真正地渴望這么高的效率?這是個問題。我認為這類程序非常多。人們對于計算機的期望,永遠都超越硬件科技的發展速度。很顯然,Java和C#的設計者的想法不同,他們認為,在很多地方效率問題無關緊要。
C++主要的缺點,歸罪于糟糕的教育(是那些始終認為C++是個純粹面向對象語言的人,和那些把C++當成C語言變體的人導致了這種情況),歸罪于不同平臺上的不一致性,歸罪于不完整、不標準的編譯器實現,歸罪于平臺無關的系統級程序庫的缺少。
這些問題歸于一點,就是缺乏一個卓越的廠商,能夠滿足整個C++社區的需求,勇于投入大量的資金開發必要的程序庫。
Lindholm: Java技術的成功,是因為它在合適的時間,出現在合適的地點,而且合理地選擇了語言和計算平臺的支持目標。Java并不是在所有場合都優于其他OOP語言,但是對于出現的新問題能夠解決得很出色。它面向Internet計算環境,避免了C++中晦澀的結構,成功翻越了繼承機制的惱人問題。垃圾收集機制顯著地提高了生產率,降低了復雜度。在網絡背景下使用虛擬機,以及有關安全性和動態加載的一系列設計選擇,迎合了正在出現的需求和愿望。這些特性使Java不僅成為現有程序員的新武器,而且也為新的程序員創造了繁榮的市場空間。
此外,Java擁有一個標準化的、二進制形式的類庫,提供了必要的(當然并非充分的)平臺與廠商無關性。平臺與廠商無關性要求一項技術必須有清晰的規范,摒棄那些阻礙二進制標準實施的特性。C++雖然有一個ISO標準,但其實甚至對于相同系統與相同指令體系的各個平臺,也提不出一個實用的、各版本兼容的二進制標準。
歷史上很多使用虛擬機的語言飽受責難,是因為其不夠出色的性能問題,而這要歸過于緩慢的解釋器和糟糕的垃圾收集器。Java的早期實現也因為同樣的問題受到嚴厲的批評。但是自那時起,業界向新的虛擬機實現技術投入了大量資金,取得了顯著的效果,如今在大部分場合,Java的性能跟常規的靜態編譯語言相比毫不遜色。這使得程序員在獲得平臺和廠商無關性的同時,也不必付出性能上的代價。
C++并沒有強制使用面向對象方法,因此為了編寫出色的面向對象代碼,就要求程序員們有相當強的紀律性。很多公司就是因為這個原因放棄了C++。作為語言,Java的一個突出的優點就是強制面向對象方法,不允許非面向對象的結構。
C#介于C++和Java之間,腳踏兩只船,因此既不夠安全,又失之復雜。
對于公司來說,采用新的語言要付出巨大代價。雇不到好的程序員(沒人熟悉這種新語言),培訓費用高得驚人,學習過程中生產率和產品質量下降,多年的經驗隨風消逝,等等。一種語言如何克服這些障礙?
Lindholm: 說得很對,采用新東西確實常常開銷巨大。不過問題是:這個新東西是否能夠節省更多的開支,或者提供巨大的改進,獲取合理的回報?很多公司發現,轉向Java技術不論在開發的后端(盡快進入市場、快速迭代開發、維護簡單性)還是前端(跨平臺發布,適用范圍從低端設備到高端服務器的技術,安全性),都能節省大筆的開銷。
對于新事物的接納,常常是在痛楚的壓力之下。很大程度上,這正是Java所經歷的。Java的產生,是對當時很多系統的缺陷所做出的反應。Java技術通過下面的手段減輕了開發者的痛楚:1) 顧及了網絡計算方面的需求,是應運而生。2) 在技術能力的抉擇上,保持良好的品位,顧及了大眾的心理。3) 采用適度強制性策略推行設計決定。此外,Java技術已經成為大學教學中的主流,這同樣保證了Java開發者隊伍的不斷壯大。
但是最重要的一點是,再沒有另一種程序設計技術,能夠像Java那樣允許程序員開發基于Internet的不同平臺之上的應用程序。Java平臺在這方面的杰出表現,已經被大量的實例證明。Java已經成為Internet上的缺省應用程序平臺,Java APIs也成為Internet應用程序開發的天然平臺。
Stroustrup: 微軟和Sun把大筆的金錢扔在Java、VB和C#中,并不是因為他良心發現,也不是因為他們真的相信這些語言能夠帶給程序員更美好的生活,而是利益使然。
有一個說法,認為軟件工具廠商如果能夠把應用程序開發者的專業技術任務負擔起來,將獲取巨大的經濟利益。我對其背后的經濟分析頗為懷疑,我認為這很難成為現實,特別是當應用程序開發者使用開放的、標準化的工具時,他們可以有多種選擇,從而使上面的想法更加不可能。
多年以前,C++就已經具有泛型能力(也就是templates和STL),有運算符重載,有枚舉類型?我們會不會在Java的未來版本中看到這些特性?Java是不是應該納入這些特性呢?
Strousturp:從1988-89年起,C++就已經有了templates。但是我們花了不少時間來了解如何最好地運用這個工具,早期各廠家對于template的支持在品質上也有很大的差異。有些編譯器廠商動作遲緩,至少有一個主要的編譯器廠商(好像是指微軟,微軟在Visual C++4.0才開始支持template,在此之前一直聲稱template是過于復雜而又沒什么用的技術,時至今日,Visual C++對于template的支持在主流編譯器中都屬于最差的一檔——譯者注)暗中鼓勵聲名狼藉的反template宣傳,直到他們自己終于學會了這項技術為止。直到今天,對于template的支持在品質上仍然有待改進。
你上面提到的那些特性,我認為Java(還有C#)應該,也肯定會逐漸引入。那些對于程序員來說最有用的語言特性和概念,將會逐漸集中,成為各家主流語言的必然之選。也就是說,我認為類似析構函數和模板特殊化之類的機制,遠遠比枚舉等機制重要得多。
Lindholm:Java技術成功的原因之一,就是很清楚哪些不該做。我們得多問幾個為什么:這項特性是不是必不可少?增加它會帶來哪些開銷?運算符重載是C++中一項極其強大的特性,但是它也大大增加了C++語言的復雜度,很多人都難以招架。Java在各種可能的權衡之中,做出了明智的抉擇,找到了能力與需求之間的完美平衡點。
當然,Java也會發展,而且最重要的是,現在是開發者們在推動發展。Java增加泛型能力這件事,很好地展示了Java是如何通過整個開發者社群的參與,在權衡中決定正確的平衡點。關于增加泛型類型(generic types)的“Java規格申請”(Java Specification Request, JSR)已經進入JCP(Java Community Process)程序,而且已經開發了很長一段時間(參見 http://java.sun.com/aboutJava/communityprocess/之JSR-014)。現在,在JCP中,有超過80個JSRs正在討論中,這充分體現了整個體系對開發者的積極反饋和高度合作,這正是驅動Java平臺不斷進化的動力。
發展 vs. 革新(Evolution vs. Revolution)
C++是一種發展型的語言,Java和C#似乎更像是革新型語言(它們是從頭設計的)?什么時候,革新型的語言才是必需的呢?
Lindholm: Java技術并非憑空出世,反而更像是發展型的。Java所有的特性,在Java平臺推出之前,都至少已經存在于另一種環境之中。Java的貢獻在于,在眾多的特性和權衡中,做出了合理的選擇,使得產品既實用,又優雅。Java技術對于程序員的態度是:撫養,但不溺愛。
Stroustrup:從技術上講,我并不認為Java和C#是什么“從頭設計的”革新型語言。倘若Java是從技術原則出發,從頭設計,大概就不會模仿C/C++那種丑陋和病態的語法了(不必驚訝,Stroustrup在很多場合表示過,C++采用C的語法形式,實在是迫于兼容性。他本人更偏愛Simula的語法——譯者)。
我認為,只有當程序員們面對的問題發生了根本的變化的時候,或者當我們發現了全新的、極其優越的程序設計技術,又完全不能為現存語言所支持的時候,我們才需要全新的語言。問題是,我們恐怕永遠也碰不到那些“根本”、“全新”的情況。
我以為,自從OOP問世以來,可稱為“根本”的新型程序設計技術,唯有泛型程序設計(generic programming)和生成式程序設計(generative programming)技術,這兩項技術主要是源于C++ templates技術的運用,也有一部分曾經被視為面向對象和函數式語言(functional languages)的次要成分,現在都變成正式、可用和可承受的技術了。我對于目前C++模板(template)程序設計的成果非常興奮。例如,像POOMA, Blitz++和MTL等程序庫,在很多地方改變了數值計算的方式。
Java和C#的一個“賣點”,就是它們的簡單性。現在Java是不是快失去這個賣點了?
Stroustrup:新語言總是宣稱自己如何如何簡單,對老語言的復雜性頗多非議。其實這種所謂的“簡單性”,簡單地說,就是不成熟性。語言的復雜性,是在解決現實世界中極為煩瑣和特殊的復雜問題的過程中逐漸增加的。一個語言只要活的時間夠長,總會有某些地方逐漸復雜起來,或者是語言本身,或者是程序庫和工具。C++和Java顯然都不例外,我看C#也一樣。如果一種語言能夠度過自己的幼年時代,它會發現,自己無論是體積還是復雜性都大大增加了。
Lindholm:Java技術的的功能在增加,需要學習的東西也在增加。不過功能的增加并不一定帶來復雜性的增加。Java技術的發展,并沒有使學習曲線更加陡峭,只是讓它繼續向右方延展了。
標準
標準化語言和開放型語言各自的優點和缺點何在?
Lindholm:對于一個開放、不允許專有擴展、具有權威的強制性標準語言或者運行環境來說,不存在什么缺點。允許專有擴展就意味著允許廠商下套子綁架客戶。特別重要的是,必須讓整個平臺,而不只是其中一部分完全標準化,才能杜絕廠商們利用高層次的專有API下套子。客戶要求有選擇廠商的自由,他們既要有創造性,又需要兼容性。
Stroustrup:對于一個語言,如C/C++來說,建立正式標準(如ISO標準)最大的好處,在于可以防止某一個廠商操縱這種語言,把它當成自己的搖錢樹。多個廠商的競爭給用戶帶來的是較低的價位和較好的穩定性。
專有語言的好處,一是流行,二是便宜(不過等你被套牢了之后,情況就會起變化),三是對于商業性需求可以做出快速的反應。
標準化語言的特點之一是,它不能忽略特殊用戶的需求。比如我在AT&T中所考慮的東西,其規模、可靠性和效率要求,跟那些普通廠商關注的大眾軟件相比,根本不可同日而語。那些公司很自然只關注主要的需求。
然而,多數大機構和身處前沿的公司,都有著特殊的需求。C++的設計是開放、靈活和高效的,能夠滿足我所能想象的任何需求。跟其他的現代語言相比,C++的家長式作風可謂少之又少,原因就在這。當然,不能贊賞這一點的人會詬病C++的“危險”。
擁有正式和開放標準的語言主要是為編程工具的使用者和客戶服務的,而擁有專屬“標準”的語言,主要是為廠商服務的。
posted @
2007-04-06 17:08 學習才能進步 閱讀(224) |
評論 (0) |
編輯 收藏
真實的C++之父
——Bjarne Stroustrup訪談錄
趙玉勇
Bjarne Stroustrup簡介
許多重要人物之所以成名,或者是因為其改變了歷史或者是因為其創造了歷史,Bjarne Stroustrup先生,C++之父,屬于后者;歸結個人成功的原因,理由可能有許多,但他只有淺顯的兩個一點點:他比多數人天真和理想主義那么一點點;比多數人花在解決問題上的時間多一點點。
C++程序設計語言是一種承前啟后,被數以百萬計的程序員應用在各個領域中的語言,我們正在使用的Windows操作系統,我們上網用的瀏覽器IE無不是出自C++的手筆。
C++是一種重要的和比較流行的計算機語言之一,也是未來十年內仍然發揮重要作用的語言。C++語言是一種通用的應用廣范的程序設計語言,是一種既支持傳統的結構化程序設計,又支持面向對象程序設計的系統復雜的語言。C++對C語言的擴充首先由 Stroustrup先生于1980年在貝爾實驗室提出的,于1983年改名為C++。盡管C++的祖先C語言是世界上最受喜愛和應用最廣的專業程序設計語言之一,但C++的發明是必需的。C++的本質就是讓程序員理解和管理更大更復雜的程序。而對這種語言有著最大貢獻的C++之父又是怎樣一個人呢?
Bjarne Stroustrup先生,1950年生于丹麥港口城市奧爾胡斯,1975年在奧爾胡斯大學畢業,1979年獲得劍橋大學計算機科學博士學位。他是C++語言的設計者和實現者,現在是得克薩斯州A&M大學計算機系教授。1979年他來到美國的新澤西州并加入貝爾實驗室,與C語言之父、1983年圖靈獎得主Dennis Ritchie以及大名鼎鼎的Brian Kernighan(兩人合著《C程序設計語言》)共事多年,期間參與了貝爾實驗室的C語言標準化活動。他的研究興趣十分廣泛,包括分布式系統、操作系統、仿真、設計以及編程,Bjarne還積極推動C++的ANSI/ISO標準化。
20世紀90年代以后,Bjarne Stroustrup步入人生的最輝煌時期。
1990年,Bjarne榮獲《財富》雜志評選的“美國12位最年輕的科學家”稱號。
1993年,由于在C++領域的重大貢獻,Bjarne獲得了ACM該年度的 Grace Murray Hopper大獎并成為ACM院士(成立于1947年的ACM協會是歷史最悠久、目前世界上最大的教育和科學計算協會,成為ACM院士是個人成就的里程碑)。
1995年,BYTE雜志頒予他“近20年來計算機工業最具影響力的20人”的稱號。
除了他的專業研究領域外,他對歷史,通俗文學,攝影,運動,旅行和音樂等有廣泛的興趣。他對C++語言的推廣也做出了極大的貢獻,他寫的書“The C++ Programming Language《C++程序設計語言》”已經成為這種語言中最為流行的學習資料,至少被翻譯成18種語言。
給中國程序員最美好的祝愿
2004年12月8日,杭州,C++之父Bjarne Struostrup先生再次來到中國。我們有幸采訪到了這位大師!請看大師給中國程序員的最美好祝愿。
問: 您對中國和中國的程序員有什么認識?您想對他們說點什么嗎?
Bjarne Stroustrup:中國是個大國,并且她有許許多多有趣的文化。我想和中國程序員說的和對其他國家的程序員說的是一樣的,所以我有如下的回答:優秀軟件所具有的特點和技術在全世界都是通用的。
圖 C++之父給中國程序員最美好的祝愿
現在,成為一名電腦高手是許多年輕學生的夢想,面對Stroustrup這樣一位大師級人物的出現,最令我們感興趣的問題莫過于:Bjarne成為大師的歷程是什么樣子的呢?
Bjarne Stroustrup先生出生的奧爾胡斯市是日德蘭半島東海岸的一個美麗的小城,那里每家都有自己的小公寓,公寓里有個小院,小院是孩子們踢足球的地方,那時,成為一名足球明星比成為一名電腦高手是更可行的想法,做一名電腦名星好象是很遙遠的事情,因為個人不太可能擁有一臺昂貴的計算機。很幸運,在大學時他就用上了系里的計算機,它叫GIER,是一臺舊的丹麥計算機,有一個房間那么大,程序都寫在磁帶上面,他用它學習Algol 60程序設計。
而對Bjarne生活產生質的變化的事情是什么呢?
他認為在他的發展生涯中,最關鍵的一個項目是在劍橋大學攻讀博士學位時用Simula67計算機做的模擬分布式系統。做這個項目除了使他成為一名頂尖的程序設計高手外,更使他養成了程序員應具有的溝通和交流能力,這為他后來的發展奠定了堅實的基礎。
B與C
Bjarne和C有緣。
Bjarne Stroustrup先生和C(China中國)有緣,對他來說中國是一個神秘、美麗而有趣的國度。
Bjarne兩度親密接觸中國,第一次是2002年,曾在中國的幾所大學講學,而第二次是在浙江大學參加ICESS國際會議(ICESS 2004, http://www.cs.zju.edu.cn/icess2004/)。Bjarne Stroustrup先生兩年前在中國有過長時間的旅程,而在杭城的日子恰逢陰雨,這次到來對晴天的期望是強烈的,何況有杭州西湖美景。作為丹麥人,也就是賣火柴的小女孩誕生的地方,也就是安徒生童話誕生的國度,和中國有著很深的淵源,安徒生童話里恰巧里面有一篇《夜鶯》,那里寫到了中國,而Bjarne Stroustrup先生對于C(中國)的認識又是什么呢?
他的回答很微妙,他自然知道安徒生童話,他也很喜歡它們,《夜鶯》中描繪的中國純是虛構,與當時的中國可能有也可能沒有任何關系,安徒生創造了那個“中國”來泛指多個國家及其統治者。而作為一個教育者,他對中國的教育老祖師孔老夫子也有自己獨到的見解。
作為第二個C,自然就是C++了。勿庸置疑,C++對于IT的分量,和對于Bjarne個人的影響,都是巨大的。還有一個C,就是計算機,且看下面他如何描述自己與計算機的聯系。
問: 您的生活是怎樣和計算機聯系在一起的?
Bjarne Stroustrup:我也不曉得自己到底是怎樣和計算機聯系在一起的。當我上高中時,不知什么原因總覺得計算機科學是數學的某種實用形式。而事實不完全是這樣,或者至少從軟件的發展上看并不是如此,但正是這種誤解使得我在還不知計算機為何物時選擇了 “計算機科學數學” ,作為我學習的專業,并獲得了我的碩士學位。我寫完第一個程序后,就著了迷,曾沒有回過頭。正象大家所看到的,很幸運,我找到了一個使自己的才能可以很好地發揮的位子。
問:您怎樣教育自己的孩子和學生們?
Bjarne Stroustrup:多數情況下,我是通過實例來進行教學的。我認為多數人過高的估計了言語的影響力,而過低的估計了這種影響力是怎樣達到的過程。我盡量通過把理論和實踐相結合起來以更好地達到目的,這樣可以比僅用理論或僅用實踐示例來教育更能取得事半功倍的成效。我盡量舉出實例,從這些活生生的實例中引導歸納出一般的規則和概念。
C++是怎樣煉成的,是什么促成了C++語言?這象迷一樣繞在我們的心頭;那什么又是計算機語言呢?后者弄懂了,前者看起來也許就更簡單了!且看大師的回答:
問: 您覺得計算機語言和我們人類的語言有什么不同呢?
Bjarne Stroustrup:計算機語言要比人類語言簡單的多,并且精確的多,那也是它應該具有的方式。我不贊成用自然語言去指令電腦的想法。一種程序語言是專家們的工具,并且和普通人相比,是對所有的專家來說用更加專業、定義的更加精確的符號和術語來表達的工具。
當然兩者也有相同之處。那些用的較多的語言比那些使用率較小的語言擁有更多的俗語、表達方式、詞匯,這一點無論是計算機語言還是自然語言都是一樣的。語言還有一個傾向就是越來越易學,但卻很難精通,象C++ 和英語。在兩種語言當中,我們都希望能從最初的基本的應用到真正的掌握。另外一個相同之處就是語言的發展都要適應一個群體的需求,并且一個大的群體或者說社區本身就有重要意義,因為作為這個群體的一部分可以讓你有更多的人來進行互動并且有更多的機會可以使用。所有鮮活的語言都是通過獲得新的術語、俗語和表達方式來得到發展的。在C++中我們已經看到了關于模板技術的迅猛發展,始因是STL(注:STL指標準模板庫,后面我們將采訪STL之父 Stepanov先生,他確實有許多精彩的言論,和Bjarne Stroustrup先生相比,毫不遜色),也就是經常提到的泛型編程(generic programming)和模板元程序(template metaprogramming)。以后幾年里,我們將會在新的ISO C++標準中看到,比1998年標準中對模板技術更強的支持和更廣的應用。
那么,究竟是什么促成了C++語言呢?
他的研究生涯給了他很大靈感,他所在的AT&T貝爾實驗室是一個光榮的群體,那里有一群非常出色的研究人員,那里有許多著名的IT人物,他們彼此間的影響十分深遠。他曾經和C語言之父Dennis Ritchie親密接觸十多年,他們的辦公室相距不遠,C++語言受C的影響是巨大的。而對于C++來說,尤其值得我們推崇的是:作為一種學術性語言,他是從商業性語言的重圍中殺出的。
1979年Bjarne在劍橋完成學業后,到了貝爾實驗室從事研究工作,20世紀80年代,AT&T曾拔款5000美元作為市場預算,創建一門語言的決心可能由此而始。在那里,開始研究幾個與分布式計算有關的項目。可是工作進展得并不順利,因為那時幾乎所有程序設計工具都不適合完成此類工作。所以,他決定自己開發一個名為“帶類的C”的工具,它既允許以類似于Simula的方式組織程序(這種方式現在被稱為面向對象),同時也支持在硬件層次上進行系統軟件開發。從1980年開始,“帶類的C”被應用于貝爾實驗室的很多應用領域,在應用過程中,他又學到了很多東西,而C++正是以“帶類的C”為基礎并結合了一些我們學到的新東西發展而來的。1983年夏天,Rick Mascitti給起了C++的名字,這個名字也象征著兩種語言之間巨大的淵源。
生活中更有意義的事情
對于Bjarne來說,生活中更有意義的事情是什么呢?是學習和教育。這看起來象個沉重的話題,而在Bjarne身上卻顯得如此生動,作為教育家,Bjarne Stroustrup先生本身便是一個成才的典范,他出身于農場和“藍領工人”家庭,他在專業領域孜孜耕耘,取得了不菲業績。先是AT&T的研究者,現在又兼任教席,Bjarne從研究室又走進了大學,直接面對大學的新學生!
C++是Bjarne生命中最重要的事情,而還有一些更有意義的事情。
他對大學教育情有獨衷,他現在是A&M大學的教授,這種行動便是很好的說明,在這里,以一種在AT&T研究所中無法采用的方式將研究和教學結合起來。他認為教學是一種與工業生產不同的能影響世界并使其變得更加美好的方式,而且大學里的研究工作的成果與曾經進行的工業研究的并不相同 - 不是說它更好,僅僅只是不同而已。
他的一些教育觀點也非常值得我們深思:
他說,不要只學習計算機和編程,要積累一種或多種領域的經驗,要有其他專業知識,這樣就能明白什么東西值得我們去編程實現。另外,學習多種語言也是他一再強調的,如果只學一種,容易導致想象力的僵化。他本人愛好廣范,精通多種計算機語言。
問:您覺得怎樣才是學編程的好方法?學習語言時一種好的工具是不是必需的?
Bjarne Stroustrup: 這是過去一年左右里一直占據我大部分注意力的一個問題。我志愿教授電子工程/ 計算機工程專業大學一年級的學生編程,我認為我們目前教編程的傳統方法不夠嚴謹也不夠廣闊。我們社會的文明進步是建立在軟件上的,因而必須培養更好的軟件專家。我認為已經到了我開始培養新手程序員的時候了,在我此之前我都是把精力放在專家上。我基本的設想是讓學生成為專家,使他們最終能夠編出可靠并且別人可以信賴的軟件,這就意味著在培養新手時要求更高,要將重點放在對程序正確性和處理錯誤的訓練上。既然目標是為了制造現實世界中可用的軟件,我也非常重視標準庫的應用和設計。對于C++標準庫工具的教學,例如向量(vector)和字符(string)從第一周就該開始應用,在第一個月之內類(class)就應該介紹,在第二個月之內介紹圖形(graphics)和繼承性(inheritance)。這種方法和傳統的方法不同,那些教學方法往往花費數周的時間來區分那些令人迷惑的C++基本類型,并且浪費寶貴的時間來處理諸如聲明和循環上的一些迷人耳目的語法細節。我稱我的方法為“深度優先法”,因為我們首先教我們的學生足夠的知識去做一些有用的工作,然后才在這有限的基礎上拓寬他們的理解能力和對工具的使用能力。
我所有的教學都是在實例的基礎上進行的。我通過典型的例子來使學生理解,用親身的體會來解釋一些規則。自然地,我要求學生寫大量代碼—如果你不讀也不寫大量代碼的話你就學不會編程。第一階段如下,學生必須經過親身寫代碼,體會解題過程中出現的實際問題;第二個階段必須好好體會親身所犯的錯誤,并且學會克服他們。這其中,調試、錯誤處理,還有學會將大問題分解成小問題,從最小的組件來編程是非常重要的。
問:數學和計算機科學有什么關系嗎?
Bjarne Stroustrup: 兩者并沒有很強的直接聯系,但是有一部分編程的實質包含在里面-- -象學數學一樣,編程有時也需要很嚴密的思維。自從古希臘以來,數學就被用來訓練人們的邏輯思維,并且我覺得如果不用數學的話很難想象怎樣才能編出好程序來。當然也有一些計算機領域,用到高深的數學知識。然而,這些領域通常是非常專業的。數學,特別是數學思維是計算機的一個支柱。經驗主義是另一支柱,通過觀察和測量來幫助理解實際的發展,用以調整我們的系統和行為。兩方面我們都需要。計算機科學不是僅僅用來證明定理的,也不是僅僅用來收集數據的。為了有效地實踐計算機科學和發展高質量軟件,更同時需要數學和經驗的訓練。
問: 您以前在歐洲學習而現在在美國工作,您覺得歐美有什么學術傳統區別?怎樣才算是一種好的大學教育呢?尤其對計算機科學來說。現在的大學有部分學生中途退學,您怎樣看待這一現象呢?
Bjarne Stroustrup:這很難回答。歐洲和美國都幅員遼闊,而且有很多不同的學術傳統。真的不好總結,并且在兩地都有一些非常好的大學科系,這不是很容易區別和下結論的。
很少有學生離開學校去開公司,較多的是離開學校去從事一些有較高收入的工作,但大多數人還是完成了學業。我印象中那些放棄了計算機科學學習轉而投入業界工作的是會為此感到后悔的。從長期眼光來看學位對一個好工作來說是重要的,特別是學生在他們最后一年或最后幾年的學習。當然也確實有些相反的例子,但那些人通常永遠不會再從事真正的技術工作,而轉為商業管理人員了,如果那是他們想做的,那一個學位并不是必須的。我一直認為:一個學生如果還未獲得學位,最好不要離開學校。
問:我們經常批評我們現在的C++教育不夠現代、不夠科學,您是通過“深度優先法”來教授學生的,您是否覺得在一個學生學習早期有些難嗎?我們該如何做呢?
Bjarne Stroustrup:這是必然的。傳統的教授編程的方法是不行的,學完這些課程的學生寫不出很好的代碼。說得更激進一點,他們甚至不知道什么是好的代碼!我的方法可以避免這種情況發生。我已在300 名學生身上實驗成功。對于程序員來說這是非常關鍵的——包括新程序員——了解基本概念和基本技能。但僅僅了解程序設計語言的基本構造是不夠的。另一方面,如果沒有一種編程語言我們就不可能教授編程的技能和規則,因此,對一種語言工具充分掌握,做盡可能多的練習是必需的。
很顯然,這種教育問題不僅僅局限于C++語言。我的方法可以應用于任何其他語言。
面向金錢、面向未來和面向對象
面向對象是個有趣的問題,C++正是和面向對象有著非常聯系的語言,作為一種非商業化語言,他已經影響了世界范圍數十億美元的設計決策。而還有許多語言具有這種特點,因而,關于各種語言的爭論喋喋不休地進行了幾十年。
當有人問Bjarne Stroustrup先生:有人說Java是純粹面向對象的,而C#更勝一籌,而還有很多人說它們純粹是面向金錢的。以您之見呢?
Bjarne 的回答非常風趣:我喜歡“面向金錢”這個詞 :-) 還有Andrew Koenig的說法"面向大話"我也喜歡。C++可不面向這兩個東東。對這點我還想指出,我認為純粹性并非什么優點。C++的優點恰恰在于其支持多種有效的編程風格(多種思維模型吧,如果你一定要這么說)及其組合。最優雅最有效也最容易維護的解決方案常常涉及到一種以上的風格(編程模型)。如果一定要用吸引人的字眼,C++是一種多思維模型的語言。在軟件開發的龐大領域,需求千變萬化,起碼需要一種支持多種編程的設計風格的通用語言,而且很可能需要一種以上呢。再說,世界之大,總容得下好幾種編程語言吧?那種認為一種語言對所有應用和每個程序員都是最好的看法,根本就是荒謬的。
他上面的回答很好地告訴了我們面向對象和面向金錢的關系,也給我們的爭論劃上了圓滿的句號。
問:您對面向對象是怎樣理解的?它是不是一種好的可接受的編程思考方式?有沒有學習OO必須的有用的工具?
Bjarne Stroustrup:OO 技術在現在軟件發展的扮演了非常重要的角色,但并不是唯一的方法。象泛型程序設計(generic programming),用C++ 模板是另一種方法,這些方法必須通過綜合應用來,才能創造出:一流的、最可讀的、最易于維護的、最高效的程序。但沒有任何一種方法是適合所有要求的。
我主要用C++來編程。我覺得C++是一種學習和實踐OO思想很好的編程語言。
圖 敢問路在何方
問: 您能對IT的將來做一下預測嗎?將來我們最有可能用什么語言?
Bjarne Stroustrup:一個聰慧的幽默大師曾經說過:預測是困難的,特別是對將來的預測。但是我認為未來十年之內我們用的東西在今天的實驗室里是能夠看到的。另外我們將用的最主要的語言也是今天最主要的。我們不可能因為一些新東西和一些更好的東西的出現就重組整個工業領域,因此在五到十年之內,我們還是用C, C++, COBOL, Fortran, Java, Perl, Python,也許還有C#,和其它許多種語言。沒有一種語言能適合所有用途,并且好的程序員都懂并且都能用好幾種語言。懂好多種語言和多種程序設計技術會使我們可以更好地編程。
對于IT我不想說太多,很顯然:我們會繼續依賴IT并且它會延伸到越來越多的領域。當然,肯定會有失敗,通常是因為過度的濫用引起的——但是在十年以后我們受IT的影響肯定要比今天大得多。
人物印象
很幸運,通過電郵采訪的同時終于有機會和大師面對面。想象中的大師和面對面見到的有太多的意想不到,用一個詞來形容是“謙遜”。
Bjarne到杭州下了飛機,便撲向美麗的西湖,同去的是他的好友STL之父Alex Stepanov先生。在未去杭州之前,Bjarne Stroustrup先生通過電郵告訴我杭州城的美;去了之后,少有的好天氣讓我們碰上了,爽;夜里在旅館見到了久違的大師,一夜之間見到兩位大師,更爽!
我對Bjarne Stroustrup先生有著特殊的感情,覺得他象位慈父,而他正和我的父親同樣的年紀。大師,慈父!接觸越多,對Bjarne Stroustrup先生的感觸越深。到了杭城,見到大師其人,這種感覺越來越濃厚,他又象海,既有熱情,又能包容。
采訪大部是通過E—mail進行的,采訪的過程中對我的問題孜孜以求,給我的回答細微備至,E—mail的好處在此發揮到了極致,大洋這邊的我沐著陽光,那邊的他在挑燈夜書。
唯有謝謝眾多C++程友和非C++朋友對我的支持,唯有大師再來杭城時,到最好的茶館將上好的龍井泡上,親手送到大師的手中!
2004年12月19日
posted @
2007-04-06 16:35 學習才能進步 閱讀(268) |
評論 (0) |
編輯 收藏
1 new自動計算需要分配的空間,而malloc需要手工計算字節數
2 new是類型安全的,而malloc不是,比如:
int* p = new float[2]; // 編譯時指出錯誤
int* p = malloc(2*sizeof(float)); // 編譯時無法指出錯誤
new operator 由兩步構成,分別是 operator new 和 construct
3 operator new對應于malloc,但operator new可以重載,可以自定義內存分配策略,甚至不做內存分配,甚至分配到非內存設備上。而malloc無能為力
4 new將調用constructor,而malloc不能;delete將調用destructor,而free不能。
5 malloc/free要庫文件支持,new/delete則不要。
posted @
2007-04-06 15:28 學習才能進步 閱讀(765) |
評論 (0) |
編輯 收藏
如果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就是用來修飾指針所指向的變量,即指針指向為常量;如果const位于星號的右側,const就是修飾指針本身,即指針本身是常量。因此,[1]和[2]的情況相同,都是指針所指向的內容為常量(const放在變量聲明符的位置無關),這種情況下不允許對內容進行更改操作,如不能*a = 3 ;[3]為指針本身是常量,而指針所指向的內容不是常量,這種情況下不能對指針本身進行更改操作,如a++是錯誤的;[4]為指針本身和指向的內容均為常量。
另外const 的一些強大的功能在于它在函數聲明中的應用。在一個函數聲明中,const 可以修飾函數的返回值,或某個參數;對于成員函數,還可以修飾是整個函數。
有如下幾種情況:
A& operator=(const A& a);
void fun0(const A* a );
void fun1( ) const; // fun1( ) 為類成員函數
const A fun2( );
----------------------------------------------------------------------------------
const的初始化
先看一下const變量初始化的情況
1) 非指針const常量初始化的情況:
A b;
const A a = b;
2) 指針(引用)const常量初始化的情況:
A* d = new A();
const A* c = d;
或者:const A* c = new A();
引用:
A f;
const A& e = f; // 這樣作e只能訪問聲明為const的函數,而不能訪問一般的成員函數;
----------------------------------------------------------------------------------
作為參數和返回值的const修飾符
其實,不論是參數還是返回值,參數傳入時候和函數返回的時候,初始化const變量
1 修飾參數的const,如 void fun0(const A* a ); void fun1(const A& a);
調用函數的時候,用相應的變量初始化const常量,則在函數體中,按照const所修飾的部分進行常量化,如形參為const A* a,則不能對傳遞進來的指針的內容進行改變,保護了原指針所指向的內容;如形參為const A& a,則不能對傳遞進來的引用對象進行改變,保護了原對象的屬性。
[注意]:參數const通常用于參數為指針或引用的情況;
2 修飾返回值的const,如const A fun2( ); const A* fun3( );
這樣聲明了返回值后,const按照"修飾原則"進行修飾,起到相應的保護作用。
const Rational operator*(const Rational& lhs, const Rational& rhs)
{
return Rational(lhs.numerator() * rhs.numerator(),
lhs.denominator() * rhs.denominator());
}
返回值用const修飾可以防止允許這樣的操作發生:
Rational a,b;
Radional c;
(a*b) = c;
一般用const修飾返回值為對象本身(非引用和指針)的情況多用于二目操作符重載函數并產生新對象的時候。
[總結] 一般情況下,函數的返回值為某個對象時,如果將其聲明為const時,多用于操作符的重載。通常,不建議用const修飾函數的返回值類型為某個對象或對某個對象引用的情況。
原因如下:
如果返回值為某個對象為const(const A test = A 實例)或某個對象的引用為const(const A& test = A實例) ,則返回值具有const屬性,則返回實例只能訪問類A中的公有(保護)數據成員和const成員函數,并且不允許對其進行賦值操作,這在一般情況下很少用到。
----------------------------------------------------------------------------------
類成員函數中const的使用
一般放在函數體后,形如:void fun() const;
如果一個成員函數的不會修改數據成員,那么最好將其聲明為const,因為const成員函數中不允許對數據成員進行修改,如果修改,編譯器將報錯,這大大提高了程序的健壯性。
----------------------------------------------------------------------------------
使用const的一些建議
1 要大膽的使用const,這將給你帶來無盡的益處,但前提是你必須搞清楚原委;
2 要避免最一般的賦值操作錯誤,如將const變量賦值,具體可見思考題;
3 在參數中使用const應該使用引用或指針,而不是一般的對象實例,原因同上;
4 const在成員函數中的三種用法(參數、返回值、函數)要很好的使用;
5 不要輕易的將函數的返回值類型定為const;
6 除了重載操作符外一般不要將返回值類型定為對某個對象的const引用;
const * 與 * const
const *表示指向const對象的指針,可以指向一個const的對象,但是并不是指只能指向一個const對象,指向const對象的指針同樣可以指向一個非cons類型的對象。但是const的對象只能由const*類型的指針指向,而不能由普通指針指向。const*類型的指針在使用過程中可以其改變,即可以指向其他對象。
const*類型的指針的真正含義是:如果一個指針是const*類型的指針表示該指針指向的對象不能通過該指針進行修改(對象本身可能通過別的方式進行修改)。
*const expression表示指針(expression)本身是const,即*const類型的指針初始化后不能改變,不能指向別的對象。
char * point_char = new char('e');
const char char_char = 'f';
const char * const_star_char; // 可以不用初始化
char *const star_const_char = point_char; // 必須初始化
const_star_char = &char_char; // OK
star_const_char = &char_char; // 錯誤,*const 不可改變
const_star_char = star_const_char; // OK
star_const_char = const_star_char ; // 錯誤 ,*const 不可改變
const char* const foo(char const * const str) const
第一個const表示返回類型為const,也就是不能把此函數的返回值當作左值來使用。
第二個const表示指針的不可變性,但在這是可以省略,因為返類型已經是const。
第三個cosnt表示str的常量性,也就其內容是不能改變,可以寫在其前面的char的前面。
第四個cosnt表示str的指針的常量性,也就是此指針不能指向別的地址。
第五個cosnt表示此函數的常量性(前提是類的成員函數),不能修改所在類的數據成員。
posted @
2007-04-06 13:36 學習才能進步 閱讀(298) |
評論 (1) |
編輯 收藏