成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

《重構(gòu)---改善既有代碼的設(shè)計》

baihe / 2042人閱讀

摘要:為何重構(gòu)重構(gòu)有四大好處重構(gòu)改進(jìn)軟件設(shè)計如果沒有重構(gòu),程序的設(shè)計會逐漸腐敗變質(zhì)。經(jīng)常性的重構(gòu)可以幫助維持自己該有的形態(tài)。你有一個大型函數(shù),其中對局部變量的使用使你無法采用。將這個函數(shù)放進(jìn)一個多帶帶對象中,如此一來局部變量就成了對象內(nèi)的字段。

 哪有什么天生如此,只是我們天天堅持。 -Zhiyuan

國慶抽出時間來閱讀這本從師傅那里借來的書,聽說還是程序員的必讀書籍。
關(guān)于書的高清下載連接會在文章的最后呈現(xiàn)。
話不多說讓我們一起去領(lǐng)略一下書中風(fēng)采。

如果你讀到這篇文章,說明你也想對你的代碼進(jìn)行重構(gòu),那首先我們就來看一下什么是重構(gòu)?

1. 何謂重構(gòu)?

兩個定義:

名詞形式
重構(gòu)(名詞)對軟件內(nèi)部的一種太縱橫,目的是在不改變軟件可觀察的前提下,提高其可理解性,降低其修改成本。

動詞形式
重構(gòu)(動詞)使用一系列的重構(gòu)手法,在不改變軟件可觀察的行為的前提下,調(diào)整其結(jié)構(gòu)。

上面是重構(gòu)的學(xué)術(shù)解釋,相信一些大神是可以直接一步到位的領(lǐng)略它的意思。我比較喜歡通俗易懂的解釋:
你要問我“重構(gòu)就只是整理代碼嗎?” 在某種角度來說 還真是。 but ! 重構(gòu)肯定有其獨到的地方:
它還提供一種 更高效 且 受控的 代碼整理技術(shù)。

劃重點哈!

作者還對重構(gòu)進(jìn)行了另外兩方面的擴(kuò)展。讓我一起來看下還有什么好玩的:

重構(gòu)的目的是是軟件更容易被理解和修改。

   也就是說讓你的修改但你只能對軟件的可觀察的外部行為造成很小的變化甚至不造成變化。
   和重構(gòu)形成對比的是 **性能優(yōu)化** (我反正一開始覺得這兩個都是一樣的),
   差就差在性能優(yōu)化通常不會改變組件的行為(除了執(zhí)行速度)指揮改變其內(nèi)部結(jié)構(gòu)。
   但是!   
   這兩個的出發(fā)點不同: **性能優(yōu)化往往是代碼較難理解,但是為了得到所需的性能你不得不這么做。**  

重構(gòu)不會改變軟件的可觀察的行為

   也就是說重構(gòu)之后軟件的功能一如以往。所有人除了你自己都不知道有東西改變過(就像鬼子進(jìn)村悄悄的進(jìn)行,打槍的不要)。
   

2. 為何重構(gòu)?

重構(gòu)有四大好處:

重構(gòu)改進(jìn)軟件設(shè)計
如果沒有重構(gòu),程序的設(shè)計會逐漸腐敗變質(zhì)。重構(gòu)很像是在整理代碼,你所做的就是讓所有東西回到應(yīng)出的位置上。經(jīng)常性的重構(gòu)可以幫助維持自己該有的形態(tài)。

重構(gòu)使軟件更容易理解
重構(gòu)可以幫助我們讓代碼更易讀。

重構(gòu)幫助找到bug
對代碼進(jìn)行重構(gòu),可以幫助我們深入理解代碼,對代碼理解的越深,就越能幫我們找到bug。重構(gòu)能夠幫大家更有效地寫出強(qiáng)健的代碼。(這對程序員來說是重點)

重構(gòu)提高編程速度
重構(gòu)可以幫助我們更快速地開發(fā)軟件,因為它阻止系統(tǒng)腐敗變質(zhì),它甚至還可以提高設(shè)計質(zhì)量。(這對Boss來說是重點)

    Any fool can write code that a computer can understand. Good programmers write code that humans can understand. 

