『重構--改善既有代碼的設計』讀書筆記----序

??? 作為C++的程序員,我從大學就開始不間斷的看書,看到如今上班,也始終堅持每天多多少少閱讀技術文章,書看的很多,但很難有一本書,能讓我去反復的翻閱。但唯獨『重構--改善既有代碼的設計』這本書讓我重復看了不下3遍,今天我重新拿起這本書開始了第四遍的閱讀。

??? 我后來仔細想了想為什么我會對這個書如此“迷戀”?忽然之間,我意識到這本書真正意義上給我帶來了工作的改變。不像別的技術書籍,可能你看過之后,你腦子里有個印象,但對于實踐這塊不能立馬就做,所以往往印象不深。而這本重構,在你看完之后,你可以立馬開刀闊斧去進行真正意義上的實踐,而且收獲頗多,樂此不疲。

??? 接下來的日子,我將進行第四次『重構--改善既有代碼的設計』的閱讀,對于這本書,我也有了不一樣的感情在里面。以前對于看書,沒有寫讀書筆記的習慣,希望在這本書給我帶來各種便利的同時,我也能夠為它“做點什么”。呵呵,其實也是給自己加深印象的一種途徑。因為“重構”我感覺目前國內開發者還不是特別熟悉,甚至有些程序員寫了幾年代碼之后都不知道設計模式是什么東西。遇到項目,遇到代碼,往往是想到什么就寫什么。當遇到代碼修改或者增加功能的時候,不會去看擴展性或者兼容性,直接語句一貼就完事。對于這種程序員,我真的希望你可以好好的靜下心來想想,這些年來你代碼能力有沒有實質上的長進。

??? 擁有“代碼潔癖”其實是一種很難能可貴的事情,有時候看到一團糟糕代碼,心里會去想對他進行重構。不要懷疑這樣會不會耽誤自己的效率,重構之后添加功能往往能夠更加如魚得水。

??? 今天寫的是序,為了便于有文有料,還是總結幾個可以直接上手的要點給大家,之后我的出法應該就是針對重構列表中的每一條,都出一篇對應的文章。只有這樣,我才能真正意義上的去重視那些簡單的,和坦然接受那些復雜的重構手法。下面先列舉幾個比較有效的重構原則。作為序篇的總結。

??? 1. 有時候遇到大長段函數,需要進行Extract Method的時候,往往找不到一個比較好的切入點。其實這里有一個小竅門,就是尋找邏輯泥團,那么什么是邏輯泥團?其實很簡單,就是那種有switch,if...else,for,while等循環判斷的邏輯結構。往往提煉這種到單獨的函數可以更加有效。

??? 2. 對于函數自身來說,函數內部的參數命名其實也很重要。有些同學可能會覺得接口的命名似乎比內部實現的參數命名更加重要,但你要知道,這個函數很可能之后還是由你去修改去增加功能。如果沒有一個好的參數命名習慣,你又要重新開始去思考,這個變量是用來干什么的,這個時間就浪費掉了。

??? 3.? 如果函數中使用的參數都不是該類所持有,應該考慮是否要Move Method到別的類去。對于類中函數,如果有函數內部使用的變量跟本類沒有任何關系,那么說白了,這個函數不屬于這個類。那么就將這個函數移到他需要的參數所在的類中去。別以為這個小動作沒什么改變,這其實已經改變了類與類之間的耦合關系。從之前的實現耦合到現在的接口耦合,耦合度直接下降了一個級別,這是有目共睹的。

??? 4. 對于一些臨時變量,如果可以通過函數獲得,那么你就Replace Temp with Query,用函數將他替換,不要擔心性能效率問題,記住28原則,80%的效率問題僅僅掌握在20%的代碼身上。

??? 5. 針對變化,轉移函數。如果一個函數中需要同時用到兩個類以上的變量,那么你需要去觀察,這個函數中這些類中變量,在將來比較容易變化的是哪些。優先將這個函數放到變化類中去。這樣對于類型碼這種,你當然可以利用面向對象的法寶--多態來取代switch語句了。這里還有個小技巧,如果你覺得如果在類的生命周期中可能會改變類型,那你就別對這個類做繼承,你所要做的就是加個間接層,State/Strategy模式。通過委托來進行生命期的行為改變,還記得David Wheeler的名言嗎?----計算機科學中的大多數問題都可以通過增加一層間接性來解決。

??? 結語: 其實個人很喜歡測評界的ZEALER,因為他們的精神就是想到什么就去做,與其思來想去要不要真正來篇讀書筆記,不如狠下心來直接來一篇 『重構--改善既有代碼的設計』讀書筆記----序 : )

轉載于:https://www.cnblogs.com/rickyk/p/4105158.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273517.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273517.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273517.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信公共平臺接口開發--Java實現

Java微信實現,采用SpringMVC 架構,采用SAXReader解析XML RequestMapping(value"/extend") public class WeixinController { RequestMapping(value"/weixin") public ModelAndView weixin(HttpServletRequest request,HttpServlet…

最大權閉合圖hdu3996

定義:最大權閉合圖:是有向圖的一個點集,且該點集的所有出邊都指向該集合。即閉合圖內任意點的集合也在改閉合圖內,給每個點分配一個點權值Pu,最大權閉合圖就是使閉合圖的點權之和最大。 最小割建邊方式:源點…

非監督學習的單層網絡分析

這篇博客對應的是Andrew.Ng的那篇文章:An Analysis o f Single-Layer Networks in Unsupervised Feature Learning,文章的主要目的是討論receptive field size,number of hidden nodes, step-stride以及whitening在對卷積網絡模型…

Spring MVC 驗證碼

頁面 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":"request.getServerP…

數據結構實驗之鏈表四:有序鏈表的歸并

數據結構實驗之鏈表四&#xff1a;有序鏈表的歸并 Time Limit: 1000MS Memory limit: 65536K 題目描述 分別輸入兩個有序的整數序列&#xff08;分別包含M和N個數據&#xff09;&#xff0c;建立兩個有序的單鏈表&#xff0c;將這兩個有序單鏈表合并成為一個大的有序單鏈表&…

apk文件編譯到系統文件中的方法(及包含so庫的)

把第三方或自己開發的apk文件編譯到系統文件(system.img)中的方法&#xff1a; 1 (1)源碼編譯后&#xff0c;把apk拷貝到out\target\product\generic\system\app中。 (2) 執行命令make snod , 把添加的spk編到system.img 中 缺點&#xff1a;執行make clean 后&#xff0c;再…

javascript中interval與setTimeOut的區別

setTimeout(code,millisec) //- 在指定時間后執行代碼 code必須&#xff1b; millisec必須&#xff1b; clearTimeout(setTimeoutId) //- 取消 setTimeout() setInterval(code,millisec)&#xff1b;//指定間隔毫秒內循環執行代碼 code必須&#xff1b; millisec必須&a…

java設計模式之單例模式(七種方法)

單例模式&#xff1a;個人認為這個是最簡單的一種設計模式&#xff0c;而且也是在我們開發中最常用的一個設計模式。 單例模式的意思就是只有一個實例。單例模式確保某一個類只有一個實例&#xff0c;而且自行實例化并向整個系統提供這個實例。這個類稱為單例類。我們前面學習的…

java 遍歷map集合

Map<String, String> map new HashMap<String, String>(); map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); //第一種&#xff1a;通過Map.keySet遍…

poj3009 Curling 2.0 深搜

PS&#xff1a;以前看到題目這么長就沒寫下去了。今天做了半天&#xff0c;沒做出來。準備看題解&#xff0c;打開了網站都忍住了&#xff0c;最后還是靠自己做出來的。算是一點進步吧。 分析&#xff1a; 題目的意思沒明白或者理解有偏差都沒辦法做題。看樣例3和樣例4&#xf…

Android監聽事件

ListView事件監聽&#xff1a; setOnItemSelectedListener 鼠標滾動時觸發 setOnItemClickListener 點擊時觸發 EditText事件監聽&#xff1a; setOnKeyListener 獲取焦點時觸發 RadioGroup事件監聽&#xff1a; setOnCheckedChangeListener 點擊時觸發 CheckBox事件監聽&#…

子類能不能繼承父類的構造方法?

class A{ public A(){} // 1:無參數構造方法。 public A(String s){} // 2.}class B extends A{ public B(String s){ super(s); // 3. }}說明&#xff1a;如果沒有1處的無參數構造方法&#xff0c;那么3處一定要主動調用父類帶參數的構造方法。如果有1處的構造方法&#…

基于原生javascript的ajax實現

function getXMLHttpRequest(){if(window.ActiveXObject){//用戶是ie瀏覽器http_requestnew ActiveXObject("Microsoft.XMLHTTP");}else{//其他的瀏覽器http_requestnew XMLHttpRequest();}return http_request;}var httpRequest;function name(){httpRequestgetXMLH…

Google File System設計方面的問題匯總

1、Google File System概述 google file system是一個分布式文件系統&#xff0c;針對的是數據密集型應用&#xff0c;提供容錯功能&#xff0c;運行在低廉的服務器上&#xff0c;同時給大量的用戶提供高性能服務。盡管google file system有著傳統的分布式文件系統的目標&#…

linux phpize

phpize是什么 1、phpize是用來擴展php擴展模塊的&#xff0c;通過phpize可以建立php的外掛模塊。 當php編譯完后&#xff0c;在bin下面會有phpize這個腳本文件&#xff0c; 在編譯你要添加的擴展模塊之前&#xff0c;執行以下phpize就可以了&#xff1b; 比如現在想在php中加入…

一些常用的正則表達式

較驗郵箱&#xff1a; var EmailReg /^[-_A-Za-z0-9]([_A-Za-z0-9]\.)[A-Za-z0-9]{2,3}$/; 身份證號碼&#xff1a; var reg /(^\d{15}$)|(^\d{17}(\d|X)$)/; 15位身份證號 //身份證15位時&#xff0c;次序為省&#xff08;3位&#xff09;市&#xff08;3位&#xff…

iOS iphone屏幕分析(豈止而大)

在寫本文前&#xff0c;我必須介紹幾點內容&#xff1a;第一點&#xff1a;屏幕上面顯示的內容多少和屏幕的尺寸大小無關第二點&#xff1a;屏幕上面顯示的內容多少和分辨率完全無關第三點&#xff1a;屏幕上面顯示的內容多少和屏幕尺寸、屏幕分辨率、PPI等都是無關的那到底什么…

js的一些實現

響應回車鍵提交表單 //*******************************************************響應回車鍵登錄****************************************************************** document.οnkeydοwnfunction(event){ var e event || window.event || arguments…

【隨筆】Win7下GVIM的安裝與配置

針對各種語言的編輯器千千萬萬&#xff0c;最好的就是最適合自己的&#xff0c;這句話一點沒錯。 偶然間&#xff0c;需要在Windows上編寫代碼&#xff0c;MyEclipse等太大&#xff0c;完全沒有必要&#xff0c;所以就想起來了vim這個神器。個子小&#xff0c;功能強&#xff0…

java遍歷Set集合

在Java中使用Set,可以方便地將需要的類型&#xff0c;以集合類型保存在一個變量中.主要應用在顯示列表. Set是一個不包含重復元素的collection。更確切地講&#xff0c;set 不包含滿足 e1.equals(e2) 的元素對 e1 和 e2&#xff0c;并且最多包含一個 null 元素。 import java.u…