国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

CH02_重構(gòu)的原則(什么是重構(gòu)、為什么重構(gòu)、何時重構(gòu))

這篇具有很好參考價值的文章主要介紹了CH02_重構(gòu)的原則(什么是重構(gòu)、為什么重構(gòu)、何時重構(gòu))。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

什么是重構(gòu)

重構(gòu)(名詞):對軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整,目的是在不改變軟件可觀察行為的前提下,提高其可理解性,降低其修改成本。

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

重構(gòu)的關(guān)鍵在于運(yùn)用大量微小且保持軟件行為的步驟,一步步達(dá)成大規(guī)模的修改。每個單獨(dú)的重構(gòu)要么很小,要么由若干小步驟組合而成。

可觀察行為:整體而言,經(jīng)過重構(gòu)之后的代碼所做的事應(yīng)該與重構(gòu)之前大致一樣。

重構(gòu)與性能優(yōu)化有很多相似之處:兩者都需要修改代碼,并且兩者都不會改變程序的整體功能。兩者的差別在于其目的:重構(gòu)是為了讓代碼“更容易理解,更易于修改”。這可能使程序運(yùn)行得更快,也可能使程序運(yùn)行得更慢。在性能優(yōu)化時,只關(guān)心讓程序運(yùn)行得更快,最終得到的代碼有可能更難理解和維護(hù)。

兩頂帽子

這是一個比喻,使用重構(gòu)技術(shù)開發(fā)軟件時,我把自己的時間分配給兩種截然不同的行為:添加新功能和重構(gòu)。添加新功能時,我們不應(yīng)該修改既有代碼,只管添加新功能。重構(gòu)時我們就不餓能添加功能,只管調(diào)整代碼的結(jié)構(gòu)。

實際開發(fā)過程中,我們可能需要經(jīng)常變換帽子。如果把程序結(jié)構(gòu)改一下,功能的添加會容易得多;新功能添加好了以后發(fā)現(xiàn)代碼難以理解,則繼續(xù)重構(gòu)。

為何重構(gòu)

我們之所以重構(gòu),因為它能讓我們更快——添加功能更快,修復(fù)bug更快。

重構(gòu)改進(jìn)軟件的設(shè)計

沒有重構(gòu),程序的內(nèi)部設(shè)計(架構(gòu))會逐漸腐敗變質(zhì)。當(dāng)人們只為短期目的而修改代碼時,他們經(jīng)常沒有完全理解架構(gòu)的整體設(shè)計,于是代碼逐漸失去了自己的結(jié)構(gòu)。程序員越來越難通過閱讀源碼來理解原來的設(shè)計。

經(jīng)常性的重構(gòu)有助于代碼維持自己該有的形態(tài)。

重構(gòu)使軟件更容易理解

寫讓計算機(jī)理解的代碼很容易,只要能編譯通過并運(yùn)行;但寫出讓別人能理解的代碼則需要下點(diǎn)功夫了。所以我們寫代碼要考慮以后那個修改的人,而且那個人很可能是哦我們自己。

開始進(jìn)行重構(gòu)前,代碼可以正常運(yùn)行,但結(jié)構(gòu)不夠理想。在重構(gòu)上花一點(diǎn)點(diǎn)時間,就可以讓代碼更好地表達(dá)自己的意圖。

重構(gòu)幫助找到Bug

對代碼進(jìn)行重構(gòu),就可以深入理解代碼的所作所為,并立即把新的理解反映在代碼當(dāng)中。搞清楚程序結(jié)構(gòu)的同時,也驗證了所做的一些假設(shè), 更容易將Bug找出來。重構(gòu)能夠幫助我們更有效地寫出健壯的代碼。

重構(gòu)提高編程速度

設(shè)計耐久性假說:通過投入精力改善內(nèi)部設(shè)計,我們增加了軟件的耐久性,從而可以更長時間地保持開發(fā)的快速。

CH02_重構(gòu)的原則(什么是重構(gòu)、為什么重構(gòu)、何時重構(gòu)),讀《重構(gòu)改善既有代碼的設(shè)計第2版》,重構(gòu)

行業(yè)的陳規(guī)認(rèn)為:良好的設(shè)計必須在開始編程之前完成,因為一旦開始編寫代碼,設(shè)計就只會逐漸腐敗。重構(gòu)改變了這個圖景。現(xiàn)在我們可以改善已有代碼的設(shè)計,因此我們可以先做一個設(shè)計,然后不斷改善它,哪怕程序本身的功能也在不斷發(fā)生著變化。由于預(yù)先做出良好的設(shè)計非常困難,想要既體面又快速地開發(fā)功能,重構(gòu)必不可少。

