[問題] 相似的功能但不知如何合併

看板C_and_CPP (C/C++)作者 (lionking - 辛巴)時間13年前 (2012/06/27 17:27), 編輯推噓1(1030)
留言31則, 4人參與, 最新討論串1/2 (看更多)
標題下的很爛,不好意思= =" 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC/G++ 問題(Question): 在寫幾何相關的演算法時常常會遇到一種情況是 對 x 座標處理時要寫一次,對 y 座標處理時又要寫一次 比方說今天是要判斷一條線是水平或垂直時要做相同的事 但是如果是水平則是對 x 座標做修改 如果是垂直則改成對 y 座標做修改 但是儲存資料的 structure是長成像這樣: template <typename T> class Coor { T x, y; // 其他所需的相關變數與成員函式 }; 假設演算法的 function prototype 是類似這樣: bool algorithm(Coor<T> &coor); 結果導致之後必須分別對 x 跟對 y 都各寫一次相同的演算法 差別就只是 x 變換成 y 而已 所以想請問有沒有什麼比較好的設計方式可以避免這種問題? 因為相同的演算法寫兩次,在事後維護上其實非常麻煩 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.241.158

06/27 17:41, , 1F
不太懂 加一個func(T&)之類的有什麼問題嗎?
06/27 17:41, 1F

06/27 18:28, , 2F
把資料的存取給抽象化?http://ideone.com/MEA3E
06/27 18:28, 2F

06/27 18:36, , 3F
感謝 james 大~這方法不錯!
06/27 18:36, 3F

06/27 18:37, , 4F
不過如果考慮到要把 data 的權限設成 private 的話
06/27 18:37, 4F

06/27 18:38, , 5F
會比較麻煩一點就是了...
06/27 18:38, 5F

06/27 18:38, , 6F
你應該還是會有data的Getter或Setter吧?
06/27 18:38, 6F

06/27 18:39, , 7F
倒忘了這東西XD
06/27 18:39, 7F

06/27 18:40, , 8F
private:: func(T&) ?
06/27 18:40, 8F

06/27 18:41, , 9F
坦白說我看不太懂 func(T&) 是什麼意思...
06/27 18:41, 9F

06/27 18:42, , 10F
不好意思我也不懂 1F 跟 EdisonX 大的意思= ="
06/27 18:42, 10F

06/27 18:42, , 11F
假設他要做的是 x*x,y*y, 弄一個 func(T&) 做這動作.
06/27 18:42, 11F

06/27 18:43, , 12F
x,y 再依序傳為 func 即可,T func(T &m) {return m*m;}
06/27 18:43, 12F

06/27 18:49, , 13F
06/27 18:49, 13F

06/27 18:49, , 14F
意思是對所有 x,y 的運算都改成經由一個 function ?
06/27 18:49, 14F

06/27 18:54, , 15F
是的。「動作一樣把它包成函式」應是蠻直覺的想法。
06/27 18:54, 15F

06/27 18:56, , 16F
不太懂..因為演算法主體在 algorithm 這個 function
06/27 18:56, 16F

06/27 18:57, , 17F
但我不希望 algorithm 裡面寫死是對 x 操作還是對 y
06/27 18:57, 17F

06/27 18:58, , 18F
我希望可以由外部決定(以上述範例來說就是 main)
06/27 18:58, 18F

06/27 18:59, , 19F
所以 J 大的做法就滿符合我想要的情況
06/27 18:59, 19F

06/27 19:02, , 20F
原來如此。
06/27 19:02, 20F

06/27 19:02, , 21F
會有這問題的原因是演算法本身沒有分是要對 x還是對 y
06/27 19:02, 21F

06/27 19:03, , 22F
但依據外部流程可能有時要對 x 做有時要對 y 做
06/27 19:03, 22F

06/27 19:04, , 23F
所以如果演算法寫死的話我必須寫兩份幾乎一模一樣的
06/27 19:04, 23F

06/27 19:04, , 24F
的程式碼, 在閱讀及維護上真的會有很大的麻煩
06/27 19:04, 24F

06/27 19:06, , 25F
http://ideone.com/F7k90 那我可能會這樣寫
06/27 19:06, 25F

06/27 19:06, , 26F
當然封裝等等的細節就再加上去就好
06/27 19:06, 26F

06/27 19:08, , 27F
這架構和我最近寫的 algorithm 頗像。
06/27 19:08, 27F

06/27 19:08, , 28F
如果一定只有兩個維度 覺得寫成多維太牛刀的話 可以把
06/27 19:08, 28F

06/27 19:08, , 29F
指定維度的地方改成enum之類的
06/27 19:08, 29F

06/27 19:11, , 30F
我懂了哈哈,原來是我想得太複雜
06/27 19:11, 30F

06/27 19:13, , 31F
感謝 shadow 大! 這確實也是個不錯的做法XD
06/27 19:13, 31F
文章代碼(AID): #1Fwj89Lz (C_and_CPP)
文章代碼(AID): #1Fwj89Lz (C_and_CPP)