Re: [CodeSOD] else...Where??

看板C_and_CPP (C/C++)作者 (ㄚ隆)時間16年前 (2010/02/04 11:06), 編輯推噓4(4033)
留言37則, 4人參與, 最新討論串2/3 (看更多)
※ 引述《Killercat (殺人貓™)》之銘言: : 「前陣子我們從我們的外包商那裡看到了一份實在是爛到爆炸的C++ code。這東西平均每 : 行出錯率實在是真他媽的高,而且他的寫碼風格讓我們越看越想咒他老母。不過,這種 : What the fuck的感覺,到我們看到這組code的時候達到了最高點。」 : while(true) : { : if(mainType == 7) : { : subType = 4; : break; : } : if(mainType == 9) : { : subType = 6; : break; : } : if(mainType == 11) : { : subType = 9; : break; : } : break; : } 手癢回一下文, 要是我會將上面寫成: switch (mainType) { case 7: case 9: case 11: subType = mainType - 3; if (mainType == 11) subType++; break; default: break; } 而且是一開始就會這麼寫 : --- : 感想 : 工程師再美國混口飯吃似乎真的很容易? XD ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^好像真的是喔~~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.104.198.185

02/04 11:17, , 1F
感覺這樣更糟 @@
02/04 11:17, 1F

02/04 11:18, , 2F
要就一一對應, 不然之後 maintain 的人還要看過所有的計算
02/04 11:18, 2F

02/04 11:18, , 3F
才知道要怎麼加新的 case 才不會有 side effect
02/04 11:18, 3F

02/04 11:35, , 4F
同意樓上. 簡簡單單的 switch case, 每個 case 寫對應
02/04 11:35, 4F

02/04 11:35, , 5F
的 subType = 什麼, 就簡單又易明白了
02/04 11:35, 5F

02/04 12:16, , 6F
一對一對應也行呀!那是最一開始會寫的,但是最後程式不做
02/04 12:16, 6F

02/04 12:16, , 7F
任何修改時,我才會寫上面回文的程式出來.
02/04 12:16, 7F

02/04 12:17, , 8F
會使用subType = mainType - 3;是想表達出,當資料有規則
02/04 12:17, 8F

02/04 12:18, , 9F
性出現時,可以考慮的作法,不是這樣做會比較好或不好.
02/04 12:18, 9F

02/04 12:19, , 10F
其實這種問題真的"見仁見智".
02/04 12:19, 10F

02/04 12:31, , 11F
case 7和9是ok, 但是case 11獨立出去會比較好吧@_@"
02/04 12:31, 11F

02/04 12:31, , 12F
如果真的有規律當然好, 問題是最後那個
02/04 12:31, 12F

02/04 12:31, , 13F
if (mainType == 11) subType++;
02/04 12:31, 13F

02/04 12:32, , 14F
三個 case, 只兩個有 "規律"... 然後硬把三個 case 放
02/04 12:32, 14F

02/04 12:33, , 15F
在一起, 這種 "規律" 真的看死人
02/04 12:33, 15F

02/04 12:34, , 16F
還有其實真的叫 xxxType, 用個 enum 或 constant 大家
02/04 12:34, 16F

02/04 12:34, , 17F
看起來總比一堆無意義數字容易理解得多
02/04 12:34, 17F

02/04 12:50, , 18F
對,樓上你要說的剛好是我剛想到的,但是不宜在這篇討論下
02/04 12:50, 18F

02/04 12:51, , 19F
去了,使用這種"magic number(s)"的程式本來就不好.
02/04 12:51, 19F

02/04 12:53, , 20F
還有樓上你的回文點出了原po要說的重點,是那while loop
02/04 12:53, 20F

02/04 12:56, , 21F
喔對了,回一下VictorTom大,要是我規劃的話,應該也不會讓
02/04 12:56, 21F

02/04 12:57, , 22F
case 11出現,也就是說case 7/9/11都是mainType - 3,所以
02/04 12:57, 22F

02/04 12:58, , 23F
這裡引出一個觀點...寫程式前的規劃與規格書很重要,不過
02/04 12:58, 23F

02/04 12:59, , 24F
寫軟體的都知道,計劃永遠趕不上變化,變化比不上老闆一句
02/04 12:59, 24F

02/04 13:00, , 25F
話,所以呢?以這種程式區塊而言,保持switch case裡的一對
02/04 13:00, 25F

02/04 13:00, , 26F
一方式反而是最佳解 XD!
02/04 13:00, 26F

02/04 13:10, , 27F
嗚嗚~~有時候不是所有事情都可以自己決定規格掌控的Q_Q~
02/04 13:10, 27F

02/04 13:11, , 28F
昨天幫同事看一個struct/union的問題, 我們用bit定義了
02/04 13:11, 28F

02/04 13:11, , 29F
對應HW Reg的setting, 結果HW開了某個鳥Reg用3 bits卻跨
02/04 13:11, 29F

02/04 13:12, , 30F
過兩個DWORD, 一個在尾2 bits, 接到下一個的頭1 bits,
02/04 13:12, 30F

02/04 13:12, , 31F
導致算出來sizeof應該4個DW變成5個DW; 對那些bits對了半
02/04 13:12, 31F

02/04 13:13, , 32F
天, 加掛debugger才找到問題, 這也是讓人想喊WTF啊>_<#
02/04 13:13, 32F

02/04 14:15, , 33F
各人是覺得, 就算有規律, 語意上是 xxxType 的東西也不應用
02/04 14:15, 33F

02/04 14:16, , 34F
運算的方法來求得, 一來如先前說不好管理, 二來整個程式的
02/04 14:16, 34F

02/04 14:16, , 35F
邏輯會變得很不直覺 (各人->個人)
02/04 14:16, 35F

02/04 14:17, , 36F
都已經用 switch 了, 不必要省到全都擠到同一個 case block
02/04 14:17, 36F

02/04 14:17, , 37F
不然你就不要 switch, 不要 if, 也不要 while, 直接運算就好
02/04 14:17, 37F
文章代碼(AID): #1BQZcOZK (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 3 篇):
文章代碼(AID): #1BQZcOZK (C_and_CPP)