05.24 聰明是代碼清晰的敵人

第一天

上帝看到人類發明了計算機,但一直在用匯編語言艱難地寫程序,很是傷心,就把編譯器的秘密告訴了約翰·巴科斯,讓他帶領大家寫出了編譯器,從此人類可以用高級語言寫程序,然後編譯成機器語言去運行了。

上帝還教會了人類使用順序、循環、分支這三種基本的程序結構來編寫程序。

人類很高興,寫的代碼越來越長。

第二天

但是人類經常寫下臭長臭長的代碼,然後把代碼Copy得到處都是。

上帝說:“要有函數!你們可以用函數把長長的代碼封裝起來,這樣就寫一次,就可以到處調用了。”

聰明是代碼清晰的敵人

人類又發現有些函數的參數太長, 記不住,調用層次深的時候讓人抓狂:

聰明是代碼清晰的敵人

上帝告訴Dennis Ritchie:“找個數據結構把參數組織起來,以後就傳遞這個數據結構!”

聰明是代碼清晰的敵人

上帝教導人類:程序 = 數據結構+算法

人類看到清爽的代碼,覺得很舒服。

第三天

有人寫了一個程序,用一個數據結構和函數實現了一個簡單的棧。

聰明是代碼清晰的敵人

上帝看到了,皺了皺眉頭,說道:“這個數據結構對外完全是不設防啊,不但自己的算法push,pop,top等可以操作,使用這個Stack的客戶也可以操作elements這樣的內部數據結構,可以獲取任意元素的值,而不僅僅是通過push,pop來操作。依照人類的本性,還不搞得天下大亂? 不好不好。”

上帝說:“要有Object!”

上帝把Alan Kay叫來,告訴他:要把數據和操作給結合起來,形成Objec,以後Object的屬性數據不允許直接訪問,只能通過這個Object的函數來操作。

聰明是代碼清晰的敵人

人類覺得Object大法好,創建了很多Object出來,讓他們互相調用。

第四天

上帝發現很多Object的方法都是相同的,他們被重複地放在一個個對象當中,太浪費了。

聰明是代碼清晰的敵人

上帝說:“要有Class!把這些重複的方法代碼從對象中剝離出來,放到一個公共的Class中! ”

人類問:“那我們怎麼把這些Object給創建起來?並且讓Object 和 Class關聯?”

上帝說:“可以用new 這個關鍵字: Stack object1 = new Stack(); ”

聰明是代碼清晰的敵人

Stack類的函數定義只有一份,但是Stack類生成的Object有很多份。

人類在寫push()函數,pop()函數的時候,要操作Object的數據, 到底操作的是哪一個Object?

上帝說:“ 要有this !”

每次調用函數的時候,可以把要操作的Object作為一個隱藏的參數傳遞進去。例如void push(int data),真正在調用的時候是這樣的:void push(Stack this, int data)。

有個叫Guido的說:“我能不能把this改成 self ? ”

上帝說:“隨你嘍!”

還有人說:“這不又回到我們原始的狀態去了嗎? void push(Stack *s,int data)”

上帝告誡說:“雖然本質相同,但是表達形式不同,之前你在語法層面必須傳遞一個Stack 對象到函數,現在在語法層面不用加了。我會在編譯後的代碼,或者運行時自動給你們加上。”

Guido說:“我還是喜歡把self加到方法上!”

上帝沒有說話,應該是默認了。

第五天

人類創建了很多很多的Class,上帝發現有些Class包含了類似的功能,還是有重複代碼。

上帝說:“要有繼承!把那些類似的、重複代碼放到父類當中去,這樣子類就可以直接使用,不用重新再寫一遍了。”

聰明是代碼清晰的敵人

上帝又說:“要有多態!就是對同一個接口,使用不同的實例而執行不同操作。”

Person p = new Employee();

p.funcB() // 執行Employee類的funcB()方法,而不是Person類的funcB()方法

人類看到繼承的好處,開始瘋狂使用。

支持單繼承和支持多繼承的兩派人還發起了多次戰爭。

上帝非常擔心,他告誡人類:“繼承其實是破壞了封裝性,父類的很多細節對子類都是可見的,父類的變化可能會極大地影響子類。”

人類不知道怎麼辦。

“你們要記住一條: 優先使用組合而不是繼承。” 看到人類並不太懂,上帝叫來了Freeman , 告訴他一個“鴨子游戲”的例子,後來Freeman把這個例子寫到了一本書裡,這本書叫做《Head First 設計模式》。

“還有一條,” 上帝補充到,“面向接口編程,而不是實現編程。”

人類還是不懂,上帝叫來了Eric Gamma ,告訴他在面向對象設計和編程中要注意的23種通用模式, 讓他和另外三個人寫了一本書《設計模式:可複用面向對象軟件的基礎》,但是大家都說看不懂。

第六天

人類使用了繼承和多態,理解了設計模式,但是代碼還是一團糟。

上帝說:“編程的關鍵是要抽象啊!你們得把系統需求抽象成高層的概念,然後在概念層次進行編程。”

這句話本身就很抽象。

有大牛學會了,寫出了很多優秀的軟件。

大部分人表示學不會。

上帝也沒有辦法, 只是有點後悔,教了人類太多的東西, 而人類又不能完全掌握。

上帝一直在思考,要不還是讓人類回到機器語言編程時代?

或者創造一種智能的機器來替代人類編程?

第七天

上帝覺得累壞了,就休息了,程序員們也休息了一天。

這就是星期天的來歷。

來源:https://mp.weixin.qq.com/s/DZyn2w6ci86qt73gIJjzqA


分享到:


相關文章: