偶然發現重構這本書推出了js版,果斷入手,名書之一,尤爲仍是js版本,相較於java版來講,確定更適合前端閱讀,購買來自當當。html
本書做者 馬丁·福勒,主要著做有:分析模式---可重用對象模型、Kent Beck. 規劃極限編程、 UML精粹---標準對象建模語言簡明指南(第三版)、 企業應用架構模式以及本書。本書內容以各類代碼的「壞味道」,來推動合適的重構手法,和初版內容相比,有一些部分是更新了(那些被淘汰的代碼、不合適的例子)。但主體思想仍是沒有變,總而言之是一本值得讀的好書前端
重構,改善既有代碼設計(第二版)java
下面來分享本文章核心內容,讀書筆記。程序員
原文:重構技術就是以微小的步伐修改程序。若是你犯下錯誤,很容易即可發現它。es6
感悟:細碎的步子前進,能夠使得咱們避免bug,在實際中,咱們應當是以稍大的步驟來改進,當遇到問題時,撤銷咱們的更改 轉而走向細碎的步子推動算法
原文:重構前,先檢查本身是否擁有一套可靠的測試集,這些測試必須有自我檢視能力。編程
感悟:和鮑勃大叔在代碼整潔之道(clean code)中的觀點一致,先編寫測試,才能再開發。重構亦如此json
原文:一些重構手法也會顯著地影響性能。但即使如此,我一般也不去管它,繼續重構,由於有了一份結構良好的代碼,回頭調優其性能也容易得多設計模式
感悟:不要由於性能問題而不敢重構,一份好的代碼再去調優是很容易的,更況且在如今各類緩存、壓縮、瀏覽器的優化等加持下,真正影響性能的每每只是咱們項目中的某一小塊代碼數組
原文:每當感受須要以註釋來講明點什麼的時候,咱們就把須要說明的東西寫進一個獨立函數中,並以其用途(而非實現手法)命名。咱們能夠對一組甚至短短一行代碼作這件事。哪怕替換後的函數調用動做比函數自身還長,只要函數名稱可以解釋其用途,咱們也該絕不猶豫地那麼作。關鍵不在於函數的長度,而在於函數「作什麼」和「如何作」之間的語義距離。
感悟:一個最好的程序就是不須要任何註釋,本身自己就已經說明了程序的運轉流程,這和在初入行時,老師讓咱們多寫註釋,最好每一行都寫的不太同樣,但也不算老師或者馬丁大叔說錯了,初入行時,咱們什麼都不懂,常常編寫匪夷所思的代碼,因此註釋很必要,可是更好的註釋是咱們自身的代碼。這個在不少代碼規範中或者一些優秀的代碼也都是這麼作的。
tips:好的代碼中,註釋應該是短小精悍的,應該只是咱們須要描述一些很是規作法的說明,或者隱患的說明以及咱們某些時候冒出的一些對程序有用但沒有作的想法
原文:事實上,撰寫測試代碼的最好時機是在開始動手編碼以前。當我須要添加特性時,我會先編寫相應的測試代碼。聽起來離經叛道,其實否則。編寫測試代碼其實就是在問本身:爲了添加這個功能,我須要實現些什麼?編寫測試代碼還能幫我把注意力集中於接口而非實現(這永遠是一件好事)。預先寫好的測試代碼也爲個人工做安上一個明確的結束標誌:一旦測試代碼正常運行,工做就能夠結束了
感悟:編寫測試代碼的最佳時機是在開始編寫以前,將業務最終效果編爲測試代碼,有利於咱們明白咱們爲何要作這個功能,須要實現什麼樣的東西。在做者看來,不管是新增功能、修改功能、bug fix都應該測試先行。這是一種正確的思路,也是咱們如今不少程序員中所缺乏的。大部分人作的都是先寫功能,在寫測試。甚至一些公司連測試代碼都沒有
注: 本書經典語句比較多,只挑選了其中我以爲感悟最深入的五點寫出
Kent Beck提出了「兩頂帽子」的比喻。使用重構技術開發軟件時,我把本身的時間分配給兩種大相徑庭的行爲:添加新功能和重構。添加新功能時,我不該該修改既有代碼,只管添加新功能。經過添加測試並讓測試正常運行,我能夠衡量本身的工做進度。重構時我就不能再添加功能,只管調整代碼的結構。此時我不該該添加任何測試(除非發現有先前遺漏的東西),只在絕對必要(用以處理接口變化)時才修改測試軟件開發過程當中,我可能會發現本身常常變換帽子。首先我會嘗試添加新功能,而後會意識到:若是把程序結構改一下,功能的添加會容易得多,因而我換一頂帽子,作一下子重構工做。程序結構調整好後,我又換上原先的帽子,繼續添加新功能。新功能正常工做後,我又發現本身的編碼形成程序難以理解,因而又換上重構帽子……整個過程或許只花10分鐘,但不管什麼時候我都清楚本身戴的是哪一頂帽子,而且明白不一樣的帽子對編程狀態提出的不一樣要求。
需求變化
需求的變化使重構變得必要。若是一段代碼能正常工做,而且不會再被修改,那麼徹底能夠不去重構它。能改進之固然很好,但若沒人須要去理解它,它就不會真正妨礙什麼。
新需求(預備性重構)
重構的最佳時機在添加新功能以前,在動手添加新功能以前,我會看看現有的代碼庫,此時常常會發現:若是對代碼結構作一點微調,工做會變的容易不少(舊代碼重構來擴展新功能)
幫助理解的重構
我須要先理解代碼在作什麼,而後才能着手修改。這段代碼多是我寫的,也多是別人寫的。一旦我須要思考「這段代碼到底在作什麼」,我就會自問:能不能重構這段代碼,令其一目瞭然?我可能看見了一段結構糟糕的條件邏輯,也可能但願複用一個函數,但花費了幾分鐘才弄懂它到底在作什麼,由於它的函數命名實在是太糟糕了。這些都是重構的機會。
撿垃圾式重構
當我在重構過程當中或者開發過程當中,發現某一塊很差,若是很容易修改能夠順手修改,但若是很麻煩,我又有緊急事情時候,能夠選擇記錄下來(但不表明我就一點都作不到把他變好)。就像野營者的老話:至少讓營地比你到達時更乾淨,長此以往,營地就很是乾淨(來自營地法則)
見機行事的重構
重構常常發生在咱們平常開發中,隨手可改的地方。當咱們發現很差的味道,就要將他重構
長期的重構
能夠在一個團隊內,達成共識。當你們遇到時候,就改正它例如,若是想替換一個正在使用的庫,能夠先引入一層新的抽象,使其兼容新舊兩個庫的接口,而後一旦調用方徹底改成了使用這層抽象,替換下面的庫就會如容易的多
複審代碼(code review)時的重構
開發者與審查者保持持續溝通,使得審查者可以深刻了解邏輯,使得開發者能充分認同複審者的修改意見(結對編程)
Don Roberts給了我一條準則:第一次作某件事時只管去作;第二次作相似的事會產生反感,但不管如何仍是能夠去作;第三次再作相似的事,你就應該重構正如老話說的:事不過三,三則重構
改進軟件的設計(也能夠說是增長程序的健壯、耐久)
經過投入精力改善內部設計,咱們增長了軟件的耐久性,從而能夠更長時間地保持開發的快速
使得代碼更容易理解
找到潛在bug
提升編程速度
延緩新功能開發
實際上,這只是一部分不理解重構真正緣由的人的想法,重構是爲了從長效上見到收益,一段優秀的代碼能讓咱們開發起來更順手,要權衡好重構與新功能的時機,好比一段不多使用的代碼。就不必對他重構
代碼全部權
有時候咱們常常會遇到,接口發佈者與調用者不是同一我的,而且甚至多是用戶與咱們團隊的區別,在這種狀況下,須要使用函數更名手法,重構新函數,而且保留舊的對外接口來調用新函數,而且標記爲不推薦使用。
分支的差別
常常會有長期不合並的分支,一旦存在時間過長,合併的可能性就越低,尤爲是在重構時候,咱們常常要對一些東西進行更名和變化,因此最好仍是儘量短的進行合併,這就要求咱們儘量的將功能顆粒化,若是遇到還沒開發完成且又沒法細化的功能,咱們能夠使用特性開關對其隱藏
缺少一組自測試的代碼
一組好的測試代碼對重構頗有意義,它能讓咱們快速發現錯誤,雖然實現比較複雜,但他頗有意義
遺留代碼
不可避免,一組別人的代碼使得咱們很煩惱,若是是一套沒有合理測試的代碼則使得咱們更加苦惱。這種狀況下,咱們須要增長測試,能夠運用重構手法找到程序的接縫,再接縫處增長測試,雖然這可能有風險,但這是前進所必需要冒的風險,同時不建議一氣呵成的把整個都改完,更傾向於可以逐步地推動
本書之中的核心之一:簡單來講就是碰到什麼樣子的代碼,你就須要警戒起來,須要進行重構了!
本文章中主要分紅三部分進行描述,第一部分爲名字就是它的術語,第二部分爲詳解:它的描述及一些實際場景,第三部分重構:就是他的參考重構手法,但這些手法僅做爲參考,有時咱們可能會須要更多的手法
神祕命名
詳解:也包含那些隨意的abc或者漢語拼音,總之一切咱們看不懂的、爛的都算,好的命名能節省咱們很大的時間
重構:改變函數聲明、變量更名、字段更名
重複代碼
詳解:天然這個就好理解了,只要是咱們看到兩段類似的語法均可以肯定爲這段代碼能夠提煉,一般提煉出來會更好,固然這個要看具體狀況,我的感受真的遇到那種只有兩處,且代碼使用地方八杆子打不着,在代碼穩按期間也不用浪費這個時間(這個時間不止體如今改動過程,也包括你可能由於改動致使的隱藏bug,尤爲是系統核心模塊,一旦出現問題只能立刻回滾,不會給你時間去找問題
重構:提煉函數、移動語句、函數上移等手法
過長的函數
描述:短小纔是精悍!好比一些條件分支、一個函數作了不少事情、循環內的處理等等的都是應該重構的
重構:提煉函數(經常使用)、以查詢取代臨時變量、引入參數對象、保持對象完整性、以命令取代參數(消除一些參數)、分解條件表達式、以多態取代條件表達式(應對分支語句)、拆分循環(應對一個循環作了不少事情)
過長的參數列表
描述:正常來講,函數中所需的東西應該以參數形式傳入,避免全局變量的使用,但過長的參數列表其實也很噁心。
重構:查詢取代參數、保持對象完整、引入參數對象、移除標記參數、函數組合成類
全局數據
描述:最多見的就是全局變量,但類變量與單例模式也有這樣的問題,咱們一般沒法保證項目啓動後不被修改,這就很容易形成詭異的bug,而且很難追查到
重構:封裝變量
可變數據
描述:數據的可變性和全局變量同樣,若是我其餘使用者修改了這個值,而引起不可理喻的bug。 這是很難排查的。
重構:封裝變量,拆分變量,移動語句、提煉函數,查詢函數和修改函數分離,移除設值函數,以查詢取代變量函數組合成類
發散式變化
描述:發散式變化是指某個模塊常常由於不一樣的緣由在不一樣的方向上變化了(能夠理解爲某一處修改了,形成其餘模塊方向錯亂)
重構:拆分階段、搬移函數、提煉函數、提煉類
霰彈式修改
描述:和發散式變化接近,卻又相反。咱們每次修改一個功能或者新增一個功能都須要對多處進行修改;而且隨着功能增多咱們可能還須要修改更多。 這樣程序時是很不健康的,其實我我的理解爲:霰彈用來描述發散式變化更好,想一想霰彈是一個點發射出去變成不少。而本條應該用另外一個詞來描述更好,但我還想不到叫什麼詞。或許叫多路並進?僅限我的觀點,每一個人理解可能不同,建議以做者爲準
重構:搬移函數、搬移字段、函數組合成類、函數組合成變換、拆分階段、內聯函數、內聯字段
依戀情結
描述:一個模塊內的一部分頻繁的和外面的模塊進行交互溝通,甚至超過了它與內部的溝通。也就是違反了高內聚低耦合,遇到這種的「叛亂者」,不如就讓他去他想去的地方吧
重構:搬移函數、提煉函數
數據泥團
描述:雜合纏繞在一塊兒的。代碼中也如是,咱們可能常常看到三四個相同的數據,兩個類中相同字段等等。總之像泥同樣,這裏也是這樣那裏也是這樣,就是他了
重構:提煉類、引入參數對象、保持對象完整性
基本類型偏執
描述:一些基本類型沒法表示一個數據的真實意義,例如電話號碼、溫度等,
重構:以對象取代基本類型、以子類取代類型碼、以多態取代條件表達式
重複的switch
描述:不僅是switch,大片相聯的if也應該包含在內,甚至在古老的前端時代,曾經一度無條件反對這樣的寫法。
重構:多態取代條件表達式
循環語句
描述:在js中體現爲傳統的for類循環
重構:用管道來取代循環(管道:map、forEach、reduce、filter等一系列)
冗贅的元素
描述:元素指類和函數,可是這些元素可能由於種種緣由,致使函數過於小,致使沒有什麼做用,以及那些重複的,均可以算做冗贅
重構:內聯函數、內聯類、摺疊繼承類
誇誇其談通用性
描述:爲了未來某種需求而實現的某些特殊的處理,但其實可能致使程序難以維護難以理解,直白來講就是沒個錘子用的玩意,你留下他幹個屁
重構:摺疊繼承體系、內聯函數、內聯類、改變函數聲明、移除死代碼
臨時字段
描述:那些自己就足以說明本身是誰的,不須要名字來描述的
重構:提煉類、提煉函數、引入特例
過長的消息鏈
描述:一個對象請求另外一個對象,而後再向後者請求另外一個對象,而後再請求另外一個對象……這就是消息鏈,舉個例子來講
new Car().properties.bodyWork.material.composition().start()
這意味着在查找過程當中,不少的類耦合在一塊兒。我的認爲,不只是結構的耦合,也很難理解。這也包含某類人jq的那一大串的連續調用。都是很難讓人理解的。
重構: 隱藏委託關係、提煉函數、搬移函數
中間人
描述:若是一個類有大部分的接口(函數)委託給了同一個調用類。當過分運用這種封裝就是一種代碼的壞味道
重構:移除中間人、內聯函數
內幕交易
描述:兩個模塊的數據頻繁的私下交換數據(能夠理解爲在程序的鮮爲人知的角落),這樣會致使兩個模塊耦合嚴重,而且數據交換隱藏在內部,不易被察覺
重構:搬移函數、隱藏委託關係、委託取代子類、委託取代超類
過大的類
描述:單個類作了過多的事情,其內部每每會出現太多字段,一旦如此,重複代碼也就接踵而至。這也意味着這個類毫不只是在爲一個行爲負責
重構:提煉超類、以子類取代類型碼
殊途同歸的類
描述:兩個能夠相互替換的類,只有當接口一致纔可能被替換
重構:改變函數聲明、搬移函數、提煉超類
純數據類
描述:擁有一些字段以及用於讀寫的函數,除此以外一無可取的類,通常這樣的類每每半必定被其餘類頻繁的調用(若是是不可修改字段的類,不在此列,不可修改的字段無需封裝,直接經過字段取值便可),這樣的類每每是咱們沒有把調用的行爲封裝進來,將行爲封裝進來這種狀況就能獲得很大改善。
重構:封裝記錄、移除取值函數、搬移函數、提煉函數、拆分階段
被拒絕的遺贈
描述:這種味道比較奇怪,說的是繼承中,子類不想或不須要繼承某一些接口,咱們能夠用函數下移或者字段下移來解決,但不值得每次都這麼作,只有當子類複用了超類的行爲卻又不肯意支持超類的接口時候咱們才應該作出重構
重構:委託取代子類、委託取代超類
註釋
描述:這裏提到註釋並不是是說註釋是一種壞味道,只是有一些人常常將註釋看成「除臭劑」來使用(一段很長的代碼+一個很長的註釋,來幫助解釋)。每每遇到這種狀況,就意味着:咱們須要重構了
重構:提煉函數、改變函數聲明、引入斷言
若是說上面的味道是核心的話,那手法應該就是本書的重中之重。一般咱們發現哪裏味道不對以後,就要選擇使用不一樣的手法進行重構。將他們變得味道好起來。
本文中每一個手法一般包含三個模塊:時機(遇到什麼狀況下使用)、作法(詳細步驟的歸納)、關鍵字(作法的縮影)
關鍵字:
新函數、拷貝、檢查、做用域/上下文、編譯、替換、修改細節
時機:
作法:
關鍵字:
檢查多態、找調用並替換、刪除定義
反作用、不可修改的變量、賦值、替換
反作用、只讀、替換變量
最好能把大的修改拆成小的步驟,因此若是你既想修改函數名,又想添加參數最好分紅兩步來作。 不論什麼時候,若是遇到了麻煩,請撤銷修改,並改用遷移式作法)
使用變量者、函數調用者、修改函數、聲明更名、調用替換
內部重構、提煉新函數、好搜索的臨時名字、變動、改變調用、舊函數使用新函數、改變調用名字
新函數、替換調用、不可見
針對普遍使用的
1.1 先用封裝變量手法封裝
1.2 找到全部使用該變量的代碼,修改測試(若是是對外已發佈的變量,能夠標記爲不建議使用(做者沒提到,可是我的感受是能夠這樣的)
1.3 測試
只做用於某個函數的直接替換便可
替換過程當中能夠以新名字做爲過渡。待所有替換完畢再刪除舊的名字
封裝變量手法、替換名字、中間過渡
建立一個合適的數據結構(若是已經有了,能夠略過)
數據結構選擇:一種是以對象的形式,一種是以類的形式,做者推薦以類的形式,可是在我看來,要根據場景,若是這組數據以及其相關行爲能夠變爲一組方法,如數組類裏面的比較兩個數組是否徹底一致,這就能夠以類來聲明(js中也能夠以export來導出而使用)
使用改變函數聲明手法給原函數增長一個參數爲咱們新的結構
測試
舊數據中的參數傳到新數據結構(變動調用方)
刪除一項舊參數,並將之使用替換爲新參數結構
測試
重複五、6
新結構、增長參數、入參新結構、刪除舊參數、使用新結構
提煉變量、封裝成類、移入已有函數、替換調用、移入計算數據
變換函數、變換入參、搬移計算邏輯
轉化函數、取值函數、設值函數、替換調用者、替換設置者
新類、取設值函數、行爲入類、擴展類
只讀、提煉函數、刪變量
職責邊界確認、建立新域、新舊同步初始化、行爲搬家、接口刪除
代理、修改調用者、方法搬家、拋棄舊類
委託函數、替換調用者、刪除委託整個類
委託整個類、修改調用、刪除代理
算法封裝、編寫新算法、替換算法、比較算法
肯定關係、肯定繼承、優先基礎、函數搬家、相關部分位置肯定、原址代理、優化新函數
封裝、新字段、源址代理、代理新址、舊字段移除、肯定是否內聯
代碼靠近、單點提煉、中間函數、修改引用、函數內聯、原函數刪除、函數更名
tips: 本手法只適合邊界有些許偏移的場景,不適合相差較大的場景
提煉不變的爲臨時方法、搬移語句、刪除原,更名字
內聯替換
肯定反作用、肯定目標
複製循環、行爲拆分、函數提煉
新變量、合適的管道、刪除整個循環
檢查引用
新變量、賦值時聲明、替換調用
封裝、兼容初始化、內部取設只返回新字段,修改內部調用,測試、刪除兼容、內部取設更名、替換外部調用
tips:計算的參考變量,是不可變的,計算結果也是不可變的。能夠不重構(仍是那句話,不可變的數據,咱們就不必理他)
來源肯定、結果相同、計算函數、清理更新點
值對象:a.b=new b(1) 引用對象:a.b.c=1
不可變、替換設置引用值爲設置值
共享倉庫、單例的引用對象、替換調用點
提煉分支、提煉條件、優化判斷
分離反作用、合適的邏輯符、提煉條件函數
從外而內
肯定現有的條件類是否具備多態性,若是沒有,能夠經過將行爲封裝成類(藉助其餘手法如函數組合成類等)
在調用方使用工廠函數得到行爲對象的實例
針對不一樣類型建立子類(至關於在超類在分化)
調用方此時應當經過一個工廠返回合適的子類
將超類中針對子類類型所作的判斷,逐一移入對應子類進行復寫(相關子類複寫超類的分支函數),超類只留下默認值
注意:這種手法實際上是在面向對象開發中很經常使用的一種方式,可是若是不是
不如將其經過一個json或者map來進行指責劃分。在js中我以爲更經常使用的是以策略來代替if
多態、繼承、封裝、行爲拆分
數據結構的調用者都在檢查某個特殊值,而且這個值每次所作的處理也都相同
多處以一樣方式應對同一個特殊值
三種狀況
第一種原始爲類,特例元素沒有設置值的操做
第二種原始爲類,特例元素有設置值的操做
第三種 原始就是普通的json
針對於有本身對應行爲的類
在原類中爲特例元素增長一個函數,用以標記這個特例的狀況,默認返回一個寫死的就行)
爲特例建立一個class,用以處理特例的正常邏輯和行爲,須要把特例對象及其全部行爲放到這個類
將本次特例的條件使用提煉函數手法抽成一個在類中的字段函數返回true
修改全部調用者爲第3步的函數
修改第一步建立的類。讓它返回咱們的特例對象
特例中的其餘字段
針對於只讀的類
針對於原始不是類的
爲特例對象建立一個函數,返回特例對象的深拷貝狀態
將本次特例的條件使用提煉函數手法抽成一個統一的函數
對第一步建立的函數返回值作特殊加強。 將須要的特例的值,逐一放進來。
替換調用者使用函數的返回值
特例邏輯搬到class、過渡函數、替換調用者、修改新class
新函數爲查找、刪除設置值、替換調用者、刪除返回值、優化
調用較少、變化點入參、修改調用、替換使用
針對參數的每一種可能值,新建一個明確函數(若是參數控制整個流程,則能夠用分解條件表達式手法建立明確函數,若是隻控制一部分函數則建立轉發函數,將這些函數,統一經過這些明確函數進行轉發)
替換調用者
tips:若是是這個標記即做爲標記,又做爲參數值。則對其進行拆分。
流程、行爲拆分
接受完整對象、新調用老、修改調用、內聯、更名
一言以概之:這個函數自身或者經過參數都能獲得另外一個值就能夠使用這個手法
提煉變量、參數消除
變量提煉、函數體換新、舊函數傳參、舊函數調新函數,刪除代理函數、函數更名
tips:能夠批量操做多個設值函數。
設值替換爲new
工廠函數、調用類、替換調用
新的類、函數搬家、原類轉發函數、構造入參、只讀
函數體一致化、名字一致化、引用調用先行、提高函數、刪除重寫
一樣方式使用、統一名字、字段上移、刪除子類字段
構造函數內的語句上移
按需放置
直接繼承超類的
間接繼承(經過類型的超類而非現有超類進行繼承)
封裝類型碼、多態化、選擇子類的函數、移除類型參數
工廠函數取代子、類型提煉、檢查類型判斷
相同事情搬移到超類
工廠函數初始化類、委託類、全部子類數據搬移至委託類、超類增長委託類的字段、子類函數搬移到委託類、刪除子類
子類屬性指向超類、轉發函數、去除繼承
收穫最大的莫過於感嘆做者過於謹慎,震驚於做者重構能力之強,對代碼重構理解程度之深,雖然做者有一些「墨跡」,但不能否認,這是極佳的一種方式,雖然工做中咱們不得已沒有那麼多時間去這麼小的步子,咱們能夠步子稍微大一些,當遇到問題時,在回滾並放慢步子。
第二點收穫就爲做者對於代碼好壞的定義,好的代碼就是讓人可以理解,可以讓人很快的找到本身要修改的地方,並能夠高效的規避報錯風險。雖然前期投入時間可能會多一些,但後期的效果倒是讓人可以驚訝的,正如做者所說的:清晰的代碼更容易理解,使你可以發現更深層次的設計問題,從而造成積極正向的循環。
做者一直在強調,重構是一步一步改進的,不是說一會兒就要如何如何,不僅是說單次改進過程要小幅度多測試,也是在說咱們不必定要將代碼中全部都實現到近乎完美的地步,而是應該抉擇一個代碼重構與真實狀況的平衡點,這和大刀闊斧直談架構重構的也不同,代碼是在不斷構築-設計中保持本身的新鮮性,直談大型架構重構,只能是笑談,畢竟架構爲設計、編寫。而直接重構整個架構,除非你想被老闆炒魷魚了。
最後本章做者使用了不少的手法,雖然都只是一些經常使用的什麼提煉函數啊、內聯變量啊之類的,但到處又透露着咱們須要學習的!
重構是爲了代碼能被人讀懂(所謂什麼更好擴展啊、更好的設計模式啊、結構化啊等等等等都是爲了這點。因此我統歸爲爲了能讀懂)能夠選擇犧牲一些(不是說能夠徹底忽略了性能),畢竟在現代瀏覽器、打包工具的加持、緩存的加持下,肉眼看到的問題以及咱們思考的問題也許已經被各類加持下悄悄消失了
從長久來看,重構對於往後的維護往後的開發,隨着時間的流逝確定是一個正收益,可是短時間來講可能要影響咱們一些,咱們要權衡好這些點之間的平衡,畢竟工做是爲了賺錢,公司也是爲了盈利,不可能給咱們無限時間去搞這些,做者同時也提出了重構並非工做日誌中的某一個任務的時機,主要體如今:新功能開發時、爲了代碼可讀性、代碼整合、有計劃的重構代碼以及堅持長期的重構以及review的重構。能夠說是隨時隨地均可以重構,但也不是任何地方任什麼時候機均可以重構,咱們要利用好測試的套件,保證原效果的前提下,結合實際狀況,多維度思考,即便閱讀事後,也應該時常翻開這本書,進行反覆閱讀,以提醒本身。
在本書中我學到了如何甄別壞的代碼,以及怎麼處理他們,學到了開發中應該測試先行以及一些重構的基本知識。
不過做爲jser,我我的以爲雖然做爲一本通用型書籍,確實應該不摻雜不少的語法,不過既然選定了js,自動化重構這塊其實怎麼說呢,寫的都是IDE。可是js中並無這類工具。而後做者也沒有說在js下應該能夠藉助某些功能來幫助重構。因此這塊仍是一片空白,雖然這種事理應本身去研究。可是仍是想免費更好嘛