作者CindyLinz (Cindy Wang)
看板OOAD
标题Re: [问题] 实作内容相同但很可能改变的function
时间Wed Aug 20 23:07:09 2014
※ 引述《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://webptt.com/cn.aspx?n=bbs/OOAD/M.1408547232.A.16B.html
1F:推 BigLoser : 简单的说就是一开始共用,当发生改变的时候就 08/24 00:32
2F:→ BigLoser : 做一个新的实做对吧 08/24 00:32
3F:→ CindyLinz : 嗯, 特别注意入口要保持独立, 不然以後要再分开的时 08/24 13:05
4F:→ CindyLinz : 候, 你可能要写一些难懂又不易正确的程式侦测处境 08/24 13:06
5F:推 kinanson : 看到这个例子我想到的是用委派 08/28 20:34
6F:→ CindyLinz : 是把哪个部分 delegation 出去呢? 08/29 01:58
7F:推 BigLoser : oh...例子我只是随便举例的.. 08/29 19:05
8F:推 kinanson : 回传值和参数值都一样,就在实做端再决定传哪个方法 08/30 08:58
9F:→ kinanson : 进去,就能解决switch的问题了,如果很简短就用lamb 08/30 08:58
10F:→ kinanson : da的方式,连方法都省下来了 08/30 08:58