亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

【重構學習】02何處重構?

2019-11-14 13:38:53
字體:
來源:轉載
供稿:網友

1、重復代碼

  解決方案:

  • 重復代碼位于同一個類:提煉成新函數進行調用
  • 重復代碼位于不同的子類:提煉成函數放進父類
  • 重復代碼位于完全不相干的類:提煉出一個新的類,將重復代碼放進新的類中
  • 重復代碼并非完全相同,存在些微差異性:用模版方法的設計模式解決

2、函數過長和參數列過長

  修改點:

  • 有注釋的地方就可能有修改點,因為一個地方既然值得你去寫注釋,那么就已經存在將其提煉出來的可能性,即使它只有一行代碼
  • 條件表達式和循環處:將分支邏輯和實現細節分離,都可以函數化。而循環可以放到單獨的一個函數里。 

  解決方案:

  • 不存在太多參數和臨時變量的情況:提煉成新函數進行調用(有太多臨時變量和參數,會導致提煉出來的函數可讀性可能并不會得到提升)
  • 臨時變量多:將臨時變量替換成查詢方法,再進行提煉
  • 參數過多:參考參數列過長的處理辦法
  • 依然存在很多臨時變量和參數:用方法對象替代方法,簡單地說搞一個類,臨時變量作為這個的字段,然后代碼提煉為里面的方法

3、過大的類

  解決方案:提煉新的獨立類或者子類

4、參數列過長

  解決方案:

  • 對象替代法:將多個參數放入一個參數對象中,再進行傳遞(不僅提高可讀性,因為傳遞的只是引用所以會少開辟??臻g,提高性能)
  • 函數替代法:看能否將這些參數用函數替代,簡單的說就是將這些參數的計算部分放到一個函數里,返回結果再傳值

5、發散式變化(一個類受多種變化影響,貌似就是單一職責原則)目標:外界變化和需要修改的類一一對應

  修改點:軟件一旦發生多種變化,但是都修改同一個類,說明此類職責重復

  解決方案:找出某種特殊原因造成的所有變化,然后將它們提取到另一個類里面

6、霰彈式修改(一個變化修改多個類)目標:外界變化和需要修改的類一一對應

  修改點:軟件一旦發生變化,造成要修改很多類

  解決方案:找出某種變化引起的不同類中的眾多修改點,將各個類中修改點放到一個類中

7、依戀情節

  修改點:

  當一個類的函數為了計算經常調用另一個類的一大堆的函數時就表示出現了依戀情節。

  1和0的世界里面出現了如此具有文藝氣質的詞,那么我們就用文藝的手法去理解:你們家的女朋友經常去找別人家的漢子時,你多多少少需要知道壞了。

  解決方案:

  如果這段代碼完全依戀另一個類,那么將此部分出現依戀情節的代碼提煉成函數放到另一個類里面(這告訴我們當一個女人完全不愛你的時候要學會放手?)

  然而很多時候并非這么簡單,它兩個類都有依戀呢?(然而很多時候并非這么簡單,她兩個都愛呢?)

  那就判斷哪個類擁有最多被此函數使用的數據,然后就把此函數和那些數據擺在一起。(判斷她愛哪個的優點多一點,就讓她去找誰吧?)

  難怪大家都說程序員都是好男人@_@

  然而Martin大神多說了一句:

  如果先提取方法將這段代碼分割成不同的數個較小的獨立函數上述步驟會簡單很多。(請恕我直言,左腿和左手我要了,刀交給你了,你隨意?)

8、數據泥團

  修改點:

  所謂數據泥團就是指那些經常一起出現的數據,比如一些經常一起出現的參數,舉個例子:分頁參數

  解決方案:

  數據泥團應該擁有他們自己的類,就像幾個好基友需要讓他們住在一起

9、基本類型偏執

  解決方案:

  使用一些小對象比如郵編類,電話號碼類將此類數據應用起來

  使用枚舉類型將或者小對象去替代那些類型碼

