[問題] 相似的class中減少code duplication

看板C_and_CPP (C/C++)作者 (AzureBlaze)時間13年前 (2013/04/26 23:06), 編輯推噓6(6023)
留言29則, 8人參與, 最新討論串1/3 (看更多)
我有兩個class A和B。 他們做的事差不多,只在某些細節上不一樣 大部分的地方都可以透過拉出一個共同的base class 再繼承來解決。 不過有些地方可能長這樣 A::doSomething(){ B::doSomething(){ BaseMethod1(); BaseMethod1(); BaseMethod2(); B_Specific_Operations(); A_Specific_Operations(); BaseMethod2(); BaseMethod3(); BaseMethod3(); } } 在我的用途中,A是遊戲 B是遊戲編輯器 他們底下跑的東西都差不多,可是遊戲編輯器在某些地方 可能要插入特別的ui處理code,關閉或開啟某些功能,或是 使用不同的初始值。 我目前處理的方法是全部寫在一起然後用macro產生兩個執行檔 不過我現在希望能將相同的部份弄成dll然後A和B都連結他 目前想到的一個解決方法是把AB不同的地方都在Base做 一個virtual method,然後AB其中一邊就留白 不過差異的地方很細碎,這麼做最後會把整個流程打得很散 同時開發還在相當不穩定的狀態,這樣每次要插入新的code的 時候都很麻煩。 另一個方法是直接用if分開AB 不過遊戲一定只用A,編輯器一定只用B,實在不想在runtime 還要付出判斷的成本 目前看起來還是原先的純macro方法最乾淨 還是說反正硬碟空間不值錢build成兩個獨立的exe就好了? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.168.88.7

04/26 23:17, , 1F
不好切的原因 很有可能是你的class太大 做了太多事情
04/26 23:17, 1F

04/26 23:17, , 2F
試著切割成小的class應該會比較好設計
04/26 23:17, 2F

04/26 23:40, , 3F
不過其實整個程式到處都充滿這種小差別
04/26 23:40, 3F

04/26 23:40, , 4F
所以不只是一個class內的問題
04/26 23:40, 4F

04/27 00:17, , 5F
用 function pointer 如何, 在每個 base method 增加兩個
04/27 00:17, 5F

04/27 00:18, , 6F
參數分別用來傳入該 method 執行前後的 callbacks
04/27 00:18, 6F

04/27 00:19, , 7F
然後例如你的 A-specific 就傳到 base method 2 的 after
04/27 00:19, 7F

04/27 00:19, , 8F
或 base 3 的 before 這樣就搞定了
04/27 00:19, 8F
我想這樣做可能還是跟virtual一樣會有程式被分成一大堆零碎的一行function問題?

04/27 01:42, , 9F
你知道怎麼使用物件導向嗎?
04/27 01:42, 9F

04/27 01:43, , 10F
看起來這應該就是用 OO 配合一下 abstract factory 就可以
04/27 01:43, 10F

04/27 01:43, , 11F
但如果當時一開始沒想到,現在已經累積了不少程式碼…
04/27 01:43, 11F

04/27 01:43, , 12F
改起來應該會蠻想哭的...
04/27 01:43, 12F

04/27 01:44, , 13F
不過我的話應該還是會下去改,不然之後可能更痛苦
04/27 01:44, 13F
整個程式是剛從C踏入C++的時候開始寫的,而現在想要改的就是一開始寫的部份 現在看起來也是相當頭痛。

04/27 02:26, , 14F
該用macro就用macro, 物件導向不是唯一解
04/27 02:26, 14F

04/27 14:08, , 15F
code分開寫,除了編輯器和遊戲會共用的資料結構共用之外
04/27 14:08, 15F

04/27 14:08, , 16F
我建議你遊戲是遊戲,編輯器是編輯器,雖然看起來作的事
04/27 14:08, 16F

04/27 14:09, , 17F
很像...........但是改到最後你會發現寫一起是自找麻煩
04/27 14:09, 17F

04/27 14:11, , 18F
實際上遊戲和編輯器真正「共用」的地方,比起那些非共用
04/27 14:11, 18F

04/27 14:12, , 19F
的code是小巫見大巫....
04/27 14:12, 19F
主要是這是動作遊戲的關卡編輯器,所以我希望編輯器render出來的東西 能和遊戲本身幾乎一樣。 也就是說編輯器會是一個AI/物理暫停,然後掛入編輯用UI的遊戲

04/27 15:28, , 20F
建議你功能的部分共用,AI的部分分成遊戲AI和編輯器AI
04/27 15:28, 20F

04/27 15:29, , 21F
由AI去決定遊戲功能和操作介面如何互動
04/27 15:29, 21F
現在想想如果需求是 1.能夠自由的在任何地方加入[共用/A專用/B專用]的code 2.compile-time完成 用macro好像還是最好的選擇 不然就是想辦法改程式,讓1.不再是個需求 最後一個心得就是 如果想學程式來做什麼很希望能完成的東西,絕對不要一開始就做他 不然你會在做了N年後咒罵年輕不懂事的自己寫的爛code ※ 編輯: azureblaze 來自: 118.168.95.211 (04/27 23:30)

04/28 19:47, , 22F
唉... 回文回心酸的
04/28 19:47, 22F

04/28 19:49, , 23F
type list + strategy 也可以作到一樣的事
04/28 19:49, 23F

04/28 20:49, , 24F
04/28 20:49, 24F

04/28 22:36, , 25F
感謝 不過弄到這樣好像就有點殺雞用牛刀了
04/28 22:36, 25F

05/03 00:20, , 26F
WYSIWYG是很好的理想 不過實行起來...
05/03 00:20, 26F

05/03 00:21, , 27F
我只能說我以我的經驗告訴你最好不要把editor和runtime擺
05/03 00:21, 27F

05/03 00:21, , 28F
在一起寫,到最後你會崩潰,除非你案子小以後也不用維護
05/03 00:21, 28F

05/03 00:22, , 29F
那些標榜WHSIWYG的引擎也沒人是把code寫在一起的吧..
05/03 00:22, 29F
文章代碼(AID): #1HUfVZV8 (C_and_CPP)
文章代碼(AID): #1HUfVZV8 (C_and_CPP)