在過去的25年里,編程世界發(fā)生了巨大的變化,如今,我們有大量的有用的、靈活的數(shù)據(jù)類型可以使用,但在25年前,你需要花大量的額外時(shí)間自己去構(gòu)造這些類型。
C和Pascal語言——當(dāng)時(shí)的標(biāo)準(zhǔn)語言——提供了少量的面向機(jī)器的數(shù)據(jù)類型:數(shù)字,指針,數(shù)組,形式上的字符串,以及把多種數(shù)據(jù)組合到一起的結(jié)構(gòu)體或record。重要的是,以這些基本的類型為基石,我們可以構(gòu)造出更多有趣的類型,例如棧,樹,鏈接表,哈希表,可變數(shù)組等。
在Perl或Python,或Erlang語言里,我不需要考慮這些東西。我在使用list、string或array時(shí),根本不關(guān)心它們能容納多少元素,或放在內(nèi)存的什么地方。最常使用的還有字典,同樣,根本不擔(dān)心它的容量或哈希沖突是如何避免的細(xì)節(jié)內(nèi)容。
除此外,我仍然需要一些新的數(shù)據(jù)類型,但它們更多的是現(xiàn)有類型的一種變換,而不是重新構(gòu)造。任意維度的vector實(shí)際就是array。一個(gè)RGB 顏色值實(shí)際上一個(gè)3元tuple。一個(gè)多項(xiàng)式既可以是一個(gè)tuple,也可以說list。我驚奇于這些 array,tuple,list,dictionary等數(shù)據(jù)類型大大的消除了我在大學(xué)課程里學(xué)到的那些基本數(shù)據(jù)類型上的不便。在實(shí)現(xiàn)一個(gè)平衡二叉樹時(shí),你的注意力放在如何讓二叉樹平衡,而不是痛苦的糾結(jié)于亂如麻的指針操作。
將已有的小方塊搭建成一個(gè)新的建筑,這將會(huì)引起比小方塊出現(xiàn)帶來的更大的變化。這些小方塊是如何出現(xiàn)的已經(jīng)不是人們關(guān)心的重點(diǎn)。在很多的編程課程和教材中,本來很好的教學(xué)中突然出現(xiàn)了一批新詞匯:對(duì)象,構(gòu)造器,抽象基礎(chǔ)類,以及私有方法。于是,下一次作業(yè)中,用簡(jiǎn)單的三元tuple來表達(dá)的RGB顏色值變成了由一個(gè)具有g(shù)et、set方法,多高構(gòu)造器的類來代替,更要命的,出現(xiàn)了大量的代碼。
這就是為什么有人會(huì)不停的呼吁、解釋為什么面向?qū)ο蟛皇莻€(gè)好東西、會(huì)使編程失去樂趣的原因。但很少奏效。
并不是面向?qū)ο蟛缓茫蚝惺裁慈毕?。而是面向?qū)ο蟛皇怯?jì)算機(jī)編程的基本原子,它們不是人們想象的天生就存在的。不設(shè)門檻的任意使用面向?qū)ο髞斫鉀Q問題會(huì)讓代碼變得臃腫和過度技術(shù)化,然而,很多人還是堅(jiān)持鍥而不舍的用對(duì)象來解決所有問題。這非常糟糕,因?yàn)檫@樣做讓人們辨不清面向?qū)ο箫L(fēng)格的做法是否真的產(chǎn)生了使問題簡(jiǎn)化并易于理解的效果。