10、少用Switch

  解決方案:

  • 用多態來替代Switch,比如用子類去替換狀態碼,或者用狀態模式和策略模式
  • 或者用明確的函數去取代各分支,然后觀察是否能將分支去除

11、平行繼承體系

  修改點:每當你為某個類增加一個子類時,必須為另外一個類增加子類,那么就有問題

  解決方案:讓一個繼承體系的實例去引用另一個繼承體系

12、冗贅類

  解決方案:如果某個類失去了價值,應該將其去掉,比如父子類之間區別不大,那么可以合并,或者將其搬移到另一個類里

13、夸夸其談未來性

  不要去考慮未來性,如果用不到就不值得,未來的事情就交給未來,做好現在的事情即可

14、令人迷惑的暫時字段

  修改點:某個實例變量僅為某種特定情況而設,這樣的代碼就會不易理解,因為你會認為所有時候都會需要它的所有變量。

  解決方案:

  • 通過傳遞NUll參數在變量不合法的情況下傳遞NULL
  • 提煉新的對象以適應此種特殊情況

15、過度耦合的消息鏈

  修改點:一個對象請求另一個對象,然后后者再請求一個變量,然后后者再請求一個變量這就是消息鏈

  解決方案:

  隱藏委托,在前一個類中寫一個函數直接調用第三個類的函數,即嘗試把函數鏈寫在第一個類的一個新函數中 

16、中間人

  修改點:

  過度運用委托關系

  解決方案:

  • 移除中間人,直接和對象打交道
  • 當函數主體和函數名的可讀性一樣清晰時,將其放進調用端
  • 用繼承替代委托

17、狎昵關系

  當看到這兩個字的時候我查了一下字典,狎妓的狎(xia),一個比較猥瑣的字眼,當然你不介意的話也可以稱為搞基關系.

  修改點:

  搞基關系的意思是,兩個類之間花太多時間探究彼此的PRivate部分,就像兩個男人喜歡探究對方的私處一樣。

  解決方案:

  • 通過移動字段和移動方法讓兩個好基友分開(好殘忍,割雞解決的方式太可怕了
  • 將雙向關聯改為單向關聯(也就是說將其中一個變性為妹子就好了
  • 通過提取新類的方式將兩者之間的復雜關系放在一個新類里(將他們分開,讓他們都通過另一個人對話
  • 如果是父子類關系,那么應該用委托替代繼承,讓子類不繼承父類,而把父類對象作為子類的一個屬性(......⊙﹏⊙‖∣) 

18、異曲同工的類

  解決方案:

  其實差不多就是重復代碼的問題,就是兩個做相同事情的函數或者類,唯一的區別在于,當這兩個類差不多的情況下可以提取一個父類

  來解決問題

19、不完美的庫類

  修改點:

  簡而言之就是別人寫的類不好用時,就比如一個引用的動態鏈接庫,你又改不了這個東西時

  解決方案:

  • 添加較少函數或者應用不普遍的情況:就是在客戶類中添加一個函數,然后傳個服務類對象進去
  • 添加較多函數或者應用普遍的情況:就是自己再寫一個類去繼承這個不能改寫的類

  以下并不是重構作者的解決方案:

  因為這本書真的是太老了

  對于應用.net的我們可以考慮用一下partial類或者擴展函數

  partial類示例:

namespace 重構測試程序{    class Program    {        static void Main(string[] args)        {            var test = new Encoding();            Console.WriteLine(test.我就是個中文函數你拿我怎樣吧());            Console.ReadKey();        }    }}namespace System.Text {    public partial class Encoding {        public string 我就是個中文函數你拿我怎樣吧() {            return "有種你打我啊";        }    }}

擴展函數示例(老實說我在實際項目中沒用過這玩意,這玩意雖好,但是吃螃蟹的恐懼讓我并不敢用):

namespace 重構測試程序{    class Program    {        static void Main(string[] args)        {            var test = new StringBuilder();            Console.WriteLine(test.我叫擴展函數("Troy123"));            Console.ReadKey();        }    }    public static class 中文編碼類    {        public static string 我叫擴展函數(this object obj, string name)//擴展函數        {            return name + "最喜歡寫測試代碼的時候用中文了";        }    }}

20、純稚的數據類

  修改點:

  就是說這個類擁有一些字段,并且有一些讀寫這個字段的函數

  更簡單的說就是不用公共字段,不要把需要隱藏的東西暴露出來(不要把你的私處暴露出來(#‵′)凸)

  解決方案:

  字段封裝成方法來調用(.NET的我們用屬性就好了)

  特別是對于容器類的字段要控制好它的封裝,

21、被拒絕的遺贈

  修改點:

  當子類不需要繼承父類多余的屬性和方法時

  這個修改點在Martin看來一般并不是很嚴重,很多時候可以不去理睬,這個視具體情況而定

  我的理解是,如果子類繼承多余的東西并沒有引起誤解和較差的可讀性,那么其實可以不理睬

  解決方案:

  • 去為這個子類新建一個兄弟類,將這些不需要的方法和屬性下移到這個兄弟類
  • 如果子類繼承了饋贈,但是不愿繼承父類其他的·接口,那么可以用委托來替代繼承,可以參考狎昵關系

22、過多的注釋

  修改點:

  這里并不是說注釋不重要,而是說你這段過多的注釋可能是因為你有一段超爛的代碼而導致你不得不寫這么多注釋

  注釋除了用于標注將來之外,更應該用在你那些并無把握的地方,而不是為了一段超爛的但是你理解了的代碼寫一段超長的注釋。

  解決方案:

  • 提煉函數,用詳細的函數名字去表達這段代碼的意思。
  • 因為是java所以Martin還給出了java的斷言去替代注釋的用法,斷言的意思就是如果條件不成立那么某段代碼就不執行(為何我覺得如此像if,好吧這里就不深究了

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
2020国产精品视频| 97av在线视频免费播放| 亚洲精品乱码久久久久久按摩观| 欧美激情在线视频二区| 国产免费一区视频观看免费| 亚洲xxx自由成熟| 久久亚洲私人国产精品va| 欧美激情videos| 国产69精品久久久久9| 欧美性猛交xxxx| 午夜精品www| 亚洲最大成人网色| 国产精品视频免费在线观看| 日韩欧美精品在线观看| 日韩经典第一页| 亚洲a∨日韩av高清在线观看| 欧美国产精品人人做人人爱| 国产精品吹潮在线观看| 97视频色精品| 亚洲图片制服诱惑| 欧美激情第6页| 伊人伊成久久人综合网站| 欧美色图在线视频| 国产精品久久久久久久久久免费| 精品偷拍一区二区三区在线看| 日韩精品在线视频| 夜夜狂射影院欧美极品| 中文字幕视频一区二区在线有码| 国产成人在线播放| 日韩有码在线观看| 欧美在线一级视频| 国产精品视频一区国模私拍| 久久免费视频网| 日韩欧美在线观看| 久久在线精品视频| 亚洲综合日韩中文字幕v在线| 日韩精品中文字| 日本精品va在线观看| 伊人亚洲福利一区二区三区| 久久99国产精品久久久久久久久| 国产在线观看精品| 欧美大成色www永久网站婷| 亚洲国产天堂久久综合网| 欧美日韩激情小视频| 中文字幕日韩在线视频| 久久久久久久久国产精品| 国产日韩欧美在线视频观看| 欧美激情视频一区二区三区不卡| 色悠悠国产精品| 亚洲成人黄色在线观看| 亚洲视频专区在线| 国产精品com| 91久久久久久国产精品| 中文字幕精品www乱入免费视频| 日韩欧美国产免费播放| 91深夜福利视频| 热久久这里只有精品| 亚洲欧美日韩图片| 97热在线精品视频在线观看| 在线播放国产一区中文字幕剧情欧美| 亚洲福利影片在线| 91sao在线观看国产| 亚洲国产91色在线| 亚洲精品久久久久久久久久久| 日韩精品视频在线观看免费| 91精品久久久久久久久久入口| 成人伊人精品色xxxx视频| 高清亚洲成在人网站天堂| 日本精品视频在线观看| 日韩中文字幕欧美| 久久精品一区中文字幕| 国产美女精彩久久| 国产亚洲精品久久久| 国产精品三级久久久久久电影| 亚洲天堂av女优| 日韩欧美极品在线观看| 亚洲国产精品女人久久久| 国产亚洲精品美女久久久久| 久久久久久高潮国产精品视| 97**国产露脸精品国产| 性色av一区二区三区红粉影视| 日韩在线中文字| 国产欧美日韩中文字幕在线| 亚洲aⅴ男人的天堂在线观看| 精品国内产的精品视频在线观看| 亚洲视频axxx| 午夜精品一区二区三区在线| 国产精品99免视看9| 久久精品这里热有精品| 国产精品久久久久久搜索| 国产精品一区二区av影院萌芽| 国产欧美一区二区三区视频| 日韩欧美成人免费视频| 中文字幕欧美国内| 亚洲2020天天堂在线观看| 在线精品播放av| 国产精品美女在线| 丝袜亚洲另类欧美重口| 91精品视频在线看| 亚洲一区二区精品| 久久久久久久久久久久久久久久久久av| www.xxxx精品| 国产精品人人做人人爽| 91亚洲国产成人精品性色| 97视频在线观看成人| 中文字幕视频在线免费欧美日韩综合在线看| 精品福利在线看| 亚洲欧美日韩精品久久奇米色影视| 亚洲美女av黄| 日韩欧美国产免费播放| 欧美一区二区三区免费视| 国产做受高潮69| 一区二区三区四区在线观看视频| 国产日韩欧美中文在线播放| 亚洲精品99999| 成人亚洲欧美一区二区三区| 久久久久久久久久久国产| 欧美大学生性色视频| 97免费视频在线播放| 欧美猛交ⅹxxx乱大交视频| 欧美中在线观看| 麻豆乱码国产一区二区三区| 精品人伦一区二区三区蜜桃免费| 91在线免费看网站| 亚洲视频在线观看免费| 欧美精品第一页在线播放| 国产精品美女免费看| 亚洲综合中文字幕在线观看| 菠萝蜜影院一区二区免费| 啪一啪鲁一鲁2019在线视频| 一区二区三区亚洲| 日韩视频在线免费观看| 777国产偷窥盗摄精品视频| 一本一本久久a久久精品综合小说| 色偷偷88888欧美精品久久久| 欧美亚洲另类视频| 国产精品27p| 日韩h在线观看| 欧美日韩国产一区中文午夜| 成人久久久久久久| 亚洲午夜精品久久久久久久久久久久| 国产精品高清在线观看| 在线电影中文日韩| 夜夜嗨av色综合久久久综合网| 亚洲成人激情在线观看| 热re91久久精品国99热蜜臀| 啪一啪鲁一鲁2019在线视频| 日韩成人av网址| 国产精品久久久久影院日本| 欧美黑人一级爽快片淫片高清| 午夜精品久久久久久久久久久久久| 中文字幕不卡av| 久久久成人精品| 91av在线精品| 国产精品爽黄69| 欧美亚州一区二区三区| 97久久精品人人澡人人爽缅北| 亚洲va欧美va国产综合剧情| 国产成人精品久久亚洲高清不卡| 亚洲自拍欧美色图| 97视频com| 亚洲香蕉在线观看| 亚洲mm色国产网站| 久久久久免费精品国产|