任何一個傻瓜都能寫出計算機(jī)可以理解的代碼。唯有寫出人類容易理解的代碼,才是優(yōu)秀的代碼。

3. 何時重構(gòu)?

重構(gòu) 不是 一件應(yīng)該特別撥出時間做的事情,重構(gòu)應(yīng)該隨時隨地進(jìn)行。不應(yīng)該為重構(gòu)而重構(gòu),之所以重構(gòu),是因為我們想做別的什么事,而重構(gòu)可以幫助我們把那些事做好。

作者給出了一個三次原則,讓我們來看一下:

三次法則:事不過三,三則重構(gòu)。

添加功能時重構(gòu)。

修補(bǔ)錯誤時重構(gòu)。

復(fù)審代碼時重構(gòu)。

夠明確了吧! 當(dāng)你發(fā)現(xiàn)你的代碼正符合里面的條件式那就抓緊時間重構(gòu)吧。

4. 怎么對經(jīng)理說?

此章節(jié)只可意會不可言傳。

5. 重構(gòu)的難題

當(dāng)你使用一種可以提高生成力的新技能時,一定要仔細(xì)思考此場景是不是適用。 別人的“好媳婦”在你著沒準(zhǔn)就沒那么好用。

假如你發(fā)現(xiàn)你確實需要重構(gòu),請參考仔細(xì)閱讀下面你可能會遇到的難題:

數(shù)據(jù)庫難在哪?

   1.絕大多數(shù)的程序都和背后的數(shù)據(jù)庫結(jié)構(gòu)緊密的耦合在一起。
   2.數(shù)據(jù)遷移

接口修改難在哪?

      1.已經(jīng)發(fā)布了的接口

何時不該重構(gòu)?

   1.代碼根本無法工作或者太糟糕,重構(gòu)還不如重寫來的簡單。

   2.在項目的最后期限,應(yīng)該避免重構(gòu)

中場休息
文章至此,大家應(yīng)該知道自己現(xiàn)在所處的階段適不適合重構(gòu)心里有點b數(shù)了吧?
不適合就別往下看了,光知道重構(gòu)是什么東西就可以,以后用到再回來看看這篇文章。

下面的文章能告訴你怎么重構(gòu),只是框架,我又不可能把書都抄下來,如果大家真的需要重構(gòu)不如立刻行動買書看,或者下載我的電子書。(免費的哦~)

6. 代碼的壞味道

重復(fù)代碼(Duplicated Code)

過長函數(shù)(Long Method)

過大的類(Large Class)

過長參數(shù)列(Long Parameter List)

發(fā)散式變化(Divergent Change):一個類受多種變化的影響

霰彈式修改(Shotgun Surgery):一種變化引發(fā)多個類相應(yīng)修改

依戀情結(jié)(Feature Envy):函數(shù)對某個類的興趣高過自己所處類的興趣

數(shù)據(jù)泥團(tuán)(Data Clumps):相同的若干項數(shù)據(jù)出現(xiàn)在不同地方,這些綁在一起出現(xiàn)的數(shù)據(jù)應(yīng)該有屬于它們自己的對象

基本類型偏執(zhí)(Private Obsession):很多人不愿意在小任務(wù)上運用小對象

switch驚悚現(xiàn)身(Switch Statements):switch語句會在很多地方重復(fù)出現(xiàn),一改則需全改

平行繼承體系(Parallel Inheritance Hierarchies):當(dāng)你為某一個類增加子類時,也必須為另一個類相應(yīng)增加一個類

冗贅類(Lazy Class):如果一個類不值得存在,那就讓它消失

夸夸其談的未來星(Speculative Generality):預(yù)留的無用的抽象類,無用的抽象參數(shù)

令人迷惑的暫時字段(Temporary Field):類中某個字段只為某些特殊情況而設(shè)置

