Re: [問題] 實作內容相同但很可能改變的function

看板OOAD作者 (Cindy Wang)時間9年前 (2014/08/20 23:07), 編輯推噓4(406)
留言10則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《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

08/24 00:32, , 1F
簡單的說就是一開始共用,當發生改變的時候就
08/24 00:32, 1F

08/24 00:32, , 2F
做一個新的實做對吧
08/24 00:32, 2F

08/24 13:05, , 3F
嗯, 特別注意入口要保持獨立, 不然以後要再分開的時
08/24 13:05, 3F

08/24 13:06, , 4F
候, 你可能要寫一些難懂又不易正確的程式偵測處境
08/24 13:06, 4F

08/28 20:34, , 5F
看到這個例子我想到的是用委派
08/28 20:34, 5F

08/29 01:58, , 6F
是把哪個部分 delegation 出去呢?
08/29 01:58, 6F

08/29 19:05, , 7F
oh...例子我只是隨便舉例的..
08/29 19:05, 7F

08/30 08:58, , 8F
回傳值和參數值都一樣,就在實做端再決定傳哪個方法
08/30 08:58, 8F

08/30 08:58, , 9F
進去,就能解決switch的問題了,如果很簡短就用lamb
08/30 08:58, 9F

08/30 08:58, , 10F
da的方式,連方法都省下來了
08/30 08:58, 10F
文章代碼(AID): #1JzBcW5h (OOAD)
文章代碼(AID): #1JzBcW5h (OOAD)