[問題] 重構的技巧

看板C_and_CPP作者 (累人啊....)時間14年前 (2012/02/02 09:40), 編輯推噓0(0053)
留言53則, 5人參與, 最新討論串1/2 (看更多)
如題,請問一下,類似這樣的程式碼(虛擬碼) 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

02/02 09:59, , 1F
我覺得重構除了程式簡潔外,也要考慮語意好不好懂
02/02 09:59, 1F

02/02 10:01, , 2F
這種程式碼雖然會比較冗長,但意思還挺容易理解的
02/02 10:01, 2F

02/02 10:03, , 3F
如果大括號裡的東西太長,會考慮拉出去變成函式
02/02 10:03, 3F

02/02 10:09, , 4F
大概是這種感覺 http://ideone.com/jfj7R (手邊亂抓的XD)
02/02 10:09, 4F

02/02 10:10, , 5F
我現在遇到的就是太冗長了(2~3000行),而且像這樣不太知道
02/02 10:10, 5F

02/02 10:10, , 6F
拉出來變成怎樣的函式會比較好
02/02 10:10, 6F

02/02 10:33, , 7F
你先說說你的重構的內容是什麼好了...
02/02 10:33, 7F

02/02 10:35, , 8F
重構 需要找出規則才會有意義...
02/02 10:35, 8F

02/02 11:23, , 9F
我記得好久以前版主有寫過類似的解決辦法
02/02 11:23, 9F

02/02 11:25, , 10F
如果是我會用map,index型態是string.value會用struct型
02/02 11:25, 10F

02/02 11:25, , 11F
態.
02/02 11:25, 11F

02/02 11:42, , 12F
http://pastie.org/3300076 之後只要把cout overlapping
02/02 11:42, 12F

02/02 22:17, , 13F
謝謝,f大,我要重構的內容就類似PO文那樣啊,只是太多if了
02/02 22:17, 13F

02/02 22:18, , 14F
導致光一個event(ex.botton_click)就上千行
02/02 22:18, 14F

02/02 22:19, , 15F
所以在想怎樣重整會看起來比較簡潔..
02/02 22:19, 15F

02/02 22:20, , 16F
另外,請問例子中vector有什麼用意?好像直接用func ptr就OK
02/02 22:20, 16F

02/03 12:17, , 17F
其實那是為了解決if (str=="A3")敘述中,不同val的值
02/03 12:17, 17F

02/03 12:18, , 18F
我程式的做法是提供另一種解決方法,什麼都可以彈性增加
02/03 12:18, 18F

02/03 12:22, , 19F
只是超哥的做法也不錯
02/03 12:22, 19F

02/03 12:23, , 20F
耶,被誇獎了XDDD
02/03 12:23, 20F

02/03 13:07, , 21F
http://ideone.com/HE0gF 34行那邊會不能過,請問該
02/03 13:07, 21F

02/03 13:08, , 22F
如何修改?我希望能對到好幾個從header繼承的class
02/03 13:08, 22F

02/03 13:20, , 23F
這種味道? http://ideone.com/mEIBZ
02/03 13:20, 23F

02/03 13:21, , 24F
http://ideone.com/HE0gF ←這個的33行我編譯不過耶...
02/03 13:21, 24F

02/03 13:41, , 25F
func_1()<--改成宣告物件. 好久以前看過這東西,忘記
02/03 13:41, 25F

02/03 13:44, , 26F
要開-std=c++0x
02/03 13:44, 26F

02/03 13:45, , 27F
多型要用pointer??
02/03 13:45, 27F

02/03 13:45, , 28F
我對oo的繼承有點忘掉了,但diablo的做法有其他問題
02/03 13:45, 28F

02/03 13:46, , 29F
什麼問題??
02/03 13:46, 29F

02/03 13:49, , 30F
不曉得,只是感覺有問題在,但是不想深究. 因為我要研究
02/03 13:49, 30F

02/03 13:49, , 31F
公司的系統.最近發現就算我c/c++懂得比同事多,不懂自家
02/03 13:49, 31F

02/03 13:50, , 32F
系統,還是會被瞧不起
02/03 13:50, 32F

02/03 13:51, , 33F
http://ideone.com/ryiMM 最後改完是這樣子
02/03 13:51, 33F

02/03 13:51, , 34F
只是挺好奇這樣會有什麼淺在問題出現@@
02/03 13:51, 34F

02/03 13:52, , 35F
當然還是公司上的東西要摸熟,吃飯重要...
02/03 13:52, 35F

02/03 13:55, , 36F
你之前會出問題是因為不同型態的關係,但是用pointer
02/03 13:55, 36F

02/03 13:56, , 37F
可以指向延伸類別.所以已james732才提這方法
02/03 13:56, 37F

02/03 14:01, , 38F
但我的想法是說,有繼承不是可以直接延伸?
02/03 14:01, 38F

02/03 14:03, , 39F
對map<string,header>來說,value部分就只能接收header
02/03 14:03, 39F

02/03 14:04, , 40F
型態. 你去寫個函式 void FunTest(header obj)試試看
02/03 14:04, 40F

02/03 14:05, , 41F
你傳其他延伸型態進去,應該都是error吧!(ps 不要加&喔)
02/03 14:05, 41F

02/03 14:21, , 42F
我不能直接用header是因為header是interface不能實體
02/03 14:21, 42F

02/03 14:21, , 43F
化,是因為這個原因嗎?
02/03 14:21, 43F

02/03 14:36, , 44F
你想簡單點就好,你想太複雜了! 只是單純型態不合而已
02/03 14:36, 44F

02/03 14:37, , 45F
我在多思考看看,感謝指教!
02/03 14:37, 45F

02/03 14:39, , 46F
記得把結論分享出來,我也想知道自己在這的細節有miss嘛
02/03 14:39, 46F

02/03 14:39, , 47F
http://ideone.com/PbQUV 這樣會過,但結果應該不符預期
02/03 14:39, 47F

02/03 14:51, , 48F
J大那個沒有多型,所以你轉形成header就不能了
02/03 14:51, 48F

02/03 14:51, , 49F
應該說轉型成header會使用header的function
02/03 14:51, 49F

02/03 14:55, , 50F
想用多型就一定要用pointer或reference type
02/03 14:55, 50F

02/03 14:55, , 51F
了解,所以我一開使就想錯了...
02/03 14:55, 51F

02/03 15:09, , 52F
幸好我觀念還好,只是缺了多型的概念
02/03 15:09, 52F

02/04 00:13, , 53F
多型可以用reference type喔?真的假的,我改天試試看好了
02/04 00:13, 53F
文章代碼(AID): #1FAUceW0 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1FAUceW0 (C_and_CPP)