過度耦合的消息鏈(Message Chains):用戶向一個對象請求另一個對象,然后再向后者請求另一個對象......

中間人(Middle Man):無用的委托,過多的中間層

狎昵關(guān)系(Inappropriate Intimacy):兩個類過于親密,一個類過于關(guān)注另一個類的成員

異曲同工的類(Alternative Classes with DifferentInterfaces):不同名字的類或函數(shù),作者相同的事

不完美的庫類(Incomplete Library Class):類庫設(shè)計不可能完美

純數(shù)據(jù)類(Data Class):一個類擁有一些字段以及用于訪問這些字段的函數(shù),除此之外一無長物

被拒絕的遺贈(Refused Bequest):子類不想繼承超類所有的函數(shù)和數(shù)據(jù),只想挑幾樣來玩

過多的注釋(Comments)

7. 構(gòu)筑測試體系

重構(gòu)的首要前提是擁有一個可靠的測試環(huán)境。

只要寫好一點功能,就立即添加測試,并確保所有測試都完全自動化,讓它們檢查自己的測試結(jié)果。一套測試就是一個強(qiáng)大的bug偵測器,能夠大大縮減查找bug所需要的時間。

撰寫測試代碼的最有用時機(jī)是在開始編程之前。當(dāng)你需要添加特性的時候,先寫相應(yīng)測試代碼。

多運用單元測試。測試你最擔(dān)心出錯的地方,考慮可能出錯的邊界條件。不要因為測試無法捕捉所有bug就不寫測試,因為測試的確可以捕捉到大多數(shù)bug?!盎ê侠頃r間抓出大多數(shù)bug”要好過“窮盡一生抓出所有bug”。

8. 重新組織函數(shù)

提煉函數(shù)(Extract Method)。你有一段代碼可以被組織在一起并獨立出來。將這段代碼放進(jìn)一個獨立函數(shù)中,并將函數(shù)名稱解釋該函數(shù)的用途。

內(nèi)聯(lián)函數(shù)(Inline Method)。一個函數(shù)的本體與名稱同樣清楚易懂。在函數(shù)調(diào)用點插入函數(shù)本體,然后移除該函數(shù)。

內(nèi)聯(lián)臨時變量(InlineTemp)。你有一個臨時變量,只被一個簡單表達(dá)式賦值一次,而它妨礙了其他重構(gòu)手法。將所有對該變量的引用動作,替換為對它賦值的那個表達(dá)式自身。

以查詢?nèi)〈R時變量(Replace Temp withQuery)。你的程序以一個臨時變量保存某一表達(dá)式的運算結(jié)果。將這個表達(dá)式提煉到一個獨立函數(shù)中。將這個臨時變量的所有引用點替換為對新函數(shù)的調(diào)用。此后,新函數(shù)就可被其他函數(shù)使用。

引入解釋性變量(Introduce ExplainingVariable)。你有一個復(fù)雜的表達(dá)式。將該復(fù)雜表達(dá)式(或其中一部分)的結(jié)果放進(jìn)一個臨時變量,以此變量名稱來解釋表達(dá)式用途。

分解臨時變量(Split TemporaryVariable)。你的程序有某個臨時變量被賦值過一次,它既不是循環(huán)變量,也不被用于收集計算結(jié)果。針對每次賦值,創(chuàng)造一個獨立、對應(yīng)的臨時變量。

移除對參數(shù)的賦值(Remove Assignments Parameters)。代碼對一個參數(shù)進(jìn)行賦值。以一個臨時變量取代參數(shù)的位置。

以函數(shù)對象取代函數(shù)(Replace Method with MethodObject)。你有一個大型函數(shù),其中對局部變量的使用使你無法采用ExtractMethod。將這個函數(shù)放進(jìn)一個多帶帶對象中,如此一來局部變量就成了對象內(nèi)的字段。然后你可以在同一個對象中將這個大型函數(shù)分解為多個小型函數(shù)。

替換算法(Substitute Algorithm)。你想要把某個算法替換為另一個更清晰的算法。將函數(shù)本體替換為另一個算法。

