鄧輝 (翻譯)
長期以來,我們一直遵循這樣乙個程式設計風格方面的原則:乙個程式的功能要素不應該太大。如果程式中的某些部件的規模超出了易於理解的範圍,就會造成大量的複雜性,這些複雜性很容易隱藏錯誤,正如在乙個大城市中很容易隱藏罪惡一樣。這種程式難以理解、難以測試、難以除錯。
根據這個原則,乙個大型程式必須要分割成一些小塊,並且分割的程度應該和程式的規模相稱。那麼,如何來對程式進行分割呢?傳統上,我們一般會使用稱為自頂向下的設計方法(
top-down design
):程式打算完成
7項任務,於是就把它劃分成
7個主要的子例程。第乙個例程要做
4件事情,於是就再把它分割成
4個子例程。這個過程要持續下去,直到整個程式具有適當的粒度為止。這裡適當的含義為:每個部分都大到足以完成一些實質性的工作,並且都小到足以作為乙個可理解的單元。
有經驗的
lisp
程式設計師卻以一種不同的方式來分割他們的程式。和自頂向下設計對應,他們稱之為自底向上設計(
bottom-up design
):改變語言,使之適合於要解決的問題。在
lisp
中,你不是僅僅用語言來編寫程式,同時你還要對語言進行增進,使之更加適用於你的程式。在你編寫程式時,你會這麼想:「我希望
lisp
具有某某操作符。」於是你就去把它編寫出來。然後,你發現使用這樣乙個新的操作符會簡化程式其他部分的設計。語言和程式在一起演化。就像是位於兩個處在戰爭狀態國家的邊界一樣,語言和程式之間的邊界線不斷地重新劃分,直到最後停留在山川、河流區域――最適合於你的問題的乙個自然邊界。最後,你的程式看上去就像是使用專門為它設計的語言編寫的。當語言和程式相互非常匹配時,**也會變得更加的清晰、短小、高效。
值得強調的是,自底向上設計並不僅僅是一種以不同的順序編寫同乙個程式。當以自底向上方式工作時,通常得到的是乙個完全不同的程式。得到的不是乙個微控制器式的程式,而是乙個具有更多抽象操作符的、語義更為豐富的語言,以及乙個用該語言編寫的更短小的程式。不光得到了結果,你還得到了更強大的表達能力。
我們在編寫**時,一旦剝離出了那些僅僅做一些薄記工作的部分,剩餘的核心部分就會變得非常短小,我們把語言的抽象層次提得越高,從頂部到達它得距離就越短。這會帶來如下幾個好處:
1、通過使語言做更多的工作,自底向上設計所產生出的程式更加短小、更加敏捷。乙個短小的程式就不必再分割成很多的部分,而具有較少的部件則意味著程式將更加地易讀和修改。具有較少部分的程式也意味著部件之間具有更少的關聯,因此出錯的可能性就更少。正如乙個工業設計師努力減少機器內部中的運動部件的數量一樣,有經驗的
lisp
程式設計師也在使用自底向上設計來減少他們程式的規模和複雜性。 2、
自底向上設計鼓勵**重用。當你編寫了兩個或者更多的程式時,很多你為第乙個程式編寫的工具也會在後續的程式中發揮作用。一旦你具有了乙個大型的工具基礎庫,編寫乙個新程式所需要的工作量將會大大低於使用原始
lisp
所需要的。 3、
自底向上設計使得程式更加易讀。是乙個通用目的的操作符好理解呢,還是乙個針對特定領域的特定目的操作符好理解呢? 4、
自底向上設計有助於理清自己的設計思路,因為它會迫使你總是去尋找**中的模式。如果兩個不同的部件在形式上非常相似,你就會被引導去注意這些相似性,並且以一種更為簡單的方法去重新設計程式。
除了lisp
外,在其他程式語言中也可以在某種程度上實施自底向上設計。只要你看到了庫函式,在那裡就使用了自底向上設計。然而,
lisp
在這方面提供了更為寬廣的支援,
使之在以
lisp
風格程式設計方面達到了一種:
lisp
不僅僅是一種不同的語言,而是一種完全不同的程式設計方法的程度。
很顯然,這種開發風格更適合於小團隊開發。但是,它同時也延伸了乙個小團隊所能完成的任務的限制。在《人月神話》一書中,
frederick brooks
指出,程式設計師團隊的生產力不會隨著團隊的規模線性增長。當團隊的規模擴大時,個體程式設計師的生產力會下降。
lisp
程式設計的經驗則以一種更為令人振奮的方式表達了這一法則:隨著團隊規模的縮小,個體程式設計師的生產力會公升高。乙個小規模的團隊會取得成功,這只是因為它更小一些。當乙個小型團隊同時也掌控了
lisp
所使能的技術時,那麼它就會更為徹底地取得勝利。
自底向上設計
鄧輝 翻譯 長期以來,我們一直遵循這樣乙個程式設計風格方面的原則 乙個程式的功能要素不應該太大。如果程式中的某些部件的規模超出了易於理解的範圍,就會造成大量的複雜性,這些複雜性很容易隱藏錯誤,正如在乙個大城市中很容易隱藏罪惡一樣。這種程式難以理解 難以測試 難以除錯。根據這個原則,乙個大型程式必須要...
LISP自底向上設計
長期以來,我們一直遵循這樣乙個程式設計風格方面的原則 乙個程式的功能要素不應該太大。如果程式中的某些部件的規模超出了易於理解的範圍,就會造成大量的複雜性,這些複雜性很容易隱藏錯誤,正如在乙個大城市中很容易隱藏罪惡一樣。這種程式難以理解 難以測試 難以除錯。根據這個原則,乙個大型程式必須要分割成一些小...
自底向上 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...