看板 OOAD 關於我們 聯絡資訊
※ 引述《BigLoser (大魯蛇)》之銘言: : ※ [本文轉錄自 C_Sharp 看板 #1Jz5OsDg ] : 作者: BigLoser (大魯蛇) 看板: C_Sharp : 標題: [問題] 實作內容相同但很可能改變的function : 時間: Wed Aug 20 16:03:00 2014 : 大家好,我就直接舉例了 : public int CountA(int A) : { : return A*5 + 0; : } : public int CountB(int B) : { : return B*5 +1; : } : public int CountC(int C) : { : return C*5 +2; : } : 我有多個function做的事情是差不多的,只有些微差別, : 如例子中的 +0 +1 +2, : 所以我可以把它整合成一個function,用switch來判斷他要+多少, : 可是問題來了,如果未來這些function可能又會出一些特別的變化, : 例如 : public int CountA(int A) : { : return A*A*A+A+1; : } : 會使得A不適合跟其他人整合成在一起, : 請問這種狀況該怎麼處理比較好呢? : 謝謝 你可以把 CountA, CountB, CountC 這些「入口」留著, 然後觀察一下為看起來相似的部分另外作一個 (或一些) 像是樣版性質的函數, 然後再由這些「入口」依需求來選用樣版; 如果某個入口後來經過演變而和大家完全不像了, 它也可以就不再使用樣版; 或是以後發現有幾個反而變得相像了, 也可以再抽出新樣版來共用. 這邊的例子裡, 我想有個樣版可能是長這樣: private int template1(int a, int b){ return a * 5 + b; } // 我知道我名字取很爛 XD 然後 public int CountA(int A){ return template1(A, 0); } ... 以後 CountA 要改寫法了, 可以就不再使用 template1. 你這例子應該是有過度簡化吧? 不然這樣版抽出來以後用起來比原本還長 XD 如果你想要讓這樣版會「自動取出入口函數的第一個參數來用」的話, 要看使用的語言能不能讓你這樣搞.. 例如說 C/C++ 的 macro, 或是一般 functional language 的 curry 手法, 如果 Java 可能可以從 reflection 裡面拿資訊出來利用...不太確定 但 macro 或是 reflection 用法要斟酌一下 (curry 就還好), 因為不是常見用法, 可能會讓別人或以後的自己因為沒看出個中玄機而出事. (反過來說, 如果只有自己用, 或是自己帶的 team, 可以從此開始刻意大用特用天天用, 用到每一個人都能一眼看出... 維護就不會出問題了 XD) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 112.121.80.249 ※ 文章網址: http://www.ptt.cc/bbs/OOAD/M.1408547232.A.16B.html
BigLoser : 簡單的說就是一開始共用,當發生改變的時候就 08/24 00:32
BigLoser : 做一個新的實做對吧 08/24 00:32
CindyLinz : 嗯, 特別注意入口要保持獨立, 不然以後要再分開的時 08/24 13:05
CindyLinz : 候, 你可能要寫一些難懂又不易正確的程式偵測處境 08/24 13:06
kinanson : 看到這個例子我想到的是用委派 08/28 20:34
CindyLinz : 是把哪個部分 delegation 出去呢? 08/29 01:58
BigLoser : oh...例子我只是隨便舉例的.. 08/29 19:05
kinanson : 回傳值和參數值都一樣,就在實做端再決定傳哪個方法 08/30 08:58
kinanson : 進去,就能解決switch的問題了,如果很簡短就用lamb 08/30 08:58
kinanson : da的方式,連方法都省下來了 08/30 08:58