9. 在對象之間搬移特性

搬移函數(shù)(MoveMethod)。你的程序中,有個函數(shù)與其所駐之外的另一個類進(jìn)行更多交流:調(diào)用后者,或被后者調(diào)用。在該函數(shù)最常引用的類中建立一個有著類似行為的新函數(shù)。將舊函數(shù)變成一個單純的委托函數(shù),或是將舊函數(shù)完全移除。

搬移字段(MoveField)。你的程序中,某個字段被其所駐類之外的另一個類更多地用到。在目標(biāo)類新建一個字段,修改源字段的所有用戶,令它們改用新字段。

提煉類(Extract Class)。某個類做了應(yīng)該有兩個類做的事。建立一個新類,將相關(guān)的字段和函數(shù)從舊類搬移到新類。

將類內(nèi)聯(lián)化(Inline Class)。某個類沒有做太多事情。將這個類的所有特性搬移到另一個類中,然后移除原類。

隱藏“委托關(guān)系”(Hide Delegate)??蛻敉ㄟ^一個委托來調(diào)用另一個對象。在服務(wù)類上建立客戶所需的所有函數(shù),用以隱藏委托關(guān)系。

移除中間人(Remove Middle Man)。某個類做了過多的簡單委托動作。讓客戶直接調(diào)用受托類。

引入外加函數(shù)(Introduce ForeignMethod)。你需要為提供服務(wù)的類增加一個函數(shù),但你無法修改這個類。在客戶類中建立一個函數(shù),并以第一參數(shù)形式傳入一個服務(wù)類實例。

引入本地擴(kuò)展(Introduce LocalExtension)。你需要為服務(wù)類提供一些額外函數(shù),但你無法修改這個類。建立一個新類,使它包含這些額外函數(shù)。讓這個擴(kuò)展品成為源類的子類或包裝類。

10. 重新組織數(shù)據(jù)

自封裝字段(Self Encapsulate Field)。你直接訪問一個字段,但與字段之間的耦合關(guān)系逐漸變得笨拙。為這個字段建立取值/設(shè)值函數(shù),并且只以這些函數(shù)來訪問字段。

以對象取代數(shù)據(jù)值(Replace Data Value withObject)。你有一個數(shù)據(jù)項,需要與其他數(shù)據(jù)和行為一起使用才有意義。將數(shù)據(jù)項變成對象。

將值對象改為引用對象(Change Value toReference)。你從一個類衍生出許多彼此相等的實例,希望將它們替換為同一個對象。將這個值對象變成引用對象。

將引用對象改為值對象(Change Reference to Value)。你有一個引用對象,很小且不可變,而且不易管理。將它變成一個值對象。

以對象取代數(shù)據(jù)(Replace Array withObject)。你有一個數(shù)組,其中的元素各自代表不同的東西。以對象替換數(shù)組,對于數(shù)組中的每個元素,以一個字段來表示。

復(fù)制“被監(jiān)視數(shù)據(jù)”(Duplicate ObservedData)。你有一些領(lǐng)域數(shù)據(jù)置身GUI控件中,而領(lǐng)域函數(shù)需要訪問這些數(shù)據(jù)。將該數(shù)據(jù)復(fù)制到一個領(lǐng)域?qū)ο笾?。建立一個Observe模式,用以同步領(lǐng)域?qū)ο蠛虶UI對象內(nèi)的重復(fù)數(shù)據(jù)。

將單向關(guān)聯(lián)改為雙向關(guān)聯(lián)(Change Unidirectional Association toBidirectional)。兩個類都需要使用對方特性,但其間只有一條單向鏈接。添加一個反向指針,并使修改函數(shù)能夠同時更新兩條鏈接。

將雙向關(guān)聯(lián)改為單向關(guān)聯(lián)(Change Bidirectional Association toUnidirectional)。兩個類之間有雙向關(guān)聯(lián),但其中一個類如今不再需要另一個類的特性。去除不必要的關(guān)聯(lián)。

