看板 C_and_CPP 關於我們 聯絡資訊
標題下的很爛,不好意思= =" 開發平台(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
shadow0326:不太懂 加一個func(T&)之類的有什麼問題嗎? 06/27 17:41
james732:把資料的存取給抽象化?http://ideone.com/MEA3E 06/27 18:28
shininglion:感謝 james 大~這方法不錯! 06/27 18:36
shininglion:不過如果考慮到要把 data 的權限設成 private 的話 06/27 18:37
shininglion:會比較麻煩一點就是了... 06/27 18:38
james732:你應該還是會有data的Getter或Setter吧? 06/27 18:38
shininglion:倒忘了這東西XD 06/27 18:39
EdisonX:private:: func(T&) ? 06/27 18:40
james732:坦白說我看不太懂 func(T&) 是什麼意思... 06/27 18:41
shininglion:不好意思我也不懂 1F 跟 EdisonX 大的意思= =" 06/27 18:42
EdisonX:假設他要做的是 x*x,y*y, 弄一個 func(T&) 做這動作. 06/27 18:42
EdisonX:x,y 再依序傳為 func 即可,T func(T &m) {return m*m;} 06/27 18:43
shadow0326:類似這樣 http://ideone.com/oaUfX 06/27 18:49
shininglion:意思是對所有 x,y 的運算都改成經由一個 function ? 06/27 18:49
EdisonX:是的。「動作一樣把它包成函式」應是蠻直覺的想法。 06/27 18:54
shininglion:不太懂..因為演算法主體在 algorithm 這個 function 06/27 18:56
shininglion:但我不希望 algorithm 裡面寫死是對 x 操作還是對 y 06/27 18:57
shininglion:我希望可以由外部決定(以上述範例來說就是 main) 06/27 18:58
shininglion:所以 J 大的做法就滿符合我想要的情況 06/27 18:59
EdisonX:原來如此。 06/27 19:02
shininglion:會有這問題的原因是演算法本身沒有分是要對 x還是對 y 06/27 19:02
shininglion:但依據外部流程可能有時要對 x 做有時要對 y 做 06/27 19:03
shininglion:所以如果演算法寫死的話我必須寫兩份幾乎一模一樣的 06/27 19:04
shininglion:的程式碼, 在閱讀及維護上真的會有很大的麻煩 06/27 19:04
shadow0326:http://ideone.com/F7k90 那我可能會這樣寫 06/27 19:06
shadow0326:當然封裝等等的細節就再加上去就好 06/27 19:06
EdisonX:這架構和我最近寫的 algorithm 頗像。 06/27 19:08
shadow0326:如果一定只有兩個維度 覺得寫成多維太牛刀的話 可以把 06/27 19:08
shadow0326:指定維度的地方改成enum之類的 06/27 19:08
james732:我懂了哈哈,原來是我想得太複雜 06/27 19:11
shininglion:感謝 shadow 大! 這確實也是個不錯的做法XD 06/27 19:13