何時重構(gòu)

三次法則

  • 第一次做某件事時只管去做
  • 第二次做類似的事會產(chǎn)生反感,但無論如何還是可以去做
  • 第三次再做類似的事,你就應(yīng)該重構(gòu)。

預(yù)備性重構(gòu):讓添加新功能更容易

重構(gòu)的最佳時機(jī)就在添加新功能之前。例如有個函數(shù)提供了我們需要的大部分功能,只是有幾個變量跟我們需要的沖突,通常我們的做法使把這個函數(shù)復(fù)制過來,修改幾個值。這樣做會導(dǎo)致重復(fù)代碼(將來有可能需要修改兩處)。使用函數(shù)參數(shù)化(310)進(jìn)行重構(gòu)后,只需要調(diào)用這個函數(shù),傳入需要的參數(shù)。

修復(fù)bug時的情況也是一樣。在尋找問題根因時,可能會發(fā)現(xiàn):如果把3段一模一樣且都會導(dǎo)致錯誤的代碼合并到一處,問題修復(fù)起來會容易得多。

幫助理解的重構(gòu):使代碼更易懂

重構(gòu)帶來的幫助不僅發(fā)生在將來——常常是立竿見影。先在一些小細(xì)節(jié)上使用重構(gòu)來幫助理解,給一兩個變量改名,讓它們更清楚地表達(dá)意圖,以方便理解,或是將一個長函數(shù)拆成幾個小函數(shù)。當(dāng)代碼變得更清晰一些時就會看見之前看不見的設(shè)計問題。

撿垃圾式重構(gòu)

幫助理解的重構(gòu)還有一個變體:已經(jīng)理解代碼在做什么,但發(fā)現(xiàn)它做得不好,例如邏輯不必要地迂回復(fù)雜,或者兩個函數(shù)幾乎完全相同,可以用一個參數(shù)化的函數(shù)取而代之。有兩種處理方式:如果垃圾很容易重構(gòu),馬上重構(gòu)它;如果重構(gòu)需要花一些精力,記錄下來,完成當(dāng)下的任務(wù)再回來重構(gòu)它。

有計劃的重構(gòu)

一般項目計劃上沒有專門留給重構(gòu)的時間,絕大多數(shù)重構(gòu)都在做其他事的過程中自然發(fā)生。如果團(tuán)隊過去忽視了重構(gòu),那么常常會需要專門花一些時間來優(yōu)化代碼庫,以便更容易添加新功能。

長久以來,人們認(rèn)為編寫軟件是一個累加的過程:要添加新功能,我們就應(yīng)該增加新代碼。但優(yōu)秀的程序員知道,添加新功能最快的方法往往是先修改現(xiàn)有的代碼,使新功能容易被加入。所以,軟件永遠(yuǎn)不應(yīng)該被視為“完成”。每當(dāng)需要新能力時,軟件就應(yīng)該做出相應(yīng)的改變。越是在已有代碼中,這樣的改變就越顯重要。

何時不應(yīng)該重構(gòu)

如果有一塊凌亂的代碼,但并不需要修改它,那么就不需要重構(gòu)它。如果丑陋的代碼能被隱藏在一個API之下,暫時容忍它繼續(xù)保持丑陋。只有當(dāng)需要理解其工作原理時,對其進(jìn)行重構(gòu)才有價值。

另一種情況是,如果重寫比重構(gòu)還容易,就別重構(gòu)了。

重構(gòu)的挑戰(zhàn)

延緩新功能開發(fā)

很多人認(rèn)為,花在重構(gòu)的時間是在拖慢新功能的開發(fā)進(jìn)度?!爸貥?gòu)會拖慢進(jìn)度”這種看法仍然很普遍,這可能是導(dǎo)致人們沒有充分重構(gòu)的最大阻力所在。

重構(gòu)的唯一目的就是讓我們開發(fā)更快,用更少的工作量創(chuàng)造更大的價值。

有一種情況確實需要權(quán)衡取舍:有時會看到一個(大規(guī)模的)重構(gòu)很有必要進(jìn)行,而馬上要添加的功能非常小,這時可以先把新功能加上,然后再做這次大規(guī)模重構(gòu)。

測試

如果開發(fā)環(huán)境(開發(fā)工具)能很好的支持自動化重構(gòu),則可以信任這些重構(gòu);如果不能最好有完備的測試套件(測試環(huán)境、測試代碼、單元測試等)。

遺留代碼