以字面常量取代魔法數(shù)(Replace Magic Number with SymbolicConstant)。你有一個字面數(shù)值,帶有特別含義。創(chuàng)造一個常量,根據(jù)其意義為它命名,并將上述的字面數(shù)值替換為這個常量。

封裝字段(Encapsulate Field)。你的類中存在一個public字段。將它聲明為private,并提供相應(yīng)的訪問函數(shù)。

封裝集合(EncapsulateCollection)。有個函數(shù)返回一個集合。讓這個函數(shù)返回該集合的一個只讀副本,并在這個類中提供添加/移除集合元素的函數(shù)。

以數(shù)據(jù)類取代記錄(Replace Record with Data Class)。你需要面對傳統(tǒng)編程環(huán)境中的記錄結(jié)構(gòu)。為該記錄創(chuàng)建一個“啞”數(shù)據(jù)對象。

以類取代類型碼(Replace Type Code withClass)。類之中有一個數(shù)值類行碼,但它并不影響類的行為。以一個新的類替換該數(shù)值類型碼。

以子類取代類型碼(Replace Type Code withSubclass)。你又一個不可變的類型碼,它會影響類的行為。以子類取代這個類型碼。

以State/Strategy取代類型碼(Replace Type Code withState/Strategy)。你有一個類型碼,它會影響類的行為,但你無法通過繼承手法消除它。以狀態(tài)對象取代類型碼。

以字段取代子類(Replace Subclass withFields)。你的各個子類的唯一差別只在“返回常量數(shù)據(jù)”的函數(shù)身上。修改這些函數(shù),使他么返回超類中的某個(新增)字段,然后銷毀子類。

11. 簡化條件表達(dá)式

分解條件表達(dá)式(DecomposeConditional)。你有一個復(fù)雜的條件(if-then-else)語句。從if、then、else三分段落中分別提煉出獨立函數(shù)。

合并條件表達(dá)式(Consolidate ConditionalExpression)。你有一系列條件測試,都得到相同結(jié)果。將這些測試合并為一個條件表達(dá)式,并將這個條件表達(dá)式提煉成為一個獨立函數(shù)。

合并重復(fù)的條件片段(Consolidate Duplicate ConditionalFragments)。在條件表達(dá)式的每個分支上有著相同的一段代碼。將這段重復(fù)的代碼搬移到條件表達(dá)式之外。

移除控制標(biāo)記(Remove ControlFlag)。在一系列布爾表達(dá)式中,某個變量帶有“控制標(biāo)記”的作用。以break語句或return語句取代控制標(biāo)記。

以衛(wèi)語句取代嵌套條件表達(dá)式(Replace nested Conditional with GuardClauses)。函數(shù)中的條件邏輯使人難以看清正常的執(zhí)行路徑。使用衛(wèi)語句表現(xiàn)所有的特殊情況。

以多態(tài)取代條件表達(dá)式(Replace Conditional withPolymorphism)。你手上有個條件表達(dá)式,它根據(jù)對象類型的不同選擇不同的行為。將這個條件表達(dá)式的每個分支放進(jìn)一個子類內(nèi)的覆寫函數(shù)中,然后將原始函數(shù)聲明為抽象函數(shù)。

引入Null對象(Introduce Null Object)。你需要再三檢查某對象是否為null。將null值替換為null對象。

引入斷言(Introduce Assertion)。某一段代碼需要對程序狀態(tài)做出某種假設(shè)。以斷言明確表現(xiàn)這種假設(shè)。

12. 簡化條件表達(dá)式

函數(shù)改名(Rename Method)。函數(shù)的名稱未能揭示函數(shù)的用途。修改函數(shù)的名稱。

添加參數(shù)(Add Parameter)。某個函數(shù)需要從調(diào)用端得到更多信息。為此函數(shù)添加一個對象參數(shù),讓該對象帶進(jìn)函數(shù)所需信息。

移除參數(shù)(Remove Parameter)。函數(shù)本體不再需要某個參數(shù)。將該參數(shù)去除。

