看板 Soft_Job 關於我們 聯絡資訊
※ 引述《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