作者:劉欣
公眾號:碼農翻身
ID:coderising
上帝看到人類發明瞭計算機,但一直在用組合語言艱難地寫程式,很是傷心,就把編譯器的秘密告訴了約翰·巴科斯,讓他帶領大家寫出了編譯器,從此人類可以用高階語言寫程式,然後編譯成機器語言去運行了。
上帝還教會了人類使用順序、迴圈、分支這三種基本的程式結構來編寫程式。
人類很高興,寫的程式碼越來越長。
但是人類經常寫下臭長臭長的程式碼,然後把程式碼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種通用樣式, 讓他和另外三個人寫了一本書《設計樣式:可復用面向物件軟體的基礎》,但是大家都說看不懂。
人類使用了繼承和多型,理解了設計樣式,但是程式碼還是一團糟。
上帝說:“程式設計的關鍵是要抽象啊!你們得把系統需求抽象成高層的概念,然後在概念層次進行程式設計。”
這句話本身就很抽象。
有大牛學會了,寫出了很多優秀的軟體。
大部分人表示學不會。
上帝也沒有辦法, 只是有點後悔,教了人類太多的東西, 而人類又不能完全掌握。
上帝一直在思考,要不還是讓人類回到機器語言程式設計時代?
或者創造一種智慧的機器來替代人類程式設計?
上帝覺得累壞了,就休息了,程式員們也休息了一天。
這就是星期天的來歷。
出場人物:
約翰·巴科斯 : 電腦科學先驅之一、FORTRAN之父、1977年圖靈獎得主、BNF(巴克斯-諾爾正規化)的發明者之一。
Dennis Ritchie: C語言之父,Unix的創造者之一。
Guido van Rossum:Python之父。
Eric Freeman:《Head First 設計樣式》作者之一。
Eric Gamma:《設計樣式》作者之一,主要作品:JUnit,Eclipse JDT,Jazz, Visual Studio Code。
作者:劉欣
來源:http://mp.weixin.qq.com/s/DZyn2w6ci86qt73gIJjzqA
《Python人工智慧和全棧開發》2018年07月23日即將在北京開課,120天衝擊Python年薪30萬,改變速約~~~~
*宣告:推送內容及圖片來源於網路,部分內容會有所改動,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。
– END –
更多Python好文請點選【閱讀原文】哦
↓↓↓