摘要:前言決定把責(zé)任放在哪對于對象設(shè)計是最重要的之一。重構(gòu)可以很好的解決這個問題。方法建立一個新類,將相關(guān)的字段和函數(shù)從舊類搬移到新類。方法將這個類的所有特性搬移到另一個類中,然后移除原類。讓這個擴展品成為源類的子類或包裝類。
前言
決定把責(zé)任放在哪對于對象設(shè)計是最重要的之一。重構(gòu)可以很好的解決這個問題。以下是筆者的重構(gòu)方法
注:客戶:調(diào)用接口
客戶類:使用了接口的類
服務(wù)類:提供服務(wù)的類
你的程序中,有個函數(shù)與其所駐類之外的另一個類進行更多交流:調(diào)用后者或者被后者調(diào)用。
方法在該函數(shù)最常引用的類中建立一個有著類似行為的新函數(shù),將舊函數(shù)編程一個單純的委托函數(shù),或是將舊函數(shù)完全移除。
動機一個類有太多行為,或者與另一個類有太多合作形成高度耦合,為了讓系統(tǒng)中的類更簡單,干凈利落地實現(xiàn)系統(tǒng)交付的任務(wù)。
Move Field(搬移字段)。 問題在你的程序中,某個字段被其所駐類之外的另一個類更多地用到。
方法在目標(biāo)類新建一個字段,修改源字段的所有用戶,令它們改用新字段。
動機對于一個字段,在其所駐類之外的另一個類中有更多的函數(shù)使用了它。
Extract Class(提煉類)。 問題某個類做了應(yīng)該由兩個類做的事情。
方法建立一個新類,將相關(guān)的字段和函數(shù)從舊類搬移到新類。
動機一個類應(yīng)該是一個清楚的抽象,處理一些明確的責(zé)任,實際工作中,類可能不斷擴大,加入很多新功能,這樣的類往往有大量函數(shù)和數(shù)據(jù),這樣的類往往不易理解,所以需要提煉類,將其中獨立的功能提煉出來形成新的類。
Inline Class(將類內(nèi)聯(lián)化)。 問題某個類沒有做太多事情。
方法將這個類的所有特性搬移到另一個類中,然后移除原類。
動機正好與Extra Class相反,如果一個類不再承擔(dān)足夠責(zé)任,不再有多帶帶存在的理由,就需要將這個類塞進另一個類中。
Hide Delegate(隱藏“委托關(guān)系”)。 問題客戶通過一個委托類來調(diào)用另一個對象。比如person類(人)調(diào)用department類(部門)來獲取manager類(經(jīng)理)
方法在服務(wù)類(人)上建立客戶所需的所有函數(shù),用以隱藏委托關(guān)系。
動機將委托關(guān)系隱藏起來,防止委托關(guān)系發(fā)生變化,客戶也得相應(yīng)變化,從而去除這種依賴。
Remove Middle Man(移除中間人)。 問題某個類做了過多的簡單委托動作。
方法讓客戶直接調(diào)用受托類。
動機在Hide Delegate中,封裝受托對象是有好處的,但是也是有代價的:每當(dāng)客戶要使用受托類新特性,就必須在服務(wù)端添加一個簡單委托函數(shù),隨著受托類功能增多,這個過程會讓人痛苦,服務(wù)類變成了一個“中間人”,此時應(yīng)該移除中間人,讓客戶直接調(diào)用受托類。
Introduce Foreign Method(引入外加函數(shù))。 問題你需要為提供服務(wù)的類增加一個函數(shù),但你無法修改這個類。
方法在客戶類中建立一個函數(shù),并以第一參數(shù)形式傳入一個服務(wù)類實例。
動機使用一個類的時候需要一個新的服務(wù),但是不能修改源碼,就得在客戶端編碼,補足函數(shù)所需功能。但是如果為一個服務(wù)類建立了大量外加函數(shù),就不該使用這個重構(gòu)了,應(yīng)該用Introduce Local Extension。
Introduce Local Extension(引入本地擴展)。 問題你需要為服務(wù)類提供一些額外函數(shù),但你無法修改這個類。
方法建立一個新類,使它包含這些額外的函數(shù)。讓這個擴展品成為源類的子類或包裝類。
動機類的作者也無法預(yù)見未來,因此常常沒能為后來者準(zhǔn)備足夠有用的函數(shù)。如果無法修改源碼,需要兩個以上外加函數(shù),就需要將這些函數(shù)組織在一起,放到一個恰當(dāng)?shù)牡胤健?/p> 總結(jié)
1:“決定把責(zé)任放在哪兒” 試用 方法: Move Method , Move Filed ,如果需要都試用先試用 Move field 再使用 Move Method 。
2:類責(zé)任過多 --->Extract class 方法
3:類責(zé)任太少---> inline class
4:一個類使用另一個類 ---> Hide Delegate
5:隱藏委托類導(dǎo)致?lián)碛姓叩慕涌诮?jīng)常變化---> Romove Middle Man
6:不能訪問類的源碼但是想將責(zé)任移到不可修改的類中 ---> Introduce Foreign Methon(少量函數(shù)) & Introduce Local Extension(較多函數(shù))
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/69703.html
摘要:重構(gòu)在不改變代碼的外在的行為的前提下對代碼進行修改最大限度的減少錯誤的幾率本質(zhì)上,就是代碼寫好之后修改它的設(shè)計。重構(gòu)可以深入理解代碼并且?guī)椭业健M瑫r重構(gòu)可以減少引入的機率,方便日后擴展。平行繼承目的在于消除類之間的重復(fù)代碼。 重構(gòu) (refactoring) 在不改變代碼的外在的行為的前提下 對代碼進行修改最大限度的減少錯誤的幾率 本質(zhì)上, 就是代碼寫好之后 修改它的設(shè)計。 1,書中...
摘要:本篇文章主要講解重構(gòu)改善既有代碼的設(shè)計這本書中的第七章在對象之間搬移特性中的知識點,搬移函數(shù)問題你的程序中,有個函數(shù)與其所駐之外的另一個進行更多交流調(diào)用后者,或被后者調(diào)用。動機在之間移動狀態(tài)和行為,是重構(gòu)過程中必不可少的措施。 如果你注定要成為厲害的人, 那問題的答案就深藏在你的血脈里。 本篇文章主要講解 《重構(gòu)---改善既有代碼的設(shè)計》 這本書中的 第七章在對象之間搬移特性中 的知識...
摘要:為何重構(gòu)重構(gòu)有四大好處重構(gòu)改進軟件設(shè)計如果沒有重構(gòu),程序的設(shè)計會逐漸腐敗變質(zhì)。經(jīng)常性的重構(gòu)可以幫助維持自己該有的形態(tài)。你有一個大型函數(shù),其中對局部變量的使用使你無法采用。將這個函數(shù)放進一個單獨對象中,如此一來局部變量就成了對象內(nèi)的字段。 哪有什么天生如此,只是我們天天堅持。 -Zhiyuan 國慶抽出時間來閱讀這本從師傅那里借來的書,聽說還是程序員的必讀書籍。 關(guān)于書的高清下載連...
摘要:并根據(jù)目錄選讀第章重構(gòu),第一個案例這是只是一個方法。絕大多數(shù)情況下,函數(shù)應(yīng)該放在它所使用的數(shù)據(jù)的所屬對象內(nèi)最好不要在另一個對象的屬性基礎(chǔ)上運用語句。 什么是重構(gòu) 在不改變代碼外在行為的前提下,對代碼做出修改以改進程序內(nèi)部的結(jié)構(gòu)簡單地說就是在代碼寫好后改進它的設(shè)計 誰該閱讀這本書 專業(yè)程序員(能夠提高你的代碼質(zhì)量) 資深設(shè)計師和架構(gòu)規(guī)劃師(理解為什么需要重構(gòu),哪里需要重構(gòu)) 閱讀技巧...
閱讀 2565·2021-11-24 09:39
閱讀 3579·2019-08-30 15:53
閱讀 669·2019-08-29 15:15
閱讀 2972·2019-08-26 13:23
閱讀 3320·2019-08-26 10:48
閱讀 714·2019-08-26 10:31
閱讀 847·2019-08-26 10:30
閱讀 2425·2019-08-23 18:32