这是一个工作中遇到的背景比较简单的争论。
有这么一个persistent object,姑且叫它Plan吧。
有这么两个函数:
[code]
Plan getPlanByName(String userid, String planName);
Plan[] getPlans(String userid);
[/code]
getPlanByName内部执行的是:
[code]
select * from Plan where userid=#userid# and plan_name=#planName#
and status=1
order by order_num
[/code]
getPlan的内部执行的是:
[code]
select * from Plan where userid=#userid# and status=1
[/code]
现在,我的pair认为这里面有DRY violation。因为两个select有些重复的东西。pair认为可以这样重构:
[code]
Plan getPlanByName(String userid, String planName){
Plan[] plans = getPlans(userid);
for(int i=0; i<plans.length; i++) {
Plan plan = plans[i];
if(planName.equals(plan.getPlanName())) {
return plan;
}
}
return null;
}
[/code]
而我并不认为应该这样做。我的理由是:
1。原来的实现很简单直观。sql本来就是声明式语言。放着简洁的声明式不用而用复杂的命令式,有走回头路的嫌疑。
2。重构之后代码量更多,还要写更多的单元测试。
3。两个select只见的共同之处更像一种偶然的而不是概念上的重复。让getPlanByName依赖于getPlan感觉增大了耦合。
4。真要觉得select里面的东西有重复,不如创建一个view: v_plans这样这两个select就变成:
[code]
select * from v_plans where userid=#userid#
select * from v_plans where userid=#userid# and plan_name=#planName#
[/code]
避免了status=1的重复。虽然还有"select *"之类的重复,但是这种重复就是语法上的,就像我们在java程序里面可能写无数次"static public void",我们从来不认为这是一个值得改变的重复。
5。效率。
6。系统本来是工作的。即使重构后确实好一点,也不值得花这个工作量。
而pair的主要观点是:
重构后维护上简单,不用维护两个select。
后来和组里其他人沟通,发现持重构想法的不只一个人,相对来说我的观点是比较孤立的。
那么你是怎么看这个问题?
有这么一个persistent object,姑且叫它Plan吧。
有这么两个函数:
[code]
Plan getPlanByName(String userid, String planName);
Plan[] getPlans(String userid);
[/code]
getPlanByName内部执行的是:
[code]
select * from Plan where userid=#userid# and plan_name=#planName#
and status=1
order by order_num
[/code]
getPlan的内部执行的是:
[code]
select * from Plan where userid=#userid# and status=1
[/code]
现在,我的pair认为这里面有DRY violation。因为两个select有些重复的东西。pair认为可以这样重构:
[code]
Plan getPlanByName(String userid, String planName){
Plan[] plans = getPlans(userid);
for(int i=0; i<plans.length; i++) {
Plan plan = plans[i];
if(planName.equals(plan.getPlanName())) {
return plan;
}
}
return null;
}
[/code]
而我并不认为应该这样做。我的理由是:
1。原来的实现很简单直观。sql本来就是声明式语言。放着简洁的声明式不用而用复杂的命令式,有走回头路的嫌疑。
2。重构之后代码量更多,还要写更多的单元测试。
3。两个select只见的共同之处更像一种偶然的而不是概念上的重复。让getPlanByName依赖于getPlan感觉增大了耦合。
4。真要觉得select里面的东西有重复,不如创建一个view: v_plans这样这两个select就变成:
[code]
select * from v_plans where userid=#userid#
select * from v_plans where userid=#userid# and plan_name=#planName#
[/code]
避免了status=1的重复。虽然还有"select *"之类的重复,但是这种重复就是语法上的,就像我们在java程序里面可能写无数次"static public void",我们从来不认为这是一个值得改变的重复。
5。效率。
6。系统本来是工作的。即使重构后确实好一点,也不值得花这个工作量。
而pair的主要观点是:
重构后维护上简单,不用维护两个select。
后来和组里其他人沟通,发现持重构想法的不只一个人,相对来说我的观点是比较孤立的。
那么你是怎么看这个问题?