[爆卦]重構技巧是什麼?優點缺點精華區懶人包

為什麼這篇重構技巧鄉民發文收入到精華區:因為在重構技巧這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者tyc5116 (累人啊....)看板C_and_CPP標題[問題] 重構的技巧時間Thu Fe...

重構技巧 在 鄧善庭|發瘋心理師 Instagram 的最佳貼文

2021-05-17 12:52:16

—— Charles R. Swindoll - 諮商技巧中有個名詞叫「重新架構」(Reframing),是家族治療取向及後現代取向常使用的技巧,指我們以正向的意圖,變更既有的認知、感受或假設,進而改變自己對此情境的解讀。 (重新架構不是去改變情緒,但當我們改變理解方式後,自然會影響到情緒、行為等結...


如題,請問一下,類似這樣的程式碼(虛擬碼)
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
james732:大概是這種感覺 http://ideone.com/jfj7R (手邊亂抓的XD) 02/02 10:09
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
angleevil:http://pastie.org/3300076 之後只要把cout overlapping 02/02 11:42
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:http://ideone.com/HE0gF 34行那邊會不能過,請問該 02/03 13:07
diabloevagto:如何修改?我希望能對到好幾個從header繼承的class 02/03 13:08
james732:這種味道? http://ideone.com/mEIBZ 02/03 13:20
james732:http://ideone.com/HE0gF ←這個的33行我編譯不過耶... 02/03 13:21
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:http://ideone.com/ryiMM 最後改完是這樣子 02/03 13:51
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
james732:http://ideone.com/PbQUV 這樣會過,但結果應該不符預期 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

你可能也想看看

搜尋相關網站