你見過的代碼漂亮到什麼程度?

IT多巴胺


人有外表皮囊與內在心靈,反應了某種思想。而算法,通過具體的代碼來實現。代碼的美在於有兩點:外在風格的統一,內斂的精緻。


風格

代碼風格要統一,正如人有環肥燕瘦,代碼風格也有多種,統一就行。有一句話這麼說過:

肉體是拿來用的,不是拿來伺候的

代碼風格也一樣,不是用來阻礙我們寫代碼的,而是幫助我們交流的。編程語言無論是C++、Java還是Python,有很多開源的代碼格式化工具或插件,並且支持配置,想要哪種配置自己選就行。

和人不同,人可能需要花時間化妝、打扮自己的皮囊,而代碼的風格是可以做到自動化的,從vim/emacs/vscode,甚至python官方都提供了一套官方標準、autopep8工具、更有pylint打分工具,我們要做的就是配置好自己的編程環境,使用這些工具讓你的代碼自動遵循某種風格。


精緻

如果說代碼風格比較死板統一,而內斂的精緻,更佳體現了一個程序員的職業水準。你看leetcode上的同一道題,有多種算法,即使同一種算法,不同的人,寫出的代碼也不相同。有的囉裡囉唆,煩冗累贅,而大神,比如光頭哥的代碼,相當精簡,看了之後,就會有一種一覽眾山小的感覺。


最近在看排序算法,下面的快排和歸併排序,都在10幾行以內實現,我覺得本身每個代碼塊都很精簡。兩者在一起對比,都是分治遞歸的思想,分解、解決、合併。兩者在一起看,更體現一種和諧、說不出來的美。


最後總結:花時間弄懂算法的本質,精緻實現算法。而不是玩弄各種酷炫的風格。




平凡科技


不同程序員

寫代碼確實有很大的水平差異,代碼格式、算法優劣,這些都能夠反應一個人的代碼水平,我就記得學生時代有個同學,他寫的前端代碼就是要比我們都寫得好一些,寫出來的界面也更美觀和合理一些,這就屬於天賦。今天就說三段代碼吧,這三段代碼真的是我覺得非常有意義的代碼,或者說我認為很漂亮。

王垠的40行代碼

王垠這個人,這兩年想必大家聽得比較少了,不過至少在我讀書那個年代,是聽到過不少的故事的,作為一個CS專業的科班生,我自己也算是驕傲的,但是不得不說王垠確實還是讓我很佩服,得承認王垠確實是個很有才華的人,甚至可以說他在這個行業算是一個天才,也是因為性格的原因,他沒能取得什麼代表性的學術成就和工業成就。

王垠這幾行代碼,說實話作為一個半吊子的Lisp和Scheme函數式編程業餘愛好者,我大多數時間也只是用Emacs寫C/C++代碼而已,不太可能用太多時間來學習函數式編程,不過用我僅有的一點知識來看,王垠這段代碼確實還是很出色的,我甚至認為王垠厲害之處不在於他精妙地實現了CPS算法,而是他的思維能力確實不錯。

去年王垠去了阿里面試,是曾經在Facebook工作過的趙海平親自面試,大家也都知道趙海平在阿里的職級是P10,面試之後王垠對於趙海平頗有微詞,甚至上升到了對阿里的不滿,這次面試不光是鬧得不慌而散,最終還嫌棄了一番熱議,後來趙海平還親自出來解釋。

vi寫下第一行可視“Hello World”

想必大家都知道肯湯普森,就是和丹尼斯里奇一起開發了C語言和Unix系統的那位大神,可以說肯湯普森是我們這個行業的祖師爺了。

那時候沒有可視化的環境,老爺子也沒能給Unix打造一個可視化的開發工具,後來老爺子回到自己的母校加州大學伯克利分校,他還在那裡開了課,在機房閒逛的時候,老爺子隨手寫了一個Pascal編譯器,不過因為時間緊確實不太完善,一個叫做Bill Joy的學生髮現了這個編譯器的問題,他就著手想把這個編譯器改好。

改這個編譯器,那時候也沒有可視化IDE繼承開發環境,Bill Joy同樣用的是老爺子寫的EX編輯器,很快他就把這個Pascal編譯器改好了,改好了之後深受伯克利學生喜歡,不過他開始對ex編輯器不滿了,於是他就給ex編輯器加了可視化模式,這個編輯器一直演化,最終也就成為了現在的vi編輯器,後來發展成Vim已經很完善了,Vim是跟Emacs齊名的文本編輯器。

Google C++ Style

每一個程序員都應該養成好的代碼習慣,《代碼大全》、《編程珠璣》、《代碼之美》等等這些都是幫你養成好的代碼習慣的書籍,還有些大名鼎鼎的《C陷阱》、《Effective Java》等書籍,這些書籍又能夠幫助你很好的規避開發風險。

除了這些之外,我覺得Google C++ Style是每一個程序員都應該看的,Google的C++代碼規範可以說是目前為止全行業最好的工業代碼規範,是Google多年來C++大廠工業實踐留下的精華,基本上該注意的,能夠迴避的坑基本上都幫你解決掉了。一個優秀的程序員,你的代碼一定要是可維護的,可讀性還要高,Google C++代碼規範能夠很好的幫你養成好的代碼習慣。

在我看來程序員不管是從事科研還是立足於工業,都應該有一個原則,那就是寫有價值的代碼,不管是做學術產品還是做工業產品,儘可能為你寫過的代碼負責,要寫可維護的代碼,保障你寫過的代碼是可讀性很高的,這樣的代碼才是真正漂亮的代碼。


本文為作者EmacserVimer悟空問答原創文章,未經允許轉載、抄襲必究!

EmacserVimer


這樣漂亮嗎



白菜大叔傻乎乎


一個具有十多年經驗的老碼農來強答一下:


很多朋友發的答案看起來很酷炫,但那些都是逗樂的,並無實際應用價值、甚至在實際的項目是都是有百害而無一益的代碼。


各種語言的代碼觀感肯定是不一樣的,但我認為美的代碼的標準應該是共通的。漂亮的代碼應該是整潔乾淨、樸實易讀的,代碼不僅在命名、排版方面要做到最好,同時在健壯性上也應該毫不妥協,有能力處理各種異常情況,能經受住時間的考驗。


我個人見過實際生產代碼中最漂亮的應該是開源的 PostgreSQL 數據庫的源代碼,排版編寫上完全符合整潔、易讀的要求,同時作為數據庫系統,健壯性也是其存在價值的根本需求。


下面截取幾段給大家欣賞:




命叔炸機


當年見到王垠的40行CPS代碼確實是被其優美所震撼:

另外,Scheme 作為 編程語言中的皇后,其代碼本身就是 極度漂亮了的,在加上 組合子的 邏輯,就可以得到極致優美的代碼:

附上組合子的測試代碼:

當然,那些基於《λ-演算》用於構造 計算機語言的代碼也是極度優美的,例如:

最後,Scheme 中 還有很多 堪稱經典的 優美代碼,有興趣大家可以自行百度,這裡就不一一枚舉了。


思考思考的動物


個人覺得漂亮的代碼主要是結構明瞭,註釋比較清晰明瞭。讓別人看了,心裡舒服,而不是亂糟糟的。 我這裡截取了一段python的代碼。他以代碼簡短,而且縮進有序。整段代碼看起來非常規整。相比於其他編程語言,他更在意的是代碼的規整長度。因此他的閱讀性是最好的。



義縣遊學電子科技


這是著名“心形線”java代碼

百歲山的廣告看過吧!可能很多人並沒有看懂。我來普及一下。

講的是52歲的笛卡爾和18歲的瑞典公主克里斯丁的忘年愛情故事。笛卡爾是克里斯丁的數學老師,他們在相處的過程中,慢慢產生了感情。公主的父親發現了以後大怒,將笛卡爾流放回法國。回國以後的笛卡爾每天給公主都寫信,但是一直沒有得到公主的回信。笛卡爾寫給公主的最後一封信只有一個公式。這就是數學界著名的“心形線”

r=a(1-sinθ)


阿邁達聊技術


這是一個心型代碼:

#include <mathr.h>

#include <stdio.h>

int main ()

{

float y , x , a ;

for ( x=-1.5f ; x<1.5f ; x+0.05f)

{

a=x*x+y*y-1;

putchar (a*a*a-x*x*y*y*y<=0.0f ?'*' ; '' );

}

putchar('\\n');

}

return 0 ;

}


唯美橘子君


直接看圖吧,學C/C++的標誌define

粘貼過來代碼比較凌亂:

//RGB 色彩轉換

#define RGB(r,g,b) (((r)&0xff)|(((g)&0xff)<<8)|(((b)&0xff)<<16))

//ARGB 色彩轉換

#define ARGB(a,r,g,b) (((r)&0xff)|(((g)&0xff)<<8)|(((b)&0xff)<<16)|(((a)&0xff)<<24))

#include<math.h>

//三維座標轉二維座標X

#define D3TOD2X(x,y,z) (int)(x+y/2.0*cos(atan2(1.0,1.0)))

//三維座標轉二維座標Y

#define D3TOD2Y(x,y,z) (int)(z+y/2.0*sin(atan2(1.0,1.0)))

//三維座標轉換為二維座標X,Y

#define D3TOD2XY(x,y,z) (int)(x+y/2.0*cos(atan2(1.0,1.0))),(int)(z+y/2.0*sin(atan2(1.0,1.0)))

//獲取空間兩確定直線的向量

#define VECTORLINE(x1,y1,z1,x2,y2,z2) \t(int)(x2-x1), \t(int)(y2-y1), \t(int)(z2-z1)

//獲取空間平面的法向量

#define NORMALLINE(x1,y1,z1,x2,y2,z2) \t(int)(y1*z2 - y2*z1), (int)(x1*z2 - x2*z1), (int)(x1*y2 - x2*y1)

//獲取空間向量的夾角

#define VECTORCOS(x1,y1,z1,x2,y2,z2) \t((x1*x2 + y1*y2 + z1*z2)*1.0 /\t(sqrt(pow(x1, 2.0)+pow(y1, 2.0)+pow(z1, 2.0))*sqrt(pow(x2, 2.0)+pow(y2, 2.0)+ pow(z2, 2.0))))

//為類成員變量自動添加get和set方法

#define CLASSVALUE(ctype,vtype,name) \tctype vtype name; public: \tvoid set##name(vtype elem){this.##name=elem;} vtype get##name(){return this.##name;}



Ice2Faith


Haskell的快排.



分享到:


相關文章: