Golang 設(shè)計(jì)哲學(xué)

原文:http://blog.csdn.net/hittata/article/details/43668569

這是一篇轉(zhuǎn)載,沒有通知原作者就轉(zhuǎn)載了。如果有需要,可與我聯(lián)系,刪除這篇轉(zhuǎn)載。轉(zhuǎn)載時(shí)修改了一下格式和一些明顯的筆誤。


世界是并行的——先不說宇宙,就整個(gè)地球來說,世界萬物都是并行發(fā)生的;天生對并發(fā)支持良好的 go 語言更容易描述并行的世界;

世界是由物質(zhì)組合構(gòu)成的——微觀世界:由小的粒子組合成大的粒子;宏觀世界:由小的物體組合成大的物體;繼承只能描述現(xiàn)實(shí)世界的一小部分,使用繼承是不全面的;go 的設(shè)計(jì)選擇的是組合,這個(gè)和現(xiàn)實(shí)世界比較吻合的設(shè)計(jì),表現(xiàn)力更強(qiáng);

世界是標(biāo)準(zhǔn)化的——隨著生產(chǎn)力的發(fā)展,社會(huì)分工越來與詳細(xì),越來越多行業(yè)有了國際標(biāo)準(zhǔn),任何一個(gè)國家的、任何一個(gè)公司只要按照這個(gè)標(biāo)準(zhǔn)生產(chǎn)器件,就能裝配到一臺(tái)機(jī)器上;IBM/PC 就是硬件模塊化和接口化一個(gè)最成功的例證;軟件也可如此,go 的接口是 duck 模型,面向接口編程,而不需要顯示的聲明,將語言能做的事情交給語言做;

正交性——幾何上的正交指的是兩個(gè)向量垂直關(guān)系,一個(gè)向量在另一個(gè)向量方向的投影是一個(gè)點(diǎn);現(xiàn)實(shí)中的正交是指多個(gè)因素,一個(gè)發(fā)生變化,不會(huì)影響其他的因素;在不減少表現(xiàn)力的情況下,正交是保持事物穩(wěn)定性和簡單性的最好設(shè)計(jì);go 很好的遵循了這個(gè)規(guī)律,go的多個(gè)特性之間都是正交的:goroutine、接口、組合、類型系統(tǒng)等;舉一個(gè)典型的正交設(shè)計(jì)例子:比如客戶嫌雨傘太小,單純的加長傘桿是不行的,這會(huì)增加雨傘的長度;最后計(jì)出折疊式的雨傘;這種設(shè)計(jì)能保證雨傘大小和雨傘長度滿足正交關(guān)系,當(dāng)然這會(huì)增加雨傘生產(chǎn)的復(fù)雜性)把復(fù)雜性留給廠家,把便利性留給客戶;對于編程語言:盡量把復(fù)雜性留給語言實(shí)現(xiàn)者和編譯器,把簡單性留給語言使用者,這才是一種好的語言;

少即是多——沒有萬能的語言,換句話說一門語言不可能包含所有的特性;想囊括所有特性的語言一定是非常的復(fù)雜(C++);保持簡單性的方法就是:每種特性僅提供一種方法,減少重復(fù)、冗余,試想一下,如果汽車有多個(gè)剎車板,你會(huì)感覺更安全,更便利嗎?只提供一種方法做事情,把事情做到極致,這就是 go 的原則,解放程序員,不要給他提供很多雷同的功能和語句,這不會(huì)使問題簡單,只會(huì)加重程序員的心智負(fù)擔(dān)。

二八定律——在編程語言中描述就:百分之八十的代碼僅僅使用到百分之二十的語言特性,增加語言特性,并不能保證開發(fā)效率的提升,原因是它會(huì)增加復(fù)雜性,導(dǎo)致更容易犯錯(cuò);有些復(fù)雜的編程問題其實(shí)可以通過庫的形式來輔助支持;大部分異常與錯(cuò)誤——所謂異常就是沒有預(yù)料到的非期望的事情發(fā)生了,所謂錯(cuò)誤就是預(yù)料到的非期望的事情發(fā)生了;go 語言把兩種情況終于給分清楚了;什么是防御性編程,怎么保持程序的健壯性;每次調(diào)用都檢查 error 確實(shí)讓代碼挺不美觀的,個(gè)人認(rèn)為為了健壯性,進(jìn)行防御性的編程也是可以接受的;通過一定的技巧是可以避免錯(cuò)誤代碼冗余性;

論述完普世定律后,我來總結(jié)一下GO語言的哲學(xué):

  1. 面向接口編程
  2. 使用組合的編程
  3. 正交性:語言設(shè)計(jì)的正交性,保證語言的穩(wěn)定性和簡單性
  4. 少即是多:有且僅有一種方法把事情做好做對
  5. 并發(fā)語言層面支持:并發(fā)更好利用多核,有更強(qiáng)的表現(xiàn)力來模擬真實(shí)世界
  6. 開放性:開源,語言的實(shí)現(xiàn)對程序員不是個(gè)黑盒子,任何想了解語言實(shí)現(xiàn)的人都可以參與進(jìn)來

go 沒有像 JAVA 一樣,宗教式的完全面向?qū)ο笤O(shè)計(jì);完全面向?qū)ο笤O(shè)計(jì)就是一刀切的宗教式的設(shè)計(jì),但其并不能很好的表述這個(gè)世界,這就導(dǎo)致其表現(xiàn)力不足,最后通過設(shè)計(jì)模式和面向切面等設(shè)計(jì)技巧來彌補(bǔ)語言方面的缺陷;go是面向工程的實(shí)用主義者,其糅合了面向?qū)ο蟮脑O(shè)計(jì),函數(shù)式設(shè)計(jì)和過程式設(shè)計(jì)的優(yōu)點(diǎn);原來通過各種設(shè)計(jì)模式的設(shè)計(jì)通過函數(shù)、接口、組合等簡單方式就搞定了;go 有更多膠水的東西比如:全局變量、常量,函數(shù),閉包等等,可以輕松的的把模塊銜接和驅(qū)動(dòng)起來; JAVA 就好比:手里握著是錘子,看什么都是釘子,什么都是類的對象,這個(gè)和現(xiàn)實(shí)世界不符,類表示單個(gè)事物還可以,一旦表示多個(gè)事物及其交互,其表現(xiàn)力也就會(huì)遇到各種挑戰(zhàn)。

是時(shí)候該轉(zhuǎn)變觀念了,不要?jiǎng)硬粍?dòng)就提面向?qū)ο笤O(shè)計(jì),動(dòng)不動(dòng)就提設(shè)計(jì)模式(特指某些招聘偽專家);編程的世界是多樣的,編程思想和范式是豐富多彩的,不要再沿著錯(cuò)誤的路線繼續(xù)前進(jìn)了,擁抱 go 吧。


原文發(fā)表于 2015 年 2 月,作者 @liwenta。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容