Re: [請益] 寫註解到底是不是好習慣
先說結論:註解必須寫,除非 code 太過簡單。
我不相信有「看得懂的命名」這東西。
哪怕是我現在全部寫中文,發到網路上,
只要字數多到一個程度,就會有一堆人看不懂中文表達的意思。
更不用說是程式碼。
連命名都看不懂,就更要花大量的時間去釐清整個 code 的邏輯才看得懂「寫什麼」。
看懂寫什麼之後,更重要的是看懂「為什麼」這樣寫。
而註解,就是一個省下看得懂「寫什麼」跟「為什麼」時間的好東西。
然而,會議跟文件是碼農最大的敵人,
在某種程度上,註解也是。
所以註解,在精不在多,在關鍵不在詳細。
註解和 code 是完全相依的,
如果註解既繁且雜沒重點,那基本上 code 是垃圾的可能性很高。
善於寫 code 的人,要鍛練自己寫註解的能力。
最好別人不用去 trace code,只要看一遍註解,就可以接手。
所以好的註解,可以引導別人的思路,就跟寫小說一樣。
---
這就又回到如何寫 code 的命題,這裡舉個例,
每個人習慣不一樣,所以姑且參考。
我個人很喜歡 if,但非常討厭 else。
if 是可控的,else 不可控,思慮再慎密的人,都會敗在 else。
透過許多可控的 if,邏輯一脈相承,註解寫起來就非常輕鬆,
只要解釋為什麼我要用這些 if,跟這些 if 在做什麼事。
也許 if 太多很難看,把許多 if 精簡後變成短短幾行看起來非常炫,
但對於要理解 code 的人來說,反而是要在大腦裡把這短短幾行,
拆開並還原成所有的 if 條件,再去逐一理解--浪費時間又容易錯。
把 if 歸納成 function 之後,對我來說沒有什麼功能是三個 block 無法說明的。
// if ..., do ...
case -> if -> handling
畫成 block diagram 就是一個唬弄客戶跟長官的好東西。
好吧這是題外話XD
也許寫完這個功能要數百行 code,但註解可能就十幾行。
解釋一下「寫什麼」(do) 跟「為什麼」(if) 就好。
如果註解寫成這樣
code .... code ... code ... // comment
在一行 code 後面還要註解這行在幹什麼,基本上就是一種失敗,
因為這表示別人連這一行 code 都得靠註解才看得懂。
失敗的不是註解,是 code 寫太爛。
--
ps1.
我年輕時喜歡弄一堆漂亮的 block diagram,
什麼 function flow, data flow 的,
現在我認為那都是屎。
程式架構應該是只要一張表格加上代碼本身自帶的註解就足夠讓人了解了。
--
ps2.
我絕對沒有在婊 Linux kernel 架構圖的意思,
畢竟好的架構圖絕對是有助於了解整體程式碼結構的。
--
ps3.
寫 comment 的時候,把對象想像成一隻猴子有益無害。
--
ps4.
這篇寫到後來本來覺得煩想刪掉,
但想想辛苦寫了這麼久,還是賺個p幣好了。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.127.94.119
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1546008917.A.C92.html
推
12/28 23:04,
5年前
, 1F
12/28 23:04, 1F
→
12/28 23:04,
5年前
, 2F
12/28 23:04, 2F
→
12/29 04:44,
5年前
, 3F
12/29 04:44, 3F
→
12/29 04:44,
5年前
, 4F
12/29 04:44, 4F
→
12/29 04:44,
5年前
, 5F
12/29 04:44, 5F
可惜隨著功能愈來愈強大,程式碼自然就愈趨複雜。
把複雜的 module,拆分成獨立 tiny module,每個 module 都變得精簡,
這樣增加了可讀性、重複利用性、可維護性,是工程師該做的。
但其實沒有把 code 變得簡單,只是把一個 function 能做的事,
變成一堆 function 合起來作。
當我一個 function 裡面 call 了 100 個其它的 function;
或者 function flow 拉得很長,跨越了 100 個 function。
也許我每個 function 都通俗易懂一目瞭然,不用註解,
但還是得花時間看完這些 code 才懂這 100 個 function 合起來是在幹嘛。
而這個時間,也許只要兩行註解就可以代替。
想像一個具有 100 個 event 的 event sysem,
event 間另有交互合作及互斥關係,
也許每一個 event 都只用了兩三行 code,一看就明白,
所以不需要註解這個 event 在幹嘛。
但其它的人,光是要找到其中一個 event 就很花時間,
更不用說這個 event 牽涉到其它的哪些 event。
function event1_handler()
{
code line 1...
code line 2...
}
這樣超簡單的 event,不用註解嗎?
我覺得要,註解可能會長這樣
// event 1 affects
// - event 22
// - event 36
// - event 47
// - ...
// and NOT used concurrently with
// - event 7
// - event 71
但類似這種註解會需要花很多時間維護,
所以我個人會建議記錄成一張表格就好。
→
12/29 08:25,
5年前
, 6F
12/29 08:25, 6F
→
12/29 08:25,
5年前
, 7F
12/29 08:25, 7F
※ 編輯: babelism (59.127.94.119), 12/29/2018 11:20:08
推
12/29 12:00,
5年前
, 8F
12/29 12:00, 8F
→
12/29 13:15,
5年前
, 9F
12/29 13:15, 9F
→
12/29 13:22,
5年前
, 10F
12/29 13:22, 10F
→
12/29 13:22,
5年前
, 11F
12/29 13:22, 11F
→
12/29 13:22,
5年前
, 12F
12/29 13:22, 12F
→
12/29 13:22,
5年前
, 13F
12/29 13:22, 13F
→
12/29 13:22,
5年前
, 14F
12/29 13:22, 14F
→
12/29 13:23,
5年前
, 15F
12/29 13:23, 15F
推
12/29 20:36,
5年前
, 16F
12/29 20:36, 16F
→
01/02 08:36,
6年前
, 17F
01/02 08:36, 17F
討論串 (同標題文章)