狗屎一樣的程式碼!快,重構我!
狗屎一樣的程式碼如何重構?
重構不止是程式碼整理,它提供了一種高效且受控的程式碼整理技術。
(一)重構原則
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
程式設計師入職華為三個月沒寫過程式碼:渴望提交程式碼,創造價值!
一名程式設計師,由於公司的專案情況,長期不能寫程式碼,你是什麼感受呢?是不是感覺很失落,大部分程式設計師都會有這種感覺吧,有的時候可能是研究一些技術,看一些程式碼什麼的,部分程式設計師就不願意幹這樣的事情,感覺還是自己寫程式碼爽,最近就有一名華為員工經歷了這樣一種情況!