原文:http://blog.csdn.net/hittata/article/details/43668569
這是一篇轉(zhuǎn)載闻葵,沒有通知原作者就轉(zhuǎn)載了赠摇。如果有需要掷倔,可與我聯(lián)系戴而,刪除這篇轉(zhuǎn)載苹熏。轉(zhuǎn)載時修改了一下格式和一些明顯的筆誤呻畸。
世界是并行的——先不說宇宙移盆,就整個地球來說,世界萬物都是并行發(fā)生的伤为;天生對并發(fā)支持良好的 go 語言更容易描述并行的世界咒循;
世界是由物質(zhì)組合構(gòu)成的——微觀世界:由小的粒子組合成大的粒子据途;宏觀世界:由小的物體組合成大的物體;繼承只能描述現(xiàn)實(shí)世界的一小部分叙甸,使用繼承是不全面的颖医;go 的設(shè)計(jì)選擇的是組合,這個和現(xiàn)實(shí)世界比較吻合的設(shè)計(jì)裆蒸,表現(xiàn)力更強(qiáng)熔萧;
世界是標(biāo)準(zhǔn)化的——隨著生產(chǎn)力的發(fā)展,社會分工越來與詳細(xì)僚祷,越來越多行業(yè)有了國際標(biāo)準(zhǔn)佛致,任何一個國家的、任何一個公司只要按照這個標(biāo)準(zhǔn)生產(chǎn)器件辙谜,就能裝配到一臺機(jī)器上俺榆;IBM/PC 就是硬件模塊化和接口化一個最成功的例證;軟件也可如此筷弦,go 的接口是 duck 模型肋演,面向接口編程,而不需要顯示的聲明烂琴,將語言能做的事情交給語言做爹殊;
正交性——幾何上的正交指的是兩個向量垂直關(guān)系,一個向量在另一個向量方向的投影是一個點(diǎn)奸绷;現(xiàn)實(shí)中的正交是指多個因素梗夸,一個發(fā)生變化,不會影響其他的因素号醉;在不減少表現(xiàn)力的情況下反症,正交是保持事物穩(wěn)定性和簡單性的最好設(shè)計(jì);go 很好的遵循了這個規(guī)律畔派,go的多個特性之間都是正交的:goroutine铅碍、接口、組合线椰、類型系統(tǒng)等胞谈;舉一個典型的正交設(shè)計(jì)例子:比如客戶嫌雨傘太小,單純的加長傘桿是不行的憨愉,這會增加雨傘的長度烦绳;最后計(jì)出折疊式的雨傘;這種設(shè)計(jì)能保證雨傘大小和雨傘長度滿足正交關(guān)系配紫,當(dāng)然這會增加雨傘生產(chǎn)的復(fù)雜性)把復(fù)雜性留給廠家径密,把便利性留給客戶;對于編程語言:盡量把復(fù)雜性留給語言實(shí)現(xiàn)者和編譯器躺孝,把簡單性留給語言使用者享扔,這才是一種好的語言底桂;
少即是多——沒有萬能的語言,換句話說一門語言不可能包含所有的特性惧眠;想囊括所有特性的語言一定是非常的復(fù)雜(C++);保持簡單性的方法就是:每種特性僅提供一種方法戚啥,減少重復(fù)、冗余锉试,試想一下,如果汽車有多個剎車板览濒,你會感覺更安全呆盖,更便利嗎?只提供一種方法做事情贷笛,把事情做到極致应又,這就是 go 的原則,解放程序員乏苦,不要給他提供很多雷同的功能和語句株扛,這不會使問題簡單,只會加重程序員的心智負(fù)擔(dān)汇荐。
二八定律——在編程語言中描述就:百分之八十的代碼僅僅使用到百分之二十的語言特性洞就,增加語言特性,并不能保證開發(fā)效率的提升掀淘,原因是它會增加復(fù)雜性旬蟋,導(dǎo)致更容易犯錯;有些復(fù)雜的編程問題其實(shí)可以通過庫的形式來輔助支持革娄;大部分異常與錯誤——所謂異常就是沒有預(yù)料到的非期望的事情發(fā)生了倾贰,所謂錯誤就是預(yù)料到的非期望的事情發(fā)生了;go 語言把兩種情況終于給分清楚了拦惋;什么是防御性編程匆浙,怎么保持程序的健壯性;每次調(diào)用都檢查 error 確實(shí)讓代碼挺不美觀的厕妖,個人認(rèn)為為了健壯性首尼,進(jìn)行防御性的編程也是可以接受的;通過一定的技巧是可以避免錯誤代碼冗余性叹放;
論述完普世定律后饰恕,我來總結(jié)一下GO語言的哲學(xué):
- 面向接口編程
- 使用組合的編程
- 正交性:語言設(shè)計(jì)的正交性,保證語言的穩(wěn)定性和簡單性
- 少即是多:有且僅有一種方法把事情做好做對
- 并發(fā)語言層面支持:并發(fā)更好利用多核井仰,有更強(qiáng)的表現(xiàn)力來模擬真實(shí)世界
- 開放性:開源埋嵌,語言的實(shí)現(xiàn)對程序員不是個黑盒子,任何想了解語言實(shí)現(xiàn)的人都可以參與進(jìn)來
go 沒有像 JAVA 一樣俱恶,宗教式的完全面向?qū)ο笤O(shè)計(jì)雹嗦;完全面向?qū)ο笤O(shè)計(jì)就是一刀切的宗教式的設(shè)計(jì)范舀,但其并不能很好的表述這個世界,這就導(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ū)動起來悦屏; JAVA 就好比:手里握著是錘子节沦,看什么都是釘子,什么都是類的對象础爬,這個和現(xiàn)實(shí)世界不符甫贯,類表示單個事物還可以,一旦表示多個事物及其交互看蚜,其表現(xiàn)力也就會遇到各種挑戰(zhàn)获搏。
是時候該轉(zhuǎn)變觀念了,不要動不動就提面向?qū)ο笤O(shè)計(jì)失乾,動不動就提設(shè)計(jì)模式(特指某些招聘偽專家)常熙;編程的世界是多樣的,編程思想和范式是豐富多彩的碱茁,不要再沿著錯誤的路線繼續(xù)前進(jìn)了裸卫,擁抱 go 吧。
原文發(fā)表于 2015 年 2 月纽竣,作者 @liwenta墓贿。