將查詢函數(shù)和修改函數(shù)分離(Separate Query from Modifier)。某個函數(shù)既返回對象狀態(tài)值,又修改對象狀態(tài)。建立兩個不同的函數(shù),其中一個負(fù)責(zé)查詢,另一個負(fù)責(zé)修改。

令函數(shù)攜帶參數(shù)(ParameterizeMethod)。若干函數(shù)做了類似的工作,但在函數(shù)本體中卻包含了不同的值。建立單一函數(shù),以參數(shù)表達(dá)那些不同的值。

以明確函數(shù)取代參數(shù)(Replace Parameter with ExplicitMethods)。你有一個函數(shù),其中完全取決于參數(shù)值而采取不同行為。針對該參數(shù)的每一個可能值,建立一個獨立函數(shù)。

保持對象完整(Preserve WholeObject)。你從某個對象中取出若干值,將它們作為某一次函數(shù)調(diào)用時的參數(shù)。改為傳遞整個對象。

以函數(shù)取代參數(shù)(Replace Parameter withMethods)。對象調(diào)用某個函數(shù),并將所得結(jié)果作為參數(shù),傳遞給另一個函數(shù)。而接受該參數(shù)的函數(shù)本身也能夠調(diào)用前一個函數(shù)。讓參數(shù)接受者去除該項參數(shù),并直接調(diào)用前一個函數(shù)。

引入?yún)?shù)對象(Introduce Parameter Object)。某些參數(shù)總是很自然地同時出現(xiàn)。以一個對象取代這些參數(shù)。

移除設(shè)值函數(shù)(Remove Setting Method)。類中的某個字段應(yīng)該在對象創(chuàng)建時被設(shè)值,然后就不再改變。去掉該字段的所有設(shè)值函數(shù)。

隱藏函數(shù)(Hide Method)。有一個函數(shù),從來沒有被其他任何類用到。將這個函數(shù)修改為private。

以工廠函數(shù)取代構(gòu)造函數(shù)(Replace Constructor with FactoryMethod)。你希望在創(chuàng)建對象時不僅僅是做簡單的構(gòu)建動作。將構(gòu)建函數(shù)替換為工廠函數(shù)。

封裝向下轉(zhuǎn)型(Encapsulate Downcast)。某個函數(shù)返回的對象,需要由函數(shù)調(diào)用者執(zhí)行向下轉(zhuǎn)型。將向下轉(zhuǎn)型動作移到函數(shù)中。

以異常取代錯誤碼(Replace Error Code withException)。某個函數(shù)返回一個特定的代碼,用以表示某種錯誤情況。改用異常。

以測試取代異常(Replace Exception withTest)。面對一個調(diào)用者可以預(yù)先檢查的條件,你拋出了一個異常。修改調(diào)用者,使它在調(diào)用函數(shù)之前先做檢查。

13.處理概括關(guān)系

字段上移(Pull Up Field)。兩個子類擁有相同的字段。將該字段移至超類。

函數(shù)上移(Pull Up Method)。有些函數(shù),在各個子類中產(chǎn)生完全相同的結(jié)果。將該函數(shù)移至超類。

構(gòu)造函數(shù)本體上移(Pull Up ConstructorBody)。你在各個子類中擁有一些構(gòu)造函數(shù),他們的本體幾乎完全一致。在超類中新建一個構(gòu)造函數(shù),并在子類構(gòu)造函數(shù)中調(diào)用它。

函數(shù)下移(Push Down Method)。超類中的某個函數(shù)只與部分(而非全部)子類有關(guān)。將這個函數(shù)移到相關(guān)的那些子類去。

字段下移(Push Down Field)。超類中的某個字段只被部分(而非全部)子類用到。將這個字段移到需要它的那些子類去。

提煉子類(ExtractSubclass)。類中的某些特性只被某些(而非全部)實例用到。新建一個子類,將上面所說的那一部分特性移到子類中。

