Re: [閒聊] 寫code不加註解真的很顧人怨嗎

以下是根據本魯碼農自己的經驗,絕大部份參考Clean Code這本書,我自己是將這本書奉為 圭臬,不過我也知道很多人反對書裡的一些看法,所以聽聽就好 首先一個最大的原則就是程式碼必須好懂,因為它同時是寫給機器跟人看的,好懂是可擴充 性跟可維護性的必要,是程式碼無比重要的基石 推文有人說程式碼沒有註解的話十年後的自己會無法理解,實際上根據我自己的經驗如果我 寫出一段不好讀的程式碼,幾天、幾個小時甚至幾分鐘之後我就會痛恨之前的自己了 那麼註解是必要的嗎?我認為註解有其必要,但應該越少越好 為什麼越少越好呢?首先,程式碼應該要可以自己描述自己,來看一個簡單的範例: float multi(float a, float b) { return a*b; } 很容易就能看出這是一個做乘法的方法,但他的用處是什麼?沒人看得出來 float convertUsdToNtd(float usd, float converRatio) { return usd * convertRatio; } 這樣就一目了然了,這是一個把美金轉換成新台幣的方法,如此就不需要註解了。在實務上 ,尤其是在有複雜的業務邏輯的時候,變數跟方法名稱可能會長到惱人的地步,但為了可讀 性,這是必要的犧牲。 我們還能繼續擴充這個方法,例如說加入即時匯率,讓他可以將轉換幣值這件事做的更好 float convertUsdToNtd(float usd, FinaceService financeService) { return usd * finaceService.getUsdToNtdRatio; // Multiply usd and ratio. } 上面的程式碼有一行註解,但不難看出這個註解是一句廢話,因為他只是描述了該句程式碼 做了什麼。好的註解應該從抽象、高層次的方向來解釋程式碼的用意、為什麼要這麼寫: float convertUsdToNtd(float usd, FinaceService financeService) { // Fetch ratio from finance service for real time return usd * finaceService.getUsdToNtdRatio; } 上面的程式碼解釋了為什麼要從finance service 獲得匯率,因為必須要獲得當下即時的匯 率 但註解並不總是好的,有時候他可能是有害的。假設我今天修改了這個方法,讓他不再是根 據即時匯率,而是某一天的平均匯率: float convertUsdToNtdByDate(float usd, Date date, FinaceService financeService) { // Fetch ratio from finance service for real time return usd * finaceService.getUsdToNtdRatioByDate(date); } 程式碼更改但是註解忘了更新的情況下,這行註解就是錯的。錯誤的註解會造成混亂,低效 ,甚至錯誤!程式碼本身的可讀性重要性應該永遠高於註解,因為程式碼描述的就是事實, 你沒辦法寫出一行程式碼做的事情和他看起來的不同(Well, 通常沒辦法)但是註解可以! 跟註解不同的是,我認為文件(document)是有必要而且多一點較好的,文件是寫在方法前 面的註解,用來描述這個方法做了什麼: /* Convert USD to NTD by ratio from a specific date. */ float convertUsdToNtdByDate(float usd, Date date, FinaceService financeService) { return usd * finaceService.getUsdToNtdRatioByDate(date); } 文件是讓下一份閱讀程式碼的人(通常就是你自己)快速理解這個方法是做什麼,他會輸入 什麼,他會回傳什麼最好的方式。文件只會從最抽象的層次描述方法,不會包含任何的實作 細節,除非這個細節有必要讓使用者知道(例如說,某些情況下的演算法和其時間複雜度) 。而且我認為應該要採用文件導向的方式-當你創建新的方法時,你應該先編寫文件修改時 亦同 ※ 引述《ianlin1216 (伊恩可可)》之銘言 : 餓死抬頭 : https://i.imgur.com/3QcIsVN.jpeg
: 本魯不是資工系的啦 : 所以不知道寫程式不加註解會有多嚴重 : 想請問相關從業的鄉民 : 實務上遇到這種情況真的很賭爛嗎 : 乾五西恰

推文討論 190

1F → nh60211as 12/25 21:06
首先算錢用浮點
2F 推 strlen 12/25 21:07
反對者很多 而且還很大一部份是不學無術的老屁股冗員
3F → strlen 12/25 21:07
因為寫clean code很麻煩 很燒腦 很吃力不討好 懶啦
4F 推 arrenwu 12/25 21:07
原來寫在 function 前的comment還有特別稱呼啊XD
5F 噓 Ratucao 12/25 21:10
西洽點在哪
6F 推 enmeitiryous 12/25 21:10
所以是建議用大寫區隔函式內的詞而不是底線嗎
7F → pride829 12/25 21:10
我知道算錢有更好的方式,但我不想加入太多東西讓這篇
8F → pride829 12/25 21:10
文章對新手來說更難懂
9F 推 Tokukenis 12/25 21:11
推文件導向
10F → eva05s 12/25 21:12
回文不用點
11F → arrenwu 12/25 21:12
回文不是不用點 而是沒有洽點的話要跟引文有關係
12F → pride829 12/25 21:12
命名風格通常是根據程式語言跟你的團隊來做決定,以這
13F → pride829 12/25 21:12
篇文來說是Java
14F → arrenwu 12/25 21:13
這篇顯然是跟引文有關的
15F 推 qwer338859 12/25 21:16
回文又不用點 鬼叫什麼
16F 推 Richun 12/25 21:16
前面的那個不完全是comment,有的說法是doc string。
17F → Richun 12/25 21:17
像是Python有"""開頭"""結尾可以寫整串的東西能用。
18F 推 kaj1983 12/25 21:17
總之好懂的寫法就是對的,想辦法寫出好懂的程式也是對的
19F → arrenwu 12/25 21:17
我一直以為這些都叫做 comment XDDD
20F → kuninaka 12/25 21:17
這篇是正確的,可以自我註釋的程式碼才好讀
21F → Richun 12/25 21:18
Rust有///開頭的東西,編譯同時可以輸出成文件。
22F 推 sunshinecan 12/25 21:18
推這篇
23F → kuninaka 12/25 21:19
我現在常常只寫註解就讓GenAI跑程式出來
24F → Richun 12/25 21:19
如果函數切分得好,函數名稱本身就是一個好的註解了。
25F 推 h0103661 12/25 21:19
算錢也不能用浮點,用decimal才能避免小數點問題
26F → spfy 12/25 21:20
很多語言甚至不同TEAM的規範都不同吧 這我倒是覺得統一就好
27F → kuninaka 12/25 21:20
大寫區隔函式內的詞??
28F → kuninaka 12/25 21:20
你是想說 camel case ??
29F → qwer338859 12/25 21:21
每個語言基本代碼風格規範不同這看起來是C#
30F → kuninaka 12/25 21:21
這是JAVA阿
31F 推 arrenwu 12/25 21:22
C/C++ 是不是也是這個樣子啊?
32F → qwer338859 12/25 21:22
真的欸 那他在說什麼大寫
33F → Richun 12/25 21:22
C#的命名風格是函數PascalCase,區域變數才用camelCase。
34F → arrenwu 12/25 21:23
這個變數命名那個自己組裡面講好就好了 然後寫的時候看
35F → arrenwu 12/25 21:23
一下有沒有跟旁邊的code長得太不一樣XDDD
36F → Richun 12/25 21:24
推文應該只是不知道code style,那個各語言習慣差很多。
37F 推 kuninaka 12/25 21:24
反正不要用奇怪的縮寫或沒意義的詞就好
38F → kuninaka 12/25 21:24
有看過初學者用ABCDEFG來命名XD
39F → Richun 12/25 21:25
editorconfig解決縮排問題,coding style各語言各有工具。
40F → kuninaka 12/25 21:25
現在寫程式比以前好太多了,AI太強
41F → Richun 12/25 21:26
聽說打競賽的為了拚那幾秒,會用abc跟ijk這種免洗命名法XD
42F 推 D122 12/25 21:26
變數名不要取太差就還好 真的
43F → spfy 12/25 21:27
44F → spfy 12/25 21:28
有些26會用漢語拼音+縮寫=通靈命名法
45F → h0103661 12/25 21:29
y1s1 對岸應該很習慣
46F 推 shadow0326 12/25 21:30
我一直想知道中國工程師寫int64會不會過不了審
47F → k960608 12/25 21:31
不會 小學生看不懂
48F 推 kuninaka 12/25 21:32
26那邊真的很多拼音縮寫的智障命名法= =
49F → pride829 12/25 21:32
變數如何命名也是個大坑,一般來說你的視野(scope)越
50F → pride829 12/25 21:32
大,名稱就要越長,反之則最短
51F → kuninaka 12/25 21:32
scope很大,名稱很短會死人阿XDDD
52F → greatloser 12/25 21:33
5樓菜雞還特別大聲
53F 推 arrenwu 12/25 21:34
所以一般會用namespace保護啊
54F 推 Richun 12/25 21:48
但C沒有namespace,不是在.c能用static藏的函數得很臭長。
55F 推 arrenwu 12/25 21:50
沒有 namespace ... 好ㄅ
56F → spfy 12/25 21:54
原來如此
57F 推 XFarter 12/25 21:55
其實大家指的「必須要存在的」 comment 就是原 Po 的 doc
58F → XFarter 12/25 21:55
ument 吧
59F → XFarter 12/25 21:55
只是好像不是每個人都會這樣稱呼它,甚至我也只在 clean
60F → XFarter 12/25 21:55
code 以及一些軟工討論才有機會看到這樣的稱呼
61F → XFarter 12/25 21:57
C 因為沒有 namespace 所以 scope 更顯得重要就是了。幸
62F → XFarter 12/25 21:57
好還是有 struct 這種基本的能用
63F → spfy 12/25 22:01
VS有內建的註解系統能搭配PLUGIN輸出成程式說明文件
64F → spfy 12/25 22:02
但認真寫會變成CODE以外一大堆又臭又長的XML註解 所以官方
65F → spfy 12/25 22:03
又建議你用另一個特殊的XML NODE把整份XML註解移動到一個獨
66F → spfy 12/25 22:03
立的XML檔案 然後程式碼只要指過去就好 但不知道有多少人真
67F → spfy 12/25 22:04
的有用這套XML註解功能產整份文件...
68F 推 AnyonRedira 12/25 22:11
推 clean code
69F 推 wulouise 12/25 22:29
對,你全部都重寫當然沒問題
70F 推 silveryiris 12/25 22:46
推
71F 推 fman 12/25 23:00
我自己經驗,一個禮拜這隻code就不認識了,有過看code覺得這
72F → fman 12/25 23:00
個人寫的不錯,想法和我差不多,再看作者,靠北,不就是我自
73F → fman 12/25 23:00
己,還上禮拜寫的 XD 忙的時候特別容易發生這種事情
74F 推 lylu 12/25 23:23
現代螢幕都夠大了取名長一點沒什麼問題 取很簡短又重複的在
75F → lylu 12/25 23:23
大型專案裡面搜關鍵字會很火
76F 推 Galbygene 12/25 23:35
推
77F 推 n0029480300 12/25 23:36
同意這篇
78F 推 ptt0211 12/26 00:14
算錢用浮點 遲早被人扁
79F 推 tacodrem 12/26 00:56
同意文件的優先重要性
80F → tacodrem 12/26 00:56
但如果遇到寫文件就像要他命的團隊...
81F → tacodrem 12/26 00:56
摸摸鼻子寫好ITS備註跟註解存證據比較快= =
82F → CP64 12/26 01:02
c 姑且算是有 ns 啦 只是人家的 ns 是劃在 compile unit 上
83F 推 melancholy07 12/26 01:02
推
84F → melancholy07 12/26 01:02
推
85F → CP64 12/26 01:03
所以會有那種同一個元件有兩個 header 一個內用一個外帶
86F → shallreturn 12/26 01:42
clean code 明明就蠻簡單的 講白了用代碼講清楚自己
87F → shallreturn 12/26 01:42
的代碼在幹嘛
88F 推 chrisjeremy 12/26 02:18
文件跟註解有一樣的問題 程式碼改了 功能有變化 文件
89F → chrisjeremy 12/26 02:18
不見得會更新 是說連註解都沒改了 文件更不會改
90F → chrisjeremy 12/26 02:19
但是寫文件跟維護文件很重要我舉雙手同意
91F → chrisjeremy 12/26 02:21
只是時程上往往沒有足夠的時間去維護文件
92F 推 MK47 12/26 04:25
推這篇 沒有code review已經夠怪了 連規範都沒有 不知道那種
93F → MK47 12/26 04:25
公司在幹嘛
94F 推 choosin 12/26 07:41
基本上文件先行 就沒有維護來不及的問題 再來就是如這篇
95F → choosin 12/26 07:41
所講 別誤用註解
96F → nh60211as 12/25 21:06
首先算錢用浮點
97F 推 strlen 12/25 21:07
反對者很多 而且還很大一部份是不學無術的老屁股冗員
98F → strlen 12/25 21:07
因為寫clean code很麻煩 很燒腦 很吃力不討好 懶啦
99F 推 arrenwu 12/25 21:07
原來寫在 function 前的comment還有特別稱呼啊XD
100F 噓 Ratucao 12/25 21:10
西洽點在哪
101F 推 enmeitiryous 12/25 21:10
所以是建議用大寫區隔函式內的詞而不是底線嗎
102F → pride829 12/25 21:10
我知道算錢有更好的方式,但我不想加入太多東西讓這篇
103F → pride829 12/25 21:10
文章對新手來說更難懂
104F 推 Tokukenis 12/25 21:11
推文件導向
105F → eva05s 12/25 21:12
回文不用點
106F → arrenwu 12/25 21:12
回文不是不用點 而是沒有洽點的話要跟引文有關係
107F → pride829 12/25 21:12
命名風格通常是根據程式語言跟你的團隊來做決定,以這
108F → pride829 12/25 21:12
篇文來說是Java
109F → arrenwu 12/25 21:13
這篇顯然是跟引文有關的
110F 推 qwer338859 12/25 21:16
回文又不用點 鬼叫什麼
111F 推 Richun 12/25 21:16
前面的那個不完全是comment,有的說法是doc string。
112F → Richun 12/25 21:17
像是Python有"""開頭"""結尾可以寫整串的東西能用。
113F 推 kaj1983 12/25 21:17
總之好懂的寫法就是對的,想辦法寫出好懂的程式也是對的
114F → arrenwu 12/25 21:17
我一直以為這些都叫做 comment XDDD
115F → kuninaka 12/25 21:17
這篇是正確的,可以自我註釋的程式碼才好讀
116F → Richun 12/25 21:18
Rust有///開頭的東西,編譯同時可以輸出成文件。
117F 推 sunshinecan 12/25 21:18
推這篇
118F → kuninaka 12/25 21:19
我現在常常只寫註解就讓GenAI跑程式出來
119F → Richun 12/25 21:19
如果函數切分得好,函數名稱本身就是一個好的註解了。
120F 推 h0103661 12/25 21:19
算錢也不能用浮點,用decimal才能避免小數點問題
121F → spfy 12/25 21:20
很多語言甚至不同TEAM的規範都不同吧 這我倒是覺得統一就好
122F → kuninaka 12/25 21:20
大寫區隔函式內的詞??
123F → kuninaka 12/25 21:20
你是想說 camel case ??
124F → qwer338859 12/25 21:21
每個語言基本代碼風格規範不同這看起來是C#
125F → kuninaka 12/25 21:21
這是JAVA阿
126F 推 arrenwu 12/25 21:22
C/C++ 是不是也是這個樣子啊?
127F → qwer338859 12/25 21:22
真的欸 那他在說什麼大寫
128F → Richun 12/25 21:22
C#的命名風格是函數PascalCase,區域變數才用camelCase。
129F → arrenwu 12/25 21:23
這個變數命名那個自己組裡面講好就好了 然後寫的時候看
130F → arrenwu 12/25 21:23
一下有沒有跟旁邊的code長得太不一樣XDDD
131F → Richun 12/25 21:24
推文應該只是不知道code style,那個各語言習慣差很多。
132F 推 kuninaka 12/25 21:24
反正不要用奇怪的縮寫或沒意義的詞就好
133F → kuninaka 12/25 21:24
有看過初學者用ABCDEFG來命名XD
134F → Richun 12/25 21:25
editorconfig解決縮排問題,coding style各語言各有工具。
135F → kuninaka 12/25 21:25
現在寫程式比以前好太多了,AI太強
136F → Richun 12/25 21:26
聽說打競賽的為了拚那幾秒,會用abc跟ijk這種免洗命名法XD
137F 推 D122 12/25 21:26
變數名不要取太差就還好 真的
138F → spfy 12/25 21:27
139F → spfy 12/25 21:28
有些26會用漢語拼音+縮寫=通靈命名法
140F → h0103661 12/25 21:29
y1s1 對岸應該很習慣
141F 推 shadow0326 12/25 21:30
我一直想知道中國工程師寫int64會不會過不了審
142F → k960608 12/25 21:31
不會 小學生看不懂
143F 推 kuninaka 12/25 21:32
26那邊真的很多拼音縮寫的智障命名法= =
144F → pride829 12/25 21:32
變數如何命名也是個大坑,一般來說你的視野(scope)越
145F → pride829 12/25 21:32
大,名稱就要越長,反之則最短
146F → kuninaka 12/25 21:32
scope很大,名稱很短會死人阿XDDD
147F → greatloser 12/25 21:33
5樓菜雞還特別大聲
148F 推 arrenwu 12/25 21:34
所以一般會用namespace保護啊
149F 推 Richun 12/25 21:48
但C沒有namespace,不是在.c能用static藏的函數得很臭長。
150F 推 arrenwu 12/25 21:50
沒有 namespace ... 好ㄅ
151F → spfy 12/25 21:54
原來如此
152F 推 XFarter 12/25 21:55
其實大家指的「必須要存在的」 comment 就是原 Po 的 doc
153F → XFarter 12/25 21:55
ument 吧
154F → XFarter 12/25 21:55
只是好像不是每個人都會這樣稱呼它,甚至我也只在 clean
155F → XFarter 12/25 21:55
code 以及一些軟工討論才有機會看到這樣的稱呼
156F → XFarter 12/25 21:57
C 因為沒有 namespace 所以 scope 更顯得重要就是了。幸
157F → XFarter 12/25 21:57
好還是有 struct 這種基本的能用
158F → spfy 12/25 22:01
VS有內建的註解系統能搭配PLUGIN輸出成程式說明文件
159F → spfy 12/25 22:02
但認真寫會變成CODE以外一大堆又臭又長的XML註解 所以官方
160F → spfy 12/25 22:03
又建議你用另一個特殊的XML NODE把整份XML註解移動到一個獨
161F → spfy 12/25 22:03
立的XML檔案 然後程式碼只要指過去就好 但不知道有多少人真
162F → spfy 12/25 22:04
的有用這套XML註解功能產整份文件...
163F 推 AnyonRedira 12/25 22:11
推 clean code
164F 推 wulouise 12/25 22:29
對,你全部都重寫當然沒問題
165F 推 silveryiris 12/25 22:46
推
166F 推 fman 12/25 23:00
我自己經驗,一個禮拜這隻code就不認識了,有過看code覺得這
167F → fman 12/25 23:00
個人寫的不錯,想法和我差不多,再看作者,靠北,不就是我自
168F → fman 12/25 23:00
己,還上禮拜寫的 XD 忙的時候特別容易發生這種事情
169F 推 lylu 12/25 23:23
現代螢幕都夠大了取名長一點沒什麼問題 取很簡短又重複的在
170F → lylu 12/25 23:23
大型專案裡面搜關鍵字會很火
171F 推 Galbygene 12/25 23:35
推
172F 推 n0029480300 12/25 23:36
同意這篇
173F 推 ptt0211 12/26 00:14
算錢用浮點 遲早被人扁
174F 推 tacodrem 12/26 00:56
同意文件的優先重要性
175F → tacodrem 12/26 00:56
但如果遇到寫文件就像要他命的團隊...
176F → tacodrem 12/26 00:56
摸摸鼻子寫好ITS備註跟註解存證據比較快= =
177F → CP64 12/26 01:02
c 姑且算是有 ns 啦 只是人家的 ns 是劃在 compile unit 上
178F 推 melancholy07 12/26 01:02
推
179F → melancholy07 12/26 01:02
推
180F → CP64 12/26 01:03
所以會有那種同一個元件有兩個 header 一個內用一個外帶
181F → shallreturn 12/26 01:42
clean code 明明就蠻簡單的 講白了用代碼講清楚自己
182F → shallreturn 12/26 01:42
的代碼在幹嘛
183F 推 chrisjeremy 12/26 02:18
文件跟註解有一樣的問題 程式碼改了 功能有變化 文件
184F → chrisjeremy 12/26 02:18
不見得會更新 是說連註解都沒改了 文件更不會改
185F → chrisjeremy 12/26 02:19
但是寫文件跟維護文件很重要我舉雙手同意
186F → chrisjeremy 12/26 02:21
只是時程上往往沒有足夠的時間去維護文件
187F 推 MK47 12/26 04:25
推這篇 沒有code review已經夠怪了 連規範都沒有 不知道那種
188F → MK47 12/26 04:25
公司在幹嘛
189F 推 choosin 12/26 07:41
基本上文件先行 就沒有維護來不及的問題 再來就是如這篇
190F → choosin 12/26 07:41
所講 別誤用註解