[翻譯]清除靜態方法三板斧之二——我是否應該保留助手類
原文連結:Should I Leave That Helper Class
宣告:本文與右側相關圖書《深入理解C#(第2版)》二者之間沒有直接關係,之所以選中此書作為相關圖書,是因為二者有個共同特點【Depth】,即對事物的深入探查(再說右邊空一塊兒也不美觀,呵呵)。
書接上回
在上一回《清除靜態方法三板斧之一——靜態方法將使你大吃一驚 》中,我們仔細分析了靜態方法的利弊,現在是做出決斷的時候了。
我手頭的這個專案已被“助手”類(helper class)搞得千瘡百孔。助手類到底是什麼呢?
好問題。 我真的不知道。 也未處理過助手類。
當你向助手類問起,你在做些什麼時……他(助手類)似笑非笑地低頭瞧著他那雙大腳,並答覆一些毫無意義的“廢話”。
如何識別助手類
我們可以通過一些可察覺的常見屬性來辨析我們是否正在處理助手類,以下排序不分先後:
- 沒有任何明確的職責。
- 不包含任何與其自身有關的狀態資料。
- 其中大多數或所有都是靜態方法。
- 類名以helper結尾。(這是個很好的提示!)
- 若在某處新建了助手類,隨後則需要把所有相關引數傳遞給它。
- 位於名為“utilities”(實用工具)的包或名稱空間之下。
助手類是一個含有適用於其他類的輔助方法的類,但實際上就其本身而言算不上事物。助手類是物件導向程式設計的反面。之前我曾寫過有關靜態方法的危害,而助手類通常是靜態方法激增和滋生的結果。
我們將略過任何有關為什麼靜態方法是有害的進一步討論(譯註:相關討論參見上一回),而直接進入到最緊迫的問題……當你在你的程式碼庫中發現一個助手類時……
你應該只是把它留在那裡麼?
(上面的這幅圖片意味著“不”)
當你在高速公路上看到一起尚無人報告的車禍時,你應該只是驅車行駛而不撥打911報警麼?
當你在街上看到一位老婦正在遭人毆打時,你應該僅僅從旁走過麼?
當你開啟你家冰箱,然後開啟蔬菜抽屜並看到袋子裡腐爛的黃瓜糊糊時,你能只是忘記你曾見過它麼?
我不建議你開始就一頭扎進你的遺留程式碼庫中,並立刻著手移除所有的助手類方法。而我要說的是,如果你正在一個助手類方法內工作進而更改某些功能,並且你認為僅僅新增一個附加方法就行了,而且還在使用某些類似“這是約定”的牽強借口,那麼我想拿一支大船槳(譯註:莫非他要動粗?)並教你一些單一職責。不要成為問題的一部分。要成為解決方案的一部分。
這裡有些用於保留助手類並傳播它們的牽強借口。
- 我只是在對程式碼做一個小改動。
- 我不想破壞這個已經可執行的程式。
- 我只是在遵循架構的約定。
- 我不明白它是如何工作的。
- 此功能沒有所屬的類。
- 我是個懶蟲,我也不關心讓世界變得更美好。
- 不管怎樣,世界在2012年即將毀滅(譯註:兩天以後就是2012年,阿彌陀佛\~\~)。
如果你正在使用這些牽強借口的其中之一……別這樣!3000行程式碼的助手類不是一夜之間誕生的。有些呆瓜首先建立了此類,然後更多的呆瓜向其中新增了方法。不要再成為另一個呆瓜。我懇求你。呆瓜已經夠多了。
約翰,我想做正確的事……幫幫我。
什麼?你要這麼做?我將假設你是真誠的……即使我有所保留。
先來發個誓。把你的手放在《計算機程式設計藝術》(The Art of Computer Programming)上並重復我的話。
我,<你的名字>,鄭重宣誓不會傳播邪魔外道或純粹的邪惡,以及被稱為助手類的往往很蒼白的程式碼。
我將擊敗那些助手類、以及助手類方法,並將它們適當地放入所屬的關聯類中,若有悖誓言將遭受不輕於用黃油小刀割去雙臂和雙腿的懲罰(譯註:真狠呀!)。
歡迎新人,在下一帖中我將告訴你一些我用於消除助手類的技巧。
預知後事如何,請看下回《清除靜態方法三板斧之三——如何重構助手類? 》。
相關文章
- [翻譯]清除靜態方法三板斧之三——如何重構助手類?
- [翻譯]清除靜態方法三板斧之一——靜態方法將使你大吃一驚
- 靜態方法查詢類名
- PHP類的靜態(static)方法和靜態(static)變數PHP變數
- Python例項方法、類方法、靜態方法Python
- 我們是否應該警惕人工智慧?人工智慧
- 類的靜態屬性和方法
- eclipse 匯入靜態類,自動程式碼提示靜態方法Eclipse
- 注意!非靜態內部類和非靜態方法的匿名類的this$0屬性
- Python Class 的例項方法/類方法/靜態方法Python
- net 靜態方法與非靜態方法
- Python 靜態方法和類方法的區別Python
- Python的靜態方法和類成員方法Python
- 14 #### 方法分類與使用場景(繫結、靜態、類方法)
- [譯] 繼承 JavaScript 類中的靜態屬性繼承JavaScript
- 物件導向2--靜態方法、類方法、屬性方法物件
- 該翻譯 laravel 10 了Laravel
- Java類、物件以及(靜態)方法的探討Java物件
- 靜態方法
- 靜態變數與靜態方法變數
- 類中靜態回撥函式應用函式
- 【翻譯】Android 應用該是個啥樣子?Android
- 靜態內部類和非靜態內部類區別
- C# 靜態類C#
- [翻譯]Effective Java in Kotlin:1. 考慮用靜態工廠方法而不是構造器JavaKotlin
- JavaScript 靜態屬性與靜態方法JavaScript
- 什麼是靜態語言和動態語言。史上秒懂的大白話翻譯。
- apache動態編譯/靜態編譯區別Apache編譯
- Apache Hadoop文件翻譯之二(HDFS命令指南)ApacheHadoop
- 關於HTTP中文翻譯的討論之二HTTP
- Java的方法靜態方法Java
- Directory類提供的靜態方法去處理目錄
- TypeScript 類靜態屬性TypeScript
- java靜態內部類Java
- 靜態內部類 呼叫
- Python - 物件導向程式設計 - 例項方法、靜態方法、類方法Python物件程式設計
- HTTP 是不是應該翻譯成超文字傳輸協議HTTP協議
- 靜態IP有哪些應用場景及該如何獲取?