提煉超類(Extract Superclass)。兩個類有相似特性。為這兩個類建立一個超類,將相同特性移至超類。

提煉接口(ExtractInterface)。若干客戶使用類接口中的同一子集,或者兩個類的接口有部分相同。將相同的子集提煉到一個獨立接口中。

折疊繼承體系(Collapse Hierarchy)。超類和子類之間無太大差別。將它們合為一體。

塑造模板函數(shù)(Form TemPlateMethod)。你有一些子類,其中相應(yīng)的某些函數(shù)以相同順序執(zhí)行類似的操作,但各個操作的細(xì)節(jié)上所有不同。將這些操作分別放進(jìn)獨立函數(shù)中,并保持它們都有相同的簽名,于是原函數(shù)也就變得相同了。然后將原函數(shù)上移至超類。

以委托取代繼承(Replace Inheritance withDelegation)。某個子類只使用超類接口中的一部分,或是根本不需要繼承而來的數(shù)據(jù)。在子類中新建一個字段用以保存超類;調(diào)整子類函數(shù)令它改而委托超類;然后去掉兩者之間的繼承關(guān)系。

以繼承取代委托(Replace Delegation withInheritance)。你在兩個類之間使用委托關(guān)系,并經(jīng)常為整個接口編寫許多極簡單的委托函數(shù)。讓委托類來繼承受托類。

14.大型重構(gòu)**

梳理并分解繼承體系(Tease ApartInheritance)。某個繼承體系同時承擔(dān)兩項責(zé)任。建立兩個繼承體系,并通過委托關(guān)系讓其中一個可以調(diào)用另一個。

將過程化設(shè)計轉(zhuǎn)化為對象設(shè)計(Convert Procedural Design toObjects)。你手上有一些傳統(tǒng)過程化風(fēng)格的代碼。將數(shù)據(jù)記錄變成對象,將大塊的行為分成小塊,并將行為移入相關(guān)對象之中。

將領(lǐng)域和表述/顯示分離(Separate Domain fromPresentation)。某些GUI類之中包含了領(lǐng)域邏輯。將領(lǐng)域邏輯分離出來,為它們建立獨立的領(lǐng)域類。

提煉繼承體系(ExtractHierarchy)。你有某各類做了太多工作,其中一部分工作是以大量條件表達(dá)式完成的。建立繼承體系,以一個子類表示一種特殊情況。

有幸看這本書的朋友 請反復(fù)看 反復(fù)看 反復(fù)看!
希望看到這篇文章的人能有收獲,希望多年后翻看此篇文章的我能有更近一步的理解。 加油!
點贊 收藏 走一波。

高清pdf版本:鏈接: https://pan.baidu.com/s/1b69a2M 密碼: x9sf
請享用。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67703.html