遺留代碼往往很復(fù)雜,可能也沒有充足的測試,關(guān)鍵還是別人寫的。如果不幸遇到,沒有什么好辦法:沒測試就加測試、隨時重構(gòu)相關(guān)的代碼(不建議嘗試一鼓作氣把復(fù)雜而混亂的遺留代碼重構(gòu)成漂亮的代碼)。

重構(gòu)、架構(gòu)和YAGNI

YAGNI:“你不需要它(you are`t going to need it)”。YAGNI并不是“不做架構(gòu)性思考”的意思,不過確實有人以這種欠考慮的方式做事。

重構(gòu)對架構(gòu)最大的影響在于,通過重構(gòu),我們能得到一個設(shè)計良好的代碼庫,使其能夠優(yōu)雅地應(yīng)對不斷變化的需求?!霸诰幋a之前先完成架構(gòu)”這種做法最大的問題在于,它假設(shè)了軟件的需求可以預(yù)先充分理解。但經(jīng)驗顯示,這個假設(shè)很多時候甚至可以說大多數(shù)時候是不切實際的。只有真正使用了軟件、看到了軟件對工作的影響,人們才會想明白自己到底需要什么。

重構(gòu)與軟件開發(fā)過程

重構(gòu)是否有效,與團(tuán)隊采用的其他軟件開發(fā)實踐緊密相關(guān)。

重構(gòu)的第一塊基石是自測試代碼。

如果一支團(tuán)隊想要重構(gòu),那么每個團(tuán)隊成員都需要掌握重構(gòu)技能,能在需要時開展重構(gòu),而不會干擾其他人的工作。

自測試代碼、持續(xù)集成、重構(gòu)三者之間有著很強(qiáng)的協(xié)同效應(yīng)。

重構(gòu)與性能

重構(gòu)可能使軟件運(yùn)行更慢,但它也使軟件的性能優(yōu)化更容易。先寫出可調(diào)優(yōu)的軟件,然后調(diào)優(yōu)它以求獲得足夠的速度。

編寫構(gòu)造良好的程序,不對性能投以特別的關(guān)注,直至進(jìn)入性能優(yōu)化階段——那通常是在開發(fā)后期。一旦進(jìn)入該階段,再遵循特定的流程來調(diào)優(yōu)程序性能。

在性能優(yōu)化階段,首先應(yīng)該用一個度量工具來監(jiān)控程序的運(yùn)行,讓它告訴我程序中哪些地方大量消耗時間和空間。這樣就可以找出性能熱點(diǎn)所在的一小段代碼。然后集中關(guān)注這些性能熱點(diǎn),并使用持續(xù)關(guān)注法中的優(yōu)化手段來優(yōu)化它們。文章來源地址http://www.zghlxwxcb.cn/news/detail-673869.html

到了這里,關(guān)于CH02_重構(gòu)的原則(什么是重構(gòu)、為什么重構(gòu)、何時重構(gòu))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Elasticsearch專欄 02】深入探索:Elasticsearch為什么使用倒排索引而不是正排索引

    Elasticsearch選擇使用倒排索引而不是正排索引,主要是基于倒排索引在處理全文搜索和大規(guī)模數(shù)據(jù)集時的優(yōu)勢。下面將詳細(xì)解釋為什么Elasticsearch更傾向于使用倒排索引,并提供一些簡化的代碼片段來說明這兩種索引結(jié)構(gòu)的基本差異。 正排索引是一種將文檔映射到其包含的單詞

    2024年02月22日
    瀏覽(32)
  • Netty為什么高效,為什么這么受歡迎?

    Netty為什么高效,為什么這么受歡迎?

    上篇文章通過 Java NIO 的處理流程與 Netty 的總體流程比較,并結(jié)合 Netty 的源碼,可以更加清晰地理解Netty。本文將結(jié)合源碼詳細(xì)解析Netty的高效和強(qiáng)大功能的設(shè)計原理,學(xué)習(xí) Netty 是如何實現(xiàn)其卓越的性能和功能特性,也希望可以在日后工作中利用到 Netty 的設(shè)計思想。 我們先看

    2024年02月12日
    瀏覽(40)
  • Redis—Redis介紹(是什么/為什么快/為什么做MySQL緩存等)

    Redis—Redis介紹(是什么/為什么快/為什么做MySQL緩存等)

    一、Redis是什么 Redis 是一種 基于內(nèi)存的數(shù)據(jù)庫 ,對數(shù)據(jù)的讀寫操作都是在內(nèi)存中完成,因此讀寫速度非???,常用于 緩存,消息隊列、分布式鎖等場景 。 ????????Redis 提供了多種數(shù)據(jù)類型來支持不同的業(yè)務(wù)場景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、

    2024年02月10日
    瀏覽(28)
  • AIMD 為什么收斂(tcp reno/cubic 為什么好)

    AIMD 為什么收斂(tcp reno/cubic 為什么好)

    TCP 擁塞控制目標(biāo)是緩解并解除網(wǎng)絡(luò)擁塞,讓所有流量公平共享帶寬,合在一起就是公平收斂。 AIMD(幾乎所有與擁塞控制相關(guān)的協(xié)議或算法都有 AIMD 的影子,包括 RoCE,BBRv2) 為什么收斂?我一般會給出下面的老圖: 雖然只展示了兩條流的收斂,但 n 條流收斂的展示無非就是將

    2024年02月06日
    瀏覽(32)
  • tcp 為什么要三次握手,兩次不行嗎?為什么?

    TCP使用三次握手(Three-Way Handshake)的過程是為了確保雙方建立起可靠的通信連接,并在連接的建立過程中協(xié)商必要的參數(shù)。兩次握手是不夠的,原因主要有以下幾點(diǎn): 防止已失效的連接請求被接受: 假設(shè)有A和B兩臺主機(jī),A向B發(fā)送了一個連接請求,但由于某些原因?qū)е逻B接建

    2024年02月20日
    瀏覽(35)
  • 為什么美國加息,會讓硅谷銀行破產(chǎn)?美聯(lián)儲為什么要加息?

    所有回答由 AI 生產(chǎn) 答 : 美國加息會導(dǎo)致國債利率上升,此時購買國債的銀行獲得的利息收益會比利率較低時少,因此國債的市場價格就會下降,從而導(dǎo)致銀行持有的這些國債資產(chǎn)減值。 答 : 美國加息意味著美國央行(即聯(lián)邦儲備委員會)將提高其官方基準(zhǔn)利率,這意味著

    2023年04月23日
    瀏覽(32)
  • 為什么用python做人工智能,為什么人工智能用python

    為什么用python做人工智能,為什么人工智能用python

    大家好,給大家分享一下python人工智能為什么放到最后才學(xué),很多人還不知道這一點(diǎn)。下面詳細(xì)解釋一下。現(xiàn)在讓我們來看看! Source code download: 本文相關(guān)源碼 一、為何人工智能(AI)首選Python? 讀完這篇文章你就知道了。我們看谷歌的TensorFlow基本上所有的代碼都是C++和Python,

    2024年02月22日
    瀏覽(22)
  • 重構(gòu)改善既有代碼的設(shè)計-學(xué)習(xí)(一):封裝

    重構(gòu)改善既有代碼的設(shè)計-學(xué)習(xí)(一):封裝

    ? ? ? ? ? 一些記錄性結(jié)構(gòu)(例如hash、map、hashmap、dictionary等),一條記錄上持有什么字段往往不夠直觀。如果其使用范圍比較寬,這個問題往往會造成許多困擾。所以,記錄性結(jié)構(gòu)應(yīng)該被封裝成為一個類。 ? ? ? ? 例如: ? ? ? ? 應(yīng)該被重構(gòu)為: ? ????????我們通常鼓

    2024年01月21日
    瀏覽(24)
  • 【PDF密碼】PDF文件為什么無法修改?為什么PDF文檔不支持編輯?

    【PDF密碼】PDF文件為什么無法修改?為什么PDF文檔不支持編輯?

    pdf文件大家應(yīng)該都經(jīng)常接觸,但是不知道大家會遇到這種情況:有些PDF文件打開之后無法編輯?是什么原因呢?今天我們來分析一下都是那些原因?qū)е碌摹?首先我們可以考慮一下,PDF文件中的內(nèi)容是否是圖片,如果確認(rèn)是圖片文件,那么我們想要編輯,就可以先使用PDF編輯器

    2024年01月22日
    瀏覽(30)
  • I2C中為什么線與?為什么要有上拉電阻?

    I2C中為什么線與?為什么要有上拉電阻?

    ????????首先,連接到 I2C 上的設(shè)備是開漏輸出的。以漏極開漏輸出(OD)為例,是指將輸出級電路結(jié)構(gòu)改為一個漏極開路輸出的 MOS 管。這樣做的好處在于: 防止短路。 可以實現(xiàn) “線與”邏輯 ,可以減少一個與門的使用,簡化電路。 結(jié)論: I2C支持多個主設(shè)備與多個從設(shè)

    2024年02月09日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包