這樣代碼重用?

這是一個工作中遇到的背景比較簡單的爭論。

有這麼一個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。

後來和組裏其他人溝通,發現持重構想法的不只一個人,相對來說我的觀點是比較孤立的。

那麼你是怎麼看這個問題?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章