相關(guān)文章

  • 重構(gòu)-改善既有代碼設(shè)計》讀書筆記-重構(gòu)

    摘要:重構(gòu)改善既有代碼設(shè)計動詞使用一系列重構(gòu)手法,在不改變軟件可觀察行為的前提下,調(diào)整其結(jié)構(gòu)。修補(bǔ)錯誤時重構(gòu)代碼時重構(gòu)怎么重構(gòu)關(guān)于代碼的重構(gòu)技巧參考重構(gòu)改善既有代碼設(shè)計讀書筆記代碼篇個人博客 重構(gòu)定義 名詞 對軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整,目的是在不改變軟件可觀察行為的前提下,提高其可理解性,降低其修改成本。——《重構(gòu)-改善既有代碼設(shè)計》 動詞 使用一系列重構(gòu)手法,在不改變軟件可觀察行為的前提下,...

    ermaoL 評論0 收藏0
  • 重構(gòu)-改善既有代碼設(shè)計(二) --重構(gòu)原則

    摘要:改進(jìn)代碼設(shè)計的一個重要原則就是消除重復(fù)代碼使軟件更容易被理解優(yōu)秀的代碼能夠讓接收你代碼的付出更少的學(xué)習(xí)成本。重構(gòu)更容易找到重構(gòu)能加深對代碼的理解??梢灾貥?gòu)的情況添加功能時可以重構(gòu)。說明你沒有發(fā)現(xiàn)代碼的錯誤。需要重構(gòu)復(fù)審代碼時可以重構(gòu)。 為何重構(gòu) 重構(gòu)不是銀彈,但是幫助你達(dá)到以下幾個目的 改進(jìn)軟件設(shè)計 不良的程序需要更多的代碼。而代碼越多,正確的修改就越困難。改進(jìn)代碼設(shè)計的一個重要原則就...

    myshell 評論0 收藏0
  • 重構(gòu)-改善既有代碼設(shè)計(五)--重構(gòu)列表

    摘要:什么是重構(gòu)列表重構(gòu)方法需要以一種特定的格式記錄下來。這些重構(gòu)手法到底有多成熟本書中提到的重構(gòu)手法第章。做法創(chuàng)造新函數(shù),以用途命名提煉代碼到函數(shù)中檢查變量名是否符合規(guī)范在源函數(shù)中,將被提煉代碼替換為函數(shù)引用測試范例重構(gòu)前重構(gòu)后 什么是重構(gòu)列表 重構(gòu)方法需要以一種特定的格式記錄下來。按照格式記錄下來的重構(gòu)方法的集合叫重構(gòu)列表 重構(gòu)的記錄格式 每個重構(gòu)手法可分為5個部分: 名稱 構(gòu)建重構(gòu)詞匯...

    davidac 評論0 收藏0
  • 重構(gòu)-改善既有代碼設(shè)計(一)--重構(gòu),第一個案例

    摘要:并根據(jù)目錄選讀第章重構(gòu),第一個案例這是只是一個方法。絕大多數(shù)情況下,函數(shù)應(yīng)該放在它所使用的數(shù)據(jù)的所屬對象內(nèi)最好不要在另一個對象的屬性基礎(chǔ)上運用語句。 什么是重構(gòu) 在不改變代碼外在行為的前提下,對代碼做出修改以改進(jìn)程序內(nèi)部的結(jié)構(gòu)簡單地說就是在代碼寫好后改進(jìn)它的設(shè)計 誰該閱讀這本書 專業(yè)程序員(能夠提高你的代碼質(zhì)量) 資深設(shè)計師和架構(gòu)規(guī)劃師(理解為什么需要重構(gòu),哪里需要重構(gòu)) 閱讀技巧...

    acrazing 評論0 收藏0
  • 重構(gòu)-改善既有代碼設(shè)計(四)--構(gòu)筑測試體系

    摘要:前言重構(gòu)要保證不會影響功能,所以測試很重要每個程序員應(yīng)該都有花幾個小時改一小段代碼的故事。如果有一個完全的測試體系。不多說添加更多測試測試不光只測代碼是否跑通,還要考慮各種情況,代碼是否能做出正確的行為。還應(yīng)該留下一個暴露的單元測試 前言 重構(gòu)要保證不會影響功能,所以測試很重要ps:每個程序員應(yīng)該都有花幾個小時改一小段代碼的故事。如果有一個完全的測試體系。 junit框架 java程序...

    Meathill 評論0 收藏0
  • 重構(gòu)-改善既有代碼設(shè)計(九)--簡化條件表達(dá)式

    摘要:但條件邏輯也是不能忽視的分解條件表達(dá)式問題有一個復(fù)雜的條件語句。沒什么說的動機(jī)重構(gòu)代碼就是錯移除控制標(biāo)志問題在一系列布爾表達(dá)式中,某個變量帶有控制標(biāo)記的作用方法以語句或語句取代控制標(biāo)記動機(jī)控制標(biāo)記大大降低了代碼可讀性。 前言 前面已經(jīng)對類,方法,字段都進(jìn)行了重構(gòu)。貌似看起來很完整了。但條件邏輯也是不能忽視的 分解條件表達(dá)式 問題 有一個復(fù)雜的條件(if-then-else)語句。(判斷...

    missonce 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<