開源代碼里某個函數很長,這種代碼能否認為是好的?
經常看到開源代碼中有很多函數非常長,五六百行的隨處可見,1000多行的也有,這些開源代碼的作者的能力不必質疑,只是,這種代碼與我想像中的「好代碼」還是有些差距的,我相信作者這樣寫應該是有其原因的:
1)邏輯本身比較複雜,像我看得一個網路類程序,有些結構體甚至都有幾十上百行。2)基於程序運行效率的考慮,對於有些每秒要調用成百上千次的函數,或許能提高運行速度。
一個妹子的腿很長,這種妹子能否認為是漂亮的?
對於這種問題,我們一般會回答:
You say a JB without pictures
這個問題同理。好代碼是不能通過這種量化的指標來判斷的,判斷一個代碼是否好的唯一標準是,將來需求真的會改 改的時候會很容易。
這個世界上到處都有那些函數超過幾個屏幕,但是卻邏輯清晰無比好改的例子。譬如說寫個自動機。
再說了,為什麼要用函數作為單位?這個選擇其實是沒有道理的,既不基於統計結果,也不基於經驗。
只要不復用寫長一點就長一點。
可能是因為歷史遺留問題吧。很多開源軟體已經十幾年乃至更長的歷史了。這麼多年積累下來,難免會有你說的這種問題。這些代碼工作比較正常的話,重構的成本會比較高,作者一般會傾向於維持現狀吧。
很長的函數,如果不是簡單的結構,如順序結構,就是垃圾代碼。這與開源不開源無關。
從可維護性上來說真的應該算是爛的。
理由很簡單,業務邏輯簡單,順序執行要寫上一千多行,說明丫還不夠聰明。
邏輯複雜寫了一千多行,過半年有注釋自己都懶得看。萬一有必要修改,那也絕對是個痛苦的過程。說明丫不懂得給自己留後路,丫依舊不夠聰明。
上面告訴你不一定的蜀黍都是在傲嬌,他們智商高到神馬程序都能迅速看懂。如果題主覺得自己智商一般的話千萬記得控制一段邏輯的長度,不然一定會有人詛咒你的(可能會是半年後的你自己哦)。這是飽含血淚的教訓,我已經詛咒了十幾個人了。。。。
看作者。如果作者是你,或者是我,就可以痛批。如果作者碰巧是卡特勒、林納斯等,那就是你要被噴了。
「結構體」長和「函數」長是不可以類比的。前者是表達一個對象具有豐富的屬性,而後者是表達一個相對較長和複雜的Workflow。一般來說一個類的結構可以很長,但是它的每個方法可以很短。
至於節省調用次數的問題,我覺得那相比於開發效率和可維護性都是很次要的因素。是否獨立出一個子函數,關鍵取決於這個子函數有沒有獨立的邏輯流、會不會被複用等。
重視代碼結構的人大多都希望代碼是高度模塊化的,每個模塊(主要是對象的函數/方法)體量都小,功能單一,且互不依賴。
但現實很骨感,許多問題里,一個基本操作的邏輯流程已經非常瑣碎,且不適合拓展新的子模塊,導致模塊不得不寫得比較長。這時為便於理解和維護,只好對模塊內的代碼分段落並書寫注釋(包括一些Invariants和Assertion)。不好。管它作者多牛。代碼的好或不好,可以有多個方面或角度可評議。(就算編程語言好不好,至少可以從是否有利於寫程序時人的高效,和是否有利於寫出的程序運行效率高不高這兩個角度。)
演算法合適,數據結構合理,沒花多餘時間就搞定還沒有BUG,是作者編程能力好的體現之一。但若代碼風格好不好,不利於人看懂,不利於未來改變,不利於復用,並且作者寫所有代碼都這德性,他又是超級大牛,那我只能這樣為他找借口:一,確實有些代碼是根本性能要求第一的,一堆小函數間數據傳遞接受不了。二,確實有些代碼是現實中沒幾個人可以幫忙搞的代碼背後的邏輯太難或太精妙,,一開源就要終身負責搞到底,本作者要怎樣就怎樣了。原因可以是代碼背後的邏輯太高深,太專業,或者太平凡無趣,別人看不看無所謂,甚至自己也不不用去理它。只要一個軟體需要給人用,不管收不收錢,開不開源,就是程序員的一件任務。就會有人的因素在裡面。再牛的人也會有可能在進度要求下搞出一大堆,然後沒時間或沒機會改進。。。不好。如果函數功能簡單,就不該搞出這麼長的代碼。如果函數功能複雜,就該分多個子函數。即使子函數本身不會被其他模塊服用,至少容易閱讀和測試。
「這些開源代碼的作者的能力不必質疑」,這句話本身就是存疑的,作者的「能力」,你指的是那種能力呢?
比如我比較熟悉的ffmpeg庫,這個庫是集合了一群在視音頻領域的科學家和計算機科學領域的優秀工程師的努力而成的。作者的科研和學術能力不用質疑,但是如果放在一個企業可維護便於修改的角度去看這個庫,那這個庫就很糟糕了。何況這個開源庫包括很多其他庫 壓根也沒想給你修改的機會,那從軟體可維護的角度看,你怎麼能說這個庫是「不必質疑」的呢?
開源庫本身就是任何人都可check out可改的,根本沒有一個深入的工業級代碼檢查和審核過程。就算作者個人能力不必質疑,庫代碼本身的質量你能保證每一個都是「不必質疑」的嘛?
最後,不要質疑你們企業或者大學老師說的一個函數超過一千行必須考慮封裝和功能拆分,這對於企業長久發展很有利的,當然,你如果不想被裁員,你把你自己的函數寫一萬行最好!!推薦閱讀:
※64 位系統中 long double 的最大值是多少?
※有哪些適合學習的開源項目?
※學c語言該怎麼入門?
※如何查看大型工程的源代碼?
※既然編譯器是一個軟體,那它是如何編譯自己的?