關(guān)于OOP的文章已經(jīng)跟多了,但是還是禁不住把這篇文章轉(zhuǎn)到這里,以讓大家從各方面來(lái)了解和認(rèn)識(shí)面向?qū)ο蟆1疚膹拿嫦鄬?duì)象的基本概念說(shuō)起,探討了面向?qū)ο蟮牡奶攸c(diǎn),發(fā)展以及C++、Java和C#這些面向?qū)ο笳Z(yǔ)言的發(fā)展與競(jìng)爭(zhēng)情況。
OOP: Object Oriented Program命,面向?qū)ο蟮某绦蛟O(shè)計(jì)。所謂“對(duì)象”就是一個(gè)或一組數(shù)據(jù)以及處理這些數(shù)據(jù)的方法和過(guò)程的集合。面向?qū)ο蟮某绦蛟O(shè)計(jì)完全不同于傳統(tǒng)的面向過(guò)程程序設(shè)計(jì),它大大地降低了軟件開發(fā)的難度,使編程就像搭積木一樣簡(jiǎn)單,是當(dāng)今電腦編程的一股勢(shì)不可擋的潮流。
面向?qū)ο缶幊蹋∣bject Oriented Program命,OOP,面向?qū)ο蟪绦蛟O(shè)計(jì))是一種計(jì)算機(jī)編程架構(gòu)。OOP 的一條基本原則是計(jì)算機(jī)程序是由單個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成。OOP 達(dá)到了軟件工程的三個(gè)主要目標(biāo):重用性、靈活性和擴(kuò)展性。為了實(shí)現(xiàn)整體運(yùn)算,每個(gè)對(duì)象都能夠接收信息、處理數(shù)據(jù)和向其它對(duì)象發(fā)送信息。OOP 主要有以下的概念和組件:
組件 - 數(shù)據(jù)和功能一起在運(yùn)行著的計(jì)算機(jī)程序中形成的單元,組件在 OOP 計(jì)算機(jī)程序中是模塊和結(jié)構(gòu)化的基礎(chǔ)。
抽象性 - 程序有能力忽略正在處理中信息的某些方面,即對(duì)信息主要方面關(guān)注的能力。
封裝 - 也叫做信息封裝:確保組件不會(huì)以不可預(yù)期的方式改變其它組件的內(nèi)部狀態(tài);只有在那些提供了內(nèi)部狀態(tài)改變方法的組件中,才可以訪問(wèn)其內(nèi)部狀態(tài)。每類組件都提供了一個(gè)與其它組件聯(lián)系的接口,并規(guī)定了其它組件進(jìn)行調(diào)用的方法。
多態(tài)性 - 組件的引用和類ji hui涉及到其它許多不同類型的組件,而且引用組件所產(chǎn)生的結(jié)果得依據(jù)實(shí)際調(diào)用的類型。
繼承性 - 允許在現(xiàn)存的組件基礎(chǔ)上創(chuàng)建子類組件,這統(tǒng)一并增強(qiáng)了多態(tài)性和封裝性。典型地來(lái)說(shuō)就是用類來(lái)對(duì)組件進(jìn)行分組,而且還可以定義新類為現(xiàn)存的類的擴(kuò)展,這樣就可以將類組織成樹形或網(wǎng)狀結(jié)構(gòu),這體現(xiàn)了動(dòng)作的通用性。
由于抽象性、封裝性、重用性以及便于使用等方面的原因,以組件為基礎(chǔ)的編程在腳本語(yǔ)言中已經(jīng)變得特別流行。Python 和 Ruby 是最近才出現(xiàn)的語(yǔ)言,在開發(fā)時(shí)完全采用了 OOP 的思想,而流行的 Perl 腳本語(yǔ)言從版本5開始也慢慢地加入了新的面向?qū)ο蟮墓δ芙M件。用組件代替“現(xiàn)實(shí)”上的實(shí)體成為 JavaScript(ECMAScript) 得以流行的原因,有論證表明對(duì)組件進(jìn)行適當(dāng)?shù)慕M合就可以在英特網(wǎng)上代替 HTML 和 XML 的文檔對(duì)象模型(DOM)。
設(shè)計(jì)模式、技術(shù)和直覺構(gòu)成嚴(yán)峻的挑戰(zhàn)。這是選擇編程語(yǔ)言之前必須認(rèn)識(shí)到的,盡管不同語(yǔ)言的設(shè)計(jì)特性可能促進(jìn)或者阻礙這一轉(zhuǎn)化。
在網(wǎng)絡(luò)應(yīng)用的增長(zhǎng)中,一個(gè)很重要的部分是小型移動(dòng)設(shè)備和特殊Internet設(shè)備的爆炸性增長(zhǎng)。這些設(shè)備各有各的操作系統(tǒng),或者只在某種特定的設(shè)備領(lǐng)域內(nèi)有共同的操作系統(tǒng)。我們現(xiàn)在還可以一一列舉出這些設(shè)備——家庭接入設(shè)備、蜂窩電話、電子報(bào)紙、PDA、自動(dòng)網(wǎng)絡(luò)設(shè)備等等。但是這些設(shè)備領(lǐng)域的數(shù)量和深入程度將會(huì)很快變得難以估量。我們都知道這個(gè)市場(chǎng)大得驚人,PC的興起與之相比不過(guò)小菜一碟。因此在這些設(shè)備的應(yīng)用程序市場(chǎng)上,競(jìng)爭(zhēng)將會(huì)相當(dāng)殘酷。獲勝的重要手段之一,就是盡快進(jìn)入市場(chǎng)。開發(fā)人員需要優(yōu)秀的工具,迅速高效地撰寫和調(diào)試他們的軟件。平臺(tái)無(wú)關(guān)性也是制勝秘訣之一,它使得程序員能夠開發(fā)出支持多種設(shè)備平臺(tái)的軟件。
我預(yù)期的另一個(gè)變化是,我們對(duì)于代碼(Java)和數(shù)據(jù)(XML)協(xié)同型應(yīng)用程序的開發(fā)能力將會(huì)不斷提高。這種協(xié)同是開發(fā)強(qiáng)大應(yīng)用程序的核心目標(biāo)之一。我們從XML的迅速流行和ebXML規(guī)范的進(jìn)展中,已經(jīng)看到了這個(gè)趨勢(shì)。ebXML是一個(gè)針對(duì)電子商務(wù)和國(guó)際貿(mào)易的,基于XML的開放式基礎(chǔ)構(gòu)架,由聯(lián)合國(guó)貿(mào)易促進(jìn)和電子商務(wù)中心(UN/CEFACT)與結(jié)構(gòu)性信息標(biāo)準(zhǔn)推進(jìn)組織(OASIS)共同開發(fā)。
我們能否期望出現(xiàn)一個(gè)真正的面向組件(component-oriented)的語(yǔ)言?它的創(chuàng)造者會(huì)是誰(shuí)呢?
Stroustrup: 我懷疑,這個(gè)領(lǐng)域中之所以缺乏成果,正是因?yàn)槿藗?mdash;—主要是那些非程序員們——對(duì)“組件”這個(gè)意義含糊的字眼寄予了太多的期望。這些人士夢(mèng)想,有朝一日,組件會(huì)以某種方式把程序員趕出歷史舞臺(tái)。以后那些稱職的“設(shè)計(jì)員”只需利用預(yù)先調(diào)整好的組件,把鼠標(biāo)拖一拖放一放,就把系統(tǒng)組合出來(lái)。對(duì)于軟件工具廠商來(lái)說(shuō),這種想法還有另一層意義,他們認(rèn)為,到時(shí)候只有他們才保留有必要的技術(shù),有能力編寫這樣的組件。
這種想法有一個(gè)最基本的謬誤:這種組件很難獲得廣泛歡迎。一個(gè)單獨(dú)的組件或框架(framework),如果能夠滿足一個(gè)應(yīng)用程序或者一個(gè)產(chǎn)業(yè)領(lǐng)域?qū)λ岢龅拇蟛糠忠蟮脑挘瑢?duì)于其制造者來(lái)說(shuō)就是劃算的產(chǎn)品,而且技術(shù)上也不是很困難。可是該產(chǎn)業(yè)內(nèi)的幾個(gè)競(jìng)爭(zhēng)者很快就會(huì)發(fā)現(xiàn),如果所有人都采用這些組件,那么彼此之間的產(chǎn)品就會(huì)變得天下大同,沒什么區(qū)別,他們將淪為簡(jiǎn)單的辦事員,主要利潤(rùn)都將鉆進(jìn)那些組件/框架供應(yīng)商的腰包里!
小“組件”很有用,不過(guò)產(chǎn)生不了預(yù)期的杠桿效應(yīng)。中型的、更通用的組件非常有用,但是構(gòu)造時(shí)需要非同尋常的彈性。
在C++中,我們綜合運(yùn)用不同共享形式的類體系(class hierarchies),以及使用templates精心打造的接口,在這方面取得了一定的進(jìn)展。我期待在這個(gè)領(lǐng)域取得一些有趣和有用的成果,不過(guò)我認(rèn)為這種成果很可能是一種新的C++程序設(shè)計(jì)風(fēng)ge,而不是一種新的語(yǔ)言。
Lindholm: 編寫面向組件的應(yīng)用程序,好像更多的是個(gè)投資、設(shè)計(jì)和程序員管理方面的問(wèn)題,而不是一個(gè)編程語(yǔ)言問(wèn)題。當(dāng)然某些語(yǔ)言在這方面具有先天優(yōu)勢(shì),不過(guò)如果說(shuō)有什么魔術(shù)般的新語(yǔ)言能夠大大簡(jiǎn)化組件的編寫難度,那純粹是一種誤導(dǎo)。
微軟已經(jīng)將全部賭注押在C#上,其他語(yǔ)言何去何從?
Stroustrup: C++在下一個(gè)十年里仍然將是一種主流語(yǔ)言。面對(duì)新的挑戰(zhàn),它會(huì)奮起應(yīng)對(duì)。一個(gè)創(chuàng)造了那么多出色系統(tǒng)的語(yǔ)言,絕不會(huì)“坐視落花流水春去也”。
我希望微軟認(rèn)識(shí)到,它在C++(我指的是ISO標(biāo)準(zhǔn)C++)上有著巨大的利益,C++是它與IT世界內(nèi)其他人之間的一座橋梁,是構(gòu)造大型系統(tǒng)和嵌入式系統(tǒng)的有效工具,也是滿足高性能需求的利器。其他語(yǔ)言,似乎更注重那些四平八穩(wěn)的商用程序。
競(jìng)爭(zhēng) C#會(huì)不會(huì)獲得廣泛的接受,并且擠掉其他的語(yǔ)言?
Lindholm: 通常,一種語(yǔ)言既不會(huì)從別的語(yǔ)言那里獲利,也不會(huì)被擠掉。那些堅(jiān)定的Fortran程序員不還用著Fortran嗎?對(duì)于個(gè)人來(lái)說(shuō),語(yǔ)言的選擇當(dāng)然因時(shí)而異,但就整體而言,語(yǔ)言的種類只會(huì)遞增,也就是說(shuō),它們之間的關(guān)系是“有你有我”而不是“有你沒我”。
對(duì)于一個(gè)新語(yǔ)言的接受程度,往往取決于其能力所及。Java技術(shù)被迅速接受,原因是多方面的,Internet和World Wide Web接口,在其他技術(shù)面前的挫折感,對(duì)于Java技術(shù)發(fā)展方向的全面影響能力,都是原因。另一個(gè)重要的原因是Java獨(dú)立于廠商,這意味著在兼容產(chǎn)品面前可以從容選擇。
C#是否會(huì)獲得廣泛接受?視情況而定。總的來(lái)說(shuō),那些對(duì)于平臺(tái)無(wú)關(guān)性和廠商無(wú)關(guān)性漠不關(guān)心的程序員,可能會(huì)喜歡C#。那些跟微軟平臺(tái)捆在一起人當(dāng)然可能想要尋找VB 和VC的一個(gè)出色的替代品。但是對(duì)于程序跨平臺(tái)執(zhí)行能力特別關(guān)注的程序員,將會(huì)堅(jiān)守Java之類的語(yǔ)言。這種能力對(duì)于多重訪問(wèn)設(shè)備(multiple access devices)和分布式計(jì)算模型至關(guān)重要,而Java語(yǔ)言提供了一個(gè)標(biāo)準(zhǔn)的、獨(dú)立于廠商運(yùn)行時(shí)環(huán)境。
Stroustrup:C#的流行程度幾乎完全取決于微軟投入的資金多少。看上去C#的興起肯定會(huì)犧牲掉其他一些語(yǔ)言的利益,但是事實(shí)上未必如此。Java的蓬勃發(fā)展并沒有給C++帶來(lái)衰敗。C++的應(yīng)用仍然在穩(wěn)定增長(zhǎng)(當(dāng)然,已經(jīng)不是爆炸性的增長(zhǎng)了)。也許其他的語(yǔ)言也還能獲得自己的一席之地。
不過(guò),我實(shí)在看不出有什么必要再發(fā)明一種新的專有語(yǔ)言。特別是微軟,既生VB,何需C#?
六、發(fā)展 vs. 革新(Evolution vs. Revolution)
C++是一種發(fā)展型的語(yǔ)言,Java和C#似乎更像是革新型語(yǔ)言(它們是從頭設(shè)計(jì)的)?什么時(shí)候,革新型的語(yǔ)言才是必需的呢?
Lindholm: Java技術(shù)并非憑空出世,反而更像是發(fā)展型的。Java所有的特性,在Java平臺(tái)推出之前,都至少已經(jīng)存在于另一種環(huán)境之中。Java的貢獻(xiàn)在于,在眾多的特性和權(quán)衡中,做出了合理的選擇,使得產(chǎn)品既實(shí)用,又優(yōu)雅。Java技術(shù)對(duì)于程序員的態(tài)度是:撫養(yǎng),但不溺愛。
Stroustrup:從技術(shù)上講,我并不認(rèn)為Java和C#是什么“從頭設(shè)計(jì)的”革新型語(yǔ)言。倘若Java是從技術(shù)原則出發(fā),從頭設(shè)計(jì),大概就不會(huì)模仿C/C++那種丑陋和病態(tài)的語(yǔ)法了(不必驚訝,Stroustrup在很多場(chǎng)合表示過(guò),C++采用C的語(yǔ)法形式,實(shí)在是迫于兼容性。他本人更偏愛Simula的語(yǔ)法——譯者)。
我認(rèn)為,只有當(dāng)程序員們面對(duì)的問(wèn)題發(fā)生了根本的變化的時(shí)候,或者當(dāng)我們發(fā)現(xiàn)了全新的、極其優(yōu)越的程序設(shè)計(jì)技術(shù),又完全不能為現(xiàn)存語(yǔ)言所支持的時(shí)候,我們才需要全新的語(yǔ)言。問(wèn)題是,我們恐怕永遠(yuǎn)也碰不到那些“根本”、“全新”的情況。
我以為,自從OOP問(wèn)世以來(lái),可稱為“根本”的新型程序設(shè)計(jì)技術(shù),唯有泛型程序設(shè)計(jì)(generic program命)和生成式程序設(shè)計(jì)(generative program命)技術(shù),這兩項(xiàng)技術(shù)主要是源于C++ templates技術(shù)的運(yùn)用,也有一部分曾經(jīng)被視為面向?qū)ο蠛秃瘮?shù)式語(yǔ)言(functional languages)的次要成分,現(xiàn)在都變成正式、可用和可承受的技術(shù)了。我對(duì)于目前C++模板(template)程序設(shè)計(jì)的成果非常興奮。例如,像POOMA, Blitz++和MTL等程序庫(kù),在很多地方改變了數(shù)值計(jì)算的方式。
C#的一個(gè)“賣點(diǎn)”,就是它們的簡(jiǎn)單性。現(xiàn)在Java是不是快失去這個(gè)賣點(diǎn)了?
Stroustrup:新語(yǔ)言總是宣稱自己如何如何簡(jiǎn)單,對(duì)老語(yǔ)言的復(fù)雜性頗多非議。其實(shí)這種所謂的“簡(jiǎn)單性”,簡(jiǎn)單地說(shuō),就是不成熟性。語(yǔ)言的復(fù)雜性,是在解決現(xiàn)實(shí)世界中極為煩瑣和特殊的復(fù)雜問(wèn)題的過(guò)程中逐漸增加的。一個(gè)語(yǔ)言只要活的時(shí)間夠長(zhǎng),總會(huì)有某些地方逐漸復(fù)雜起來(lái),或者是語(yǔ)言本身,或者是程序庫(kù)和工具。C++和Java顯然都不例外,我看C#也一樣。如果一種語(yǔ)言能夠度過(guò)自己的幼年時(shí)代,它會(huì)發(fā)現(xiàn),自己無(wú)論是體積還是復(fù)雜性都大大增加了。
Lindholm:Java技術(shù)的的功能在增加,需要學(xué)習(xí)的東西也在增加。不過(guò)功能的增加并不一定帶來(lái)復(fù)雜性的增加。Java技術(shù)的發(fā)展,并沒有使學(xué)習(xí)曲線更加陡峭,只是讓它繼續(xù)向右方延展了。
標(biāo)準(zhǔn) 標(biāo)準(zhǔn)化語(yǔ)言和開放型語(yǔ)言各自的優(yōu)點(diǎn)和缺點(diǎn)何在?
Lindholm:對(duì)于一個(gè)開放、不允許專有擴(kuò)展、具有權(quán)威的強(qiáng)制性標(biāo)準(zhǔn)語(yǔ)言或者運(yùn)行環(huán)境來(lái)說(shuō),不存在什么缺點(diǎn)。允許專有擴(kuò)展就意味著允許廠商下套子綁架客戶。特別重要的是,必須讓整個(gè)平臺(tái),而不只是其中一部分完全標(biāo)準(zhǔn)化,才能杜絕廠商們利用高層次的專有API下套子。客戶要求有選擇廠商的zi you,他們既要有創(chuàng)造性,又需要兼容性。
Stroustrup:對(duì)于一個(gè)語(yǔ)言,如C/C++來(lái)說(shuō),建立正式標(biāo)準(zhǔn)(如ISO標(biāo)準(zhǔn))最大的好處,在于可以防止某一個(gè)廠商操縱這種語(yǔ)言,把它當(dāng)成自己的搖錢樹。多個(gè)廠商的競(jìng)爭(zhēng)給用戶帶來(lái)的是較低的價(jià)位和較好的穩(wěn)定性。
專有語(yǔ)言的好處,一是流行,二是便宜(不過(guò)等你被套牢了之后,情況就會(huì)起變化),三是對(duì)于商業(yè)性需求可以做出快速的反應(yīng)。
標(biāo)準(zhǔn)化語(yǔ)言的特點(diǎn)之一是,它不能忽略特殊用戶的需求。比如我在AT&T中所考慮的東西,其規(guī)模、可靠性和效率要求,跟那些普通廠商關(guān)注的大眾軟件相比,根本不可同日而語(yǔ)。那些公司很自然只關(guān)注主要的需求。
然而,多數(shù)大機(jī)構(gòu)和身處前沿的公司,都有著特殊的需求。C++的設(shè)計(jì)是開放、靈活和高效的,能夠滿足我所能想象的任何需求。跟其他的現(xiàn)代語(yǔ)言相比,C++的家長(zhǎng)式作風(fēng)可謂少之又少,原因就在這。當(dāng)然,不能贊賞這一點(diǎn)的人會(huì)詬病C++的“危險(xiǎn)”。
擁有正式和開放標(biāo)準(zhǔn)的語(yǔ)言主要是為編程工具的使用者和客戶服務(wù)的,而擁有專屬“標(biāo)準(zhǔn)”的語(yǔ)言,主要是為廠商服務(wù)的。
新聞熱點(diǎn)
疑難解答