作者oaz ()
看板Soft_Job
標題Re: [討論] 一段想重構的程式碼
時間Mon Jul 29 15:39:07 2013
※ 引述《yauhh (喲)》之銘言:
: ※ 引述《yauhh (喲)》之銘言:
: : 推 typepeter:如果只是二個,就沒差 問題是重複的Bug,就很慘 07/25 23:56
: : → yauhh:怎麼會沒差呢? 你可要在50~60個classes中,認得有2個共用func 07/26 00:00
: : → typepeter:完全一樣的動作建議還是抽出,copy/paste除錯會更慘 07/26 00:00
: : → yauhh:光是要花費在記憶這種特例的精神,就讓人怨恨死你了. 07/26 00:01
: : → typepeter:今天若是二個function,不抽共同邏輯沒關係 多個,很慘 07/26 00:01
: : → typepeter:如果paste全部都是copy/paste的動作,將有大量時間浪費 07/26 00:02
: : → yauhh:除非你具有獨立性質的邏輯抽出來做個單元,是有用的. 07/26 00:02
: : → typepeter:所以我提到的是: 是可以獨立的邏輯,抽出共同邏輯 07/26 00:03
: : → yauhh:或者趁幾次修改時,將新加的碼放在獨立的單元中. 07/26 00:04
: : → typepeter:不然一樣的邏輯問題 又要去改數個拷貝貼上的重複 很慘 07/26 00:04
: : → yauhh:但是,應該要搞清楚這是在工作. 重構是為了工作,還是為了高興 07/26 00:05
: : → typepeter:工作效率其實可以從減少浪費時間作起 07/26 00:05
: : → typepeter:如果一樣是作事情,建議可以減少機械動作 07/26 00:06
: : → yauhh:那你最好算一算,到底減少浪費了多久時間. 07/26 00:06
: : → typepeter:如果你漏了改某個地方呢? 那之後還要debug 07/26 00:07
: : → typepeter:這是bad smell之中最為人知的其中一個: duplicated code 07/26 00:07
: : → typepeter:算上機械動作,加上檢查是否漏改,以及漏改的debug時間 07/26 00:11
: : → typepeter:應該減少duplicated code會比較節省時間 07/26 00:11
: : → typepeter:此外,若沒有抽共同邏輯 同一個邏輯將會發展無數版本 07/26 00:16
: : → typepeter:之後光是閱讀及維護 可能要找出原本的同樣debug,就累死 07/26 00:16
: 你寫得這樣落落長,我的感覺是,前文中你說 "想說尊重一下主管好了"
: 其實根本沒有尊重,其實你就是覺得,雖然你的想法還沒實現,但就是覺得你自己對嘛.
: 所以別人的建議,你根本沒看. 那又何必來此貼文或推文討論呢?
: 我最近就遭遇一個情況,跟你這事情一樣, class a 和 class b 有一段程式完全相同.
: 但是,經過一番折騰,後來更明確知道的是,二個 class 執行的環境不一樣.
: 一個程式執行在網站上,而另一個程式執行在Windows排程中.
: 因為相信二個程式相同,所以前人在修改 class a 的 func 時, 同時也修改 class b
: 的 func. 而因為相信二個程式是一樣的,所以修改方式就是從 class a func 整段複製
: 然後轉貼到 class b func, 而且沒有測試 class b.
: 最近,我發現 class b 存在問題,是因為 class a func 中加了XSS檢查,而XSS檢查是
: 有去取網站的設定參數. 這就造成 class b 的問題了. class b 執行環境中並沒有
: 網站設定參數可查,而程式的寫法是當XSS檢查無效時,傳回的資料是空值.
: value = xssCheck(value);
: 在這種情況,該死的就是 *相信二段程式邏輯相同* 所以就直接貼而不做個別驗證.
: 雖然這個情況不是像你所做的,把二個 func 抽出來做成同一個,但是,我就做了跟你
: 所講的一模一樣的事情,我把二個 func 共同的一段邏輯拿出來放到 class c 的 func.
: 但重點就是 class a 和 class b 執行環境不同,所以這樣做是很難維護的.
我的看法反而比較不同
一、其實可以類似把 xssCheck() 提出來
某種程度上也說明了,抽象的邏輯就放在 c
特化的實作就分別放在 a, b
而某種程度,提出來後,有利於未來的重構,或是架構改善
class c {
void func() {
}
String xssCheck(String value);
}
class forWindows extens c {
String xssCheck(String value) {
}
}
class forWebsite extends c {
String xssCheck(String value) {
}
}
譬如,未來新增了 Mac, Linux, 手機環境,
是複製 func() 再做相對應的修改的功比較大呢?
還是複製 xssCheck() 再做相對應的修改的功比較大呢?
二、
你也提到了:前人在修改 class a 的 func 時, 同時也修改 class b的 func
難道,未來如果改了十次 class a ,還要再花很大的功夫決定要不要進到 class b
三、重構跟加功能是不一樣的
很明顯,你是在加功能新功能的時侯引入這個錯誤的,而非重構造成
而會讓你引入這個錯誤的原因在於:*相信二段程式邏輯相同*
但是,這反倒說明,因為你們的程式沒有整理過,才會相信二段程式邏輯相同
所以,一個 func() 裡面,哪裡是不同環境可以共用的
哪裡是不同環境不可共用的,加的人並不清楚
反倒,如果整理成跟第一點一樣的例子,是更清楚的
: 而且這給我造成的麻煩是,後來知道 class b 是獨立的執行環境,本來我只是做了
: 改改程式的動作,但是後來卻要思考如何部署的問題.
: 同理,你硬要把 class a 和 class b 拉出共同的 func, 說這樣子很好 debug,
: 那就祝你好運. 但是,最重要的是要勸你,要正視工作,工作是有責任的; 你今天這樣
: 做下去,假如將來減少了維護的效益,你應該要有相同的行動力承擔錯誤並且為事情
: 負責. 否則,像你現在這樣輕忽地嗤笑著 legacy code, 其實很多小朋友都如此狂妄,
: 但是,卻對於程式結構突然大調整,影響到同事及主管的認知,不帶著一點歉意,
: 這說不過去.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.46
→ yauhh:我說過,任何共用的不可提出來,因為我那是二個不同環境的專案 07/30 21:38
→ yauhh:你說要提出來,但客戶根本不想幫你多copy一個lib過去. 07/30 21:38
→ yauhh:第二,這不是加功能,而是前人將不必要的程式轉抄入另一專案, 07/30 21:40
→ yauhh:使專案變成包含錯誤的程式. 雖然不是重構,但也不是加功能. 07/30 21:41