1. 程式人生 > >狗屎一樣的程式碼!快,重構我!

狗屎一樣的程式碼!快,重構我!

開發十年,就只剩下這套架構體系了! >>>   

狗屎一樣的程式碼如何重構?

重構不止是程式碼整理,它提供了一種高效且受控的程式碼整理技術。

(一)重構原則

1、何謂重構

對軟體內部結構的一種調整,目的是在不改變軟體可觀察行為的前提下,提高其可理解性,降低其修改成本。

另一種解釋是:使用一系列重構手法,在不改變軟體可觀察行為的前提下,調整其結構。

2、為何重構

改進軟體設計:如果沒有重構,程式的設計會逐漸變質,重構很像是在整理程式碼,你所做的就是讓所有的東西回到應處的位置上。

幫助找到bug:對程式碼進行重構,可以深入理解程式碼的作為,在搞清楚程式結構的同時,想不把bug揪出來都難。

提高程式設計速度:良好的設計是快速開發的根本,改善設計、提高可讀性,減少錯誤,這些都是提高質量。

3、何時重構

任何情況下我都反對專門撥出時間進行重構。重構本來就不是一件應該特別撥出時間做的事情,重構應該隨時隨地的進行。

三次法則

第一次做某件事情是隻管去做;

第二次做類似的事情會產生反感;

第三次再做類似的事,你就應該重構

大多數重構都為程式引入了更多的間接層,重構往往把大型的物件拆成多個小型的物件,把大型的函式拆成多個小型的函式。但是,間接層是一把雙刃劍。每次把一個東西分成兩份,你就需要多管理一個東西。如果某個物件委託另一個物件,後者又委託另一個物件,程式會愈加難以閱讀。【文末有乾貨分享,滿滿的免費資料!】

重新組織函式

1、提煉函式

動機:看到一個過長的函式或者一段需要註釋才能讓人理解用途的程式碼,將這段程式碼放一個獨立的函式中;

做法:

創造一個新函式,根據這個函式的意圖來命名它;

只要新函式的名稱能夠以更好的方式昭示程式碼意圖,你也應該提煉它。但如果想不到一個更有意義的名稱就別動

將提煉的程式碼從原函式複製到新建的目標函式中;

將被提煉程式碼段中需要讀取的區域性變數,當作引數傳遞給目標函式;

在源函式中,將被提煉程式碼段替換為目標函式呼叫。

2、行內函數

一個函式的本體與名稱同樣清楚易懂。在函式呼叫點插入函式本體,然後移除該函式。

動機:一群組織不甚合理的函式。你可以將它們都內聯到一個大函式中,再從中提煉出組織合理的小型函式。

使用的太多的間接層,使得系統中的所有函式都似乎只是對另一個函式的簡單委託,造成在委託動作之間暈頭轉向。

做法:

1、檢查函式,確定不具備多型;

如果子類繼承了這個函式,就不要將此函式內聯,因為子類無法複寫一個根本不存在的函式。

2、找出這個函式的所有呼叫點;

3、將這個函式的所有呼叫點都替換成函式本體。

3、內聯臨時變數

有一個臨時變數,只被一個簡單的表達是賦值一次,而它妨礙了其他重構手法。將所有對該變數的引用動作,替換為對它賦值的那個表示式自身

double basePrice = anOrder.basePrice();

return (base > 10000 );

替換為:

return (anOrder.basePrice > 1000);

4、以查詢取代臨時變數

你的程式以一個臨時變數儲存某一表達式的運算結果。將這個表示式提煉到一個獨立的函式中。將這個臨時變數的所有引用點替換為對新函式的呼叫。此後,新函式就可被其他函式使用。

double basePrice = quantity * timePrice;

if(basePrice > 1000){

  return basePrice * 09.5;

} else {

  return basePrice * 0.98;

}

替換為:

if(basePrice() > 1000){

  return basePrice * 09.5;

} else {

  return basePrice * 0.98;

}

double basePrice(){

  return quantity * timePrice;

}

臨時變數只在所屬的函式中可見,如果把臨時變數替換為一個查詢,那麼同一個類中的所有函式都將可以獲得這個份資訊,這將帶給你極大的幫助,使你能夠為這個類編寫更清晰的程式碼。

5、引入註釋性變數

你有一個複雜的表示式。將該複雜表示式(或其中一部分)的結果放進一個臨時變數,以此變數名稱來解釋表示式用途。

if ((platform.toUpperCase().indexOf("MAC") > -1) && (browser.toUpperCase().indexOf("IE") > -1) && wasInitialized() && resize >0){

//do smothing

}

替換為:

final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1;

final boolean isIEBrowser = browser.toUpperCase().indexOf("IE") > -1;

final boolean wasResized = resize >0;

if(isMacOs && isIEBrowser && wasInitialized() && wasResized){

  //do smothing

}

表示式有可能非常複雜難以理解。這種情況下,臨時變數可以幫助你將表示式分解為比較容易管理的形式。

在條件邏輯中,你可以用這項重構將每個條件子句提煉出來,以一個良好命名的臨時變數來解釋對應條件子句的意義。另一種情況是:在較長的演算法中,可以運用臨時變數來解釋每一步運算的意義。

6、分解臨時變數

你的程式有某個臨時變數被賦值超過一次,它既不是迴圈變數,也不被用於收集計算結果。 針對每次賦值,創造一個獨立、對應的臨時變數。

double temp = 2 * (height + width);

System.out.println(temp);

temp = height * width;

System.out.println(temp);

替換為:

double perimeter = 2 * (height + width);

System.out.println(perimeter);

double area = height * width;

System.out.println(area);

如果臨時變數被賦值超過一次,就意味著它們在函式中承擔了一個以上的責任。如果臨時變數承擔多個責任,它就應該被替換為多個臨時變數。每個變數只承擔一個責任,同一個臨時變數承擔兩件不同的事情會令程式碼閱讀者糊塗

7、移除對引數的賦值

程式碼對一個引數進行復制。以一個臨時變數取代該引數的位置。

int discount (int inputVal, int quantity, int yearToData){

  if(inputVal > 50) inputVal -= 2;

}

替換為:

int discount (int inputVal, int quantity, int yearToData){

  int result = inputVal;

  if(inputVal > 50) result -= 2;

}

如果程式碼的語義是按引用傳遞的,請在呼叫段檢查呼叫後是否還使用了這個引數。

8、替換演算法

想要把某個演算法替換為另一個更清晰的演算法。將函式本體替換成為另一個演算法。

String foundPerson(String[] people){

  for(int i = 0;i < people.length; i++){

      if(people[i].equals("Don")){

          return "Don";

      }

      if(people[i].equals("John")){

          return "John";

      }

      if(people[i].equals("Kent")){

          return "Kent";

      }

  }

  return "";

}

替換為:

String foundPerson(String[] people){

  List candidates = Arrays.asList(new String[]{"Don", "John", "Kent"});

  for(int i = 0;i < people.length; i++){

      if(candidates.contains(people[i])){

          return prople[i];

      }

  }

  return "";

}

(未完)

分享免費學習資料

針對於還會準備免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)

為什麼某些人會一直比你優秀,是因為他本身就很優秀還一直在持續努力變得更優秀,而你是不是還在滿足於現狀內心在竊喜!希望讀到這的您能點個小贊和關注下我,以後還會更新技術乾貨,謝謝您的支援!

有需要獲取免費資料可點喜歡關注我,加秋秋群:856443934獲取!

(部分資料如下)

相關推薦

一樣程式碼重構

開發十年,就只剩下這套架構體系了! >>>   

一樣的React(第四節首頁banner圖輪播)

這一節,我們來看一個banner圖輪播,banner圖輪播是一個比較常用的需求,而且幾乎每個網站,每個app都會有一個banner圖輪播的效果,也不知道是誰創造出來的。 1、banner圖一般都是從檔案伺服器獲取的,也就是需要發請求獲取資料,需要發ajax請求,這裡我們需要

不是時間太而是太“飄”~~~

       時間太快,而我太“飄”了!        轉瞬即逝的大學三年,就那麼渾渾噩噩,迷迷糊糊的過來了。當我無聊的刷著微博,看那些我所熟知的,我所熱愛的那些英雄聯盟的職業選手,一個又一個的面臨轉會的時候,我的未

總有那麼一瞬間讓你下定決心踹掉這份工作辭職真爽

         離職這個決定其實是由很多方面的原因累積而成的。但是,也許就會有一個瞬間是“最後一根稻草”,促成了你離職的決定。近期,前程無憂論壇上就發起了“哪個瞬間,讓你下定決心一定要離職”的分享和調查,結果很是扎心,一起來看看,你有沒有被“戳中”吧!   錢少:這麼久了

對不起要上啊D7.0了是SQLMAP

0x00 sqlmap簡介 官網:http://sqlmap.org sqlmap是一個自動化的sql注入滲透工具,指紋檢測、注入方式、注入成功後的取資料等等都是自動化的,甚至還提供了一個字典來將取回來的hash爆破,sqlmap是基於python開發的,因此具有跨

努力可能成功放棄註定失敗

Xcode在本地存放的路徑 /Users/使用者名稱/Library/Application Support/Developer/Shared/Xcode/Plug-ins 個人常用外掛如下: 1.Alcatraz Alcatraz是管理 Xcode 所有外掛的外掛,安裝

C#託管的中間程式碼IL為什麼和機器程式碼執行速度一樣與Java對比

C#託管的中間程式碼IL為什麼和機器程式碼執行速度一樣快,IL是即時編譯的(JIT),java位元組碼是解釋型的。java會把所有的程式碼都編譯完,在下次執行時就不需要再去編譯已經編譯過的程式碼。微軟對編譯做了優化,JIT只編譯呼叫的程式碼,因為程式執行過程中,大部分程式碼都

APP開發終結者來襲來體驗吧

服務 一個 申請 選擇 ref 手機 整體 設計 意見 21世紀人們最離不開的是什麽?無疑是手機!而手機中最令人著迷的是什麽?答案是各種類型的應用APP,不管是令無數人瘋狂的手遊-王者榮耀,還是微博,微信等的社交APP,更有新聞,購物,生活類的APP數不勝數。毫無疑問,現如

一樣的 Spring Boot入門總算有反應了

zone context frame .org ret clas schema -1 eating 我特麽最煩的就是現在Java不知道抽什麽風,喜歡用maven這種,怎麽搞都會有錯誤提示的玩意。搞個spring boot,官方的所謂http://start.spring.i

像寫詩一樣寫代碼玩遊戲一樣的開心心情還能領工資

完全 自己 沒有 深入 興趣 靈魂 一個 遊戲 好代碼 [軟]上海-Qt俠 2017/7/12 16:11:20我完全是興趣主導,老板不給我錢,我也要寫好代碼!白天幹,晚上幹,周一周五幹,周末繼續幹!編程已經深入我的基因,深入我的骨髓,深入我的靈魂!當我解決一個程序問題,比

阿爾法的“出世”備受關註作為“網紅”你成功啦

收購 src 我們 下一步 網易 alphago 不想 科學 .com 阿爾法狗,這個紅透天的新型“網紅”,作為人工智能的新型而又智慧的產物,自從“出世”後就備受大家關註,而關於阿爾法狗與人機大戰已經到了第三回合,[阿爾法請添加鏈接描述](http://www.afa-go

收好這5個精品素材網站一般人不告訴他

領域 offic 不知道 高質量 mage 你會 國內 專註 圖庫 還在發愁不知道去哪裏找PPT制作素材嗎?今天悄悄告訴你幾個精品個素材網站來幫你,噓,快來! 一、微軟Office 微軟Office官方在線模板的模板基本涵蓋了工作中所有使用的場景需求,不僅有 PP

難怪你做事每次都比別人原來用了這黑科技網站請低調收藏

html5 ddb stat 基本 clas 你在 -i 分享 網站 1. 別樣網 經常有人因為盜圖而被告,在這裏是不存在的,精彩紛呈的圖片海量隨你挑選,而且裏面的圖片像素非常的高。 2. Owllook 非常強大的電子書資源搜索網站,而且裏面的小說是免費的,頁面整

MySQL的事務容易懂來看看吧

事務 1.儲存引擎 Mysql核心儲存引擎。 Mysql5.5 預設採用innoDB。(my.ini)   2.什麼是事務 事務用於保證資料的一致性,由一組DML操作組成,該組SQL語句要麼同時成功,要麼同時失敗。例如轉賬。 3.事務

重構第一個案例重構前的程式碼

《重構:改善既有程式碼的設計》第一章 重構,第一個案例  此程式碼用於練習重構手法,侵刪! 影片類: public class Movie { public final static int REGULAR = 0; public final static int NE

Java面試中筆試題——Java程式碼真題這些題會做筆試完全可拿下

大家好,我是上海尚學堂Java培訓老師,以下這些Java筆試真題是上海尚學堂Java學員在找工作中筆試遇到的真題。現在分享出來,也寫了參考答案,供大家學習借鑑。想要更多學習資料和視訊請留言聯絡或者上海尚學堂(shsxt.com)找美女小姐姐老師要。尚學堂Java300集和程式設計師修煉手冊都是可以免費獲得的,

程式設計師工作一天改5行程式碼網友羨慕評論說出真相

程式設計師工作強度大,相信程式設計師的朋友深有體會,有時候不得不像個編碼機器,不停地編碼除錯,排查bug,處理bug,解決bug。很多時間都是與bug相處。程式設計師行業,加班也是一種常態,譬如996,有的甚至還不止,據不完全統計,程式設計師平均每天加班4.7小時遙遙領先。 張工是一名程式

歷時 7 天把一萬行 Scala 程式碼移植到了 Kotlin 上

【CSDN編者按】去年,Google 宣佈 Kotlin 正式成為 Android 官方開發語言,由此引發了遷移 Kotlin 的一股熱潮。在本文中,作者分享了他在七天內把程式碼從 Scala 移植到 Kotlin 的經過,以及從中吸取的經驗教訓。 以下為譯文:

沒有靈感頭髮都抓掉了推薦幾款創意網站讓大腦靈光一動

1. iDsketch http://www.idsketch.cn/ 工藝設計的草圖設計手繪。 裡面有系統教育方法,知道新人如何學習手繪,會將國外的手繪方法進行翻譯。全方位系統的教你手繪。   2. ShoppingDesign https

程式設計師入職華為三個月沒寫過程式碼:渴望提交程式碼創造價值

一名程式設計師,由於公司的專案情況,長期不能寫程式碼,你是什麼感受呢?是不是感覺很失落,大部分程式設計師都會有這種感覺吧,有的時候可能是研究一些技術,看一些程式碼什麼的,部分程式設計師就不願意幹這樣的事情,感覺還是自己寫程式碼爽,最近就有一名華為員工經歷了這樣一種情況!