作者tyc5116 (累人啊....)
看板C_and_CPP
標題[問題] 重構的技巧
時間Thu Feb 2 09:40:53 2012
如題,請問一下,類似這樣的程式碼(虛擬碼)
if (str=="A1"){
P1.val=1;
func1(p1.val);
}
else if (str=="A2"){
P1.val=2;
func2(p1.val)
}
else if (str=="A3"){
P1.val=1;
P2.val=2;
P3.val=3;
}
...
如上,一段程式就有類似這樣的if else(假設有很多)
裡面的描述有的很類似(如前兩個)
偶爾又穿插一些不太一樣的code(如第三個)
以各位的經驗,通常會以哪些手法對其進行重構呢
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.251.181.170
→ james732:我覺得重構除了程式簡潔外,也要考慮語意好不好懂 02/02 09:59
→ james732:這種程式碼雖然會比較冗長,但意思還挺容易理解的 02/02 10:01
→ james732:如果大括號裡的東西太長,會考慮拉出去變成函式 02/02 10:03
→ tyc5116:我現在遇到的就是太冗長了(2~3000行),而且像這樣不太知道 02/02 10:10
→ tyc5116:拉出來變成怎樣的函式會比較好 02/02 10:10
→ firejox:你先說說你的重構的內容是什麼好了... 02/02 10:33
→ firejox:重構 需要找出規則才會有意義... 02/02 10:35
→ angleevil:我記得好久以前版主有寫過類似的解決辦法 02/02 11:23
→ angleevil:如果是我會用map,index型態是string.value會用struct型 02/02 11:25
→ angleevil:態. 02/02 11:25
→ tyc5116:謝謝,f大,我要重構的內容就類似PO文那樣啊,只是太多if了 02/02 22:17
→ tyc5116:導致光一個event(ex.botton_click)就上千行 02/02 22:18
→ tyc5116:所以在想怎樣重整會看起來比較簡潔.. 02/02 22:19
→ tyc5116:另外,請問例子中vector有什麼用意?好像直接用func ptr就OK 02/02 22:20
→ angleevil:其實那是為了解決if (str=="A3")敘述中,不同val的值 02/03 12:17
→ angleevil:我程式的做法是提供另一種解決方法,什麼都可以彈性增加 02/03 12:18
→ angleevil:只是超哥的做法也不錯 02/03 12:22
→ james732:耶,被誇獎了XDDD 02/03 12:23
→ diabloevagto:如何修改?我希望能對到好幾個從header繼承的class 02/03 13:08
→ angleevil:func_1()<--改成宣告物件. 好久以前看過這東西,忘記 02/03 13:41
→ diabloevagto:要開-std=c++0x 02/03 13:44
→ diabloevagto:多型要用pointer?? 02/03 13:45
→ angleevil:我對oo的繼承有點忘掉了,但diablo的做法有其他問題 02/03 13:45
→ diabloevagto:什麼問題?? 02/03 13:46
→ angleevil:不曉得,只是感覺有問題在,但是不想深究. 因為我要研究 02/03 13:49
→ angleevil:公司的系統.最近發現就算我c/c++懂得比同事多,不懂自家 02/03 13:49
→ angleevil:系統,還是會被瞧不起 02/03 13:50
→ diabloevagto:只是挺好奇這樣會有什麼淺在問題出現@@ 02/03 13:51
→ diabloevagto:當然還是公司上的東西要摸熟,吃飯重要... 02/03 13:52
→ angleevil:你之前會出問題是因為不同型態的關係,但是用pointer 02/03 13:55
→ angleevil:可以指向延伸類別.所以已james732才提這方法 02/03 13:56
→ diabloevagto:但我的想法是說,有繼承不是可以直接延伸? 02/03 14:01
→ angleevil:對map<string,header>來說,value部分就只能接收header 02/03 14:03
→ angleevil:型態. 你去寫個函式 void FunTest(header obj)試試看 02/03 14:04
→ angleevil:你傳其他延伸型態進去,應該都是error吧!(ps 不要加&喔) 02/03 14:05
→ diabloevagto:我不能直接用header是因為header是interface不能實體 02/03 14:21
→ diabloevagto:化,是因為這個原因嗎? 02/03 14:21
→ angleevil:你想簡單點就好,你想太複雜了! 只是單純型態不合而已 02/03 14:36
→ diabloevagto:我在多思考看看,感謝指教! 02/03 14:37
→ angleevil:記得把結論分享出來,我也想知道自己在這的細節有miss嘛 02/03 14:39
→ diabloevagto:J大那個沒有多型,所以你轉形成header就不能了 02/03 14:51
→ diabloevagto:應該說轉型成header會使用header的function 02/03 14:51
→ james732:想用多型就一定要用pointer或reference type 02/03 14:55
→ diabloevagto:了解,所以我一開使就想錯了... 02/03 14:55
→ angleevil:幸好我觀念還好,只是缺了多型的概念 02/03 15:09
→ tyc5116:多型可以用reference type喔?真的假的,我改天試試看好了 02/04 00:13