代碼重構的方法

見:http://blog.csdn.net/u011889786/article/details/51865344

見:http://blog.csdn.net/weiky626/article/details/1602691



一.提取子函數

說白了就是一個大函數里,可以根據不同功能分成幾個小函數,因為說不定,其他函數也可能會用到其中的函數

二.把大家都要用的方法放到父類中

? ? 所有對象都要執行同一個方法,那就把這個方法放到他們的父類中

三.下移函數到子類

? ?子類特有的方法就沒必要放到父類中,單獨實現就可以了

四.封裝固定的調用邏輯(有點模板模式的意思)

代碼會按照一定的邏輯執行,要完成這個功能,需要執行A,在執行B,最后執行C,這些邏輯通常比較固定,在實現了A,B,C功能之后就要調用它們實現功能,但是每次調用這三個功能函數,必然會造成代碼重復

不科學的代碼如下:


[java]?view plain?copy
  1. Car?audi?=?new?Audi();??
  2. audi.closeDoor();??
  3. audi.start();??
  4. audi.speedup();??
  5. ??
  6. Car?bmw?=?new?BMW();??
  7. bmw.closeDoor();??
  8. bmw.start();??
  9. bmw.speedup();??

科學的代碼如下:

[java]?view plain?copy
  1. public?abstract??class?SmartCar?extends?Car{??
  2. ????public?final??void?autoSpeedup(int?speed){??
  3. ????????this.closeDoor();??
  4. ????????this.start();??
  5. ????????this.speedup();??
  6. ????????System.out.println("xcqw?加速到?:"+speed);??
  7. ????}??
  8. }??

可以看到我們在autoSoeedUp函數中按照順序調用了關門,啟動,加速3個操作,這樣在其他地方只需要調用autoSpeedup函數即可autoSpeedup函數實際上運用了模板方法模式,它封裝了3個邏輯流程,并且這個流程不能被修改,但是子類可以重寫這三個過程


五.使用泛型去除重復邏輯

[java]?view plain?copy
  1. /存儲Int的集合類??
  2. public?class?IntArrayList{??
  3. ????private?int[]?dataSet;??
  4. ????public??IntArrayList(int?size){??
  5. ????????dataSet?=?new?int[size];??
  6. ????}??
  7. ????public?int?get(int?position){??
  8. ????????return?dataSet[position];??
  9. ????}??
  10. ??
  11. ????public?void?add(int?pos?,int?data){??
  12. ????????dataSet[pos]?=data;??
  13. ????}??
  14. ????public?int?size(){??
  15. ????????return?dataSet.length;??
  16. ????}??
  17. }??
  18. //存儲String的集合類??
  19. public?class?StringArrayList{??
  20. ????private?String[]?dataSet;??
  21. ????public?StringArrayList(int?size){??
  22. ????????dataSet?=?new?String[size];??
  23. ????}??
  24. ????public?String?get(int?position){??
  25. ????????return?dataSet[position];??
  26. ????}??
  27. ????public?void?add(int?pos?,String?data){??
  28. ????????dataSet[pos]?=?data;??
  29. ????}??
  30. ????public?int?size(){??
  31. ????????return?dataSet.length;??
  32. ????}??
  33. }??


可以看到IntArrayListStringArrayList都實現了get,add,size三個函數,他們的代碼都是一樣的,只是具體類型不太一樣

所以我們可以抽象集合類SimpleArrayList的實現:

[java]?view plain?copy
  1. public?class?SimpleArrayList<T>?{??
  2. ????private?T[]?dataSet;??
  3. ????public?SimpleArrayList(int?size){??
  4. ????????dataSet?=?(T[])?new?Object[size];??
  5. ????}??
  6. ????public?T?get(int?position){??
  7. ????????return?dataSet[position];??
  8. ????}??
  9. ????public?void?add(int?pos?,T?data){??
  10. ????????dataSet[pos]?=?data;??
  11. ????}??
  12. ????public?int?size(){??
  13. ????????return?dataSet.length;??
  14. ????}??
  15. } ?
[java]?view plain?copy
  1. //方法一??
  2. //使用IntArrayList??
  3. IntArrayList?intArr?=?new?IntArrayList(2);??
  4. intArr.add(0,3);??
  5. intArr.add(1,55);??
  6. System.out.println(intArr.get(1));??
  7. //使用StringArrayList??
  8. StringArrayList?strArr?=?new?StringArrayList(3);??
  9. strArr.add(0,"hello");??
  10. System.out.println(strArr.get(0));??
  11. ??
  12. //方法二??抽出來之后??
  13. //使用SimpleArrayList?存儲整型??
  14. SimpleArrayList<Integer>?intArrayList?=?new?SimpleArrayList<>(3);??
  15. intArrayList.add(0,3);??
  16. intArrayList.add(1,55);??
  17. System.out.println(intArrayList.get(1));??
  18. ??
  19. //使用SimpleArrayList存儲String??
  20. SimpleArrayList<String>?strArrayList?=?new?SimpleArrayList<>(3);??
  21. strArrayList.add(0,"hello?,?SimpleArrayList");??
  22. System.out.println(strArrayList.get(0));??

六.函數避免過多的入參

[java]?view plain?copy
  1. //復雜版??
  2. public?void?shareToMoment(String?title,String?content,String?thumbUrl,String?targetUrl,String?creator){??
  3. ????System.out.println("分享到朋友圈:文章標題為:"+title+"內容為:"+content);??
  4. }??
  5. //簡單版??
  6. public?static?void?shareToMoment(ShareData?shareData){??
  7. ????System.out.println("分享到朋友圈:文章標題為:"+shareData.title+"內容為:"+shareData.content);??
  8. }??
  9. public?class?ShareData{??
  10. ????public?String?title;??
  11. ????public?String?content;??
  12. ????public?String?thumbUrl;??
  13. ????public?String?targetUrl;??
  14. ????public?String?creator;??
  15. }??
  16. ShareData?shareData?=?new?ShareData();??
  17. shareData.title?="平凡之路";??
  18. shareData.content?=?"我曾經失落失望失掉所有方向,直到看見平凡才是唯一的答案";??
  19. shareData.targetUrl?=?"http://WWW.xxx.com";??
  20. //分享到朋友圈??
  21. ShareData(shareData);??


七.重構的支柱-----轉移函數,函數要職責分明

如果一個類中有太多行為(即函數),或一個類與另一個類之間有太多的函數調用,導致高度耦合,我就會考慮轉移該函數到更適合的類型中。(說白了就是要函數要職責分明

[java]?view plain?copy
  1. /班級類??
  2. public?class?AClass{??
  3. ????public?List<Student>?students?=?new?ArrayList<Student>();??
  4. ????public?void?add(Student?student){??
  5. ????????sudent.add(student);??
  6. ????}??
  7. }??
  8. ??
  9. public?class?Student{??
  10. ????public?String?id;??
  11. ????public?String?name;??
  12. ????public?Student(String?sId,String?sName){??
  13. ????????this.id?=?sId;??
  14. ????????this.name?=?sName;??
  15. ????}??
  16. ????//很明現在這個其實是遍歷Aclass?,所以應該放在AClass中比較好??
  17. ????public?boolean?isBelongTo(AClass?class1){??
  18. ????????for(Student?stu?:class1.students){??
  19. ????????????if(stu.id.equals(this.id)){??
  20. ????????????????return?true;??
  21. ????????????}??
  22. ????????}??
  23. ????????return?false;??
  24. ????}??
  25. ??
  26. ????@Override??
  27. ????public?String?toString()?{??
  28. ????????return?"Student[?id=?"+id+",name="+name+"]";??
  29. ????}??
  30. }??
  31. ??
  32. //更改之后Aclass??
  33. public?class?Aclass{??
  34. ????public?List<Student>?students?=?new?ArrayList<Student>();??
  35. ????public?void?add(Student?student){??
  36. ????????sudent.add(student);??
  37. ????}??
  38. ????//放這里就比較好??因為是遍歷students??
  39. ????public?boolean?contain(Student??student){??
  40. ????????for(Student?stu?:students){??
  41. ????????????if(stu.id.equals(student.id)){??
  42. ????????????????return?true;??
  43. ????????????}??
  44. ????????}??
  45. ????????return?false;??
  46. ????}??
  47. } ?

八.狀態模式---參考設計模式中的介紹

狀態模式介紹


九.避免對象為null,就寫個什么都不做的對象,如果是null就把這個給他

十.把功能拆開

不要把所有功能放在一個函數中。




另:

1.重命名:對類,接口,方法,屬性等重命名,以使得更易理解


2.抽取代碼:將方法內的一段代碼抽取為另一個方法,

以使得該段代碼可以被其他方法調用,這是重構中很重要很常用的,

此舉可以極大的精煉代碼,減少方法的代碼行數


3.封裝字段:將類的某個字段轉換成屬性,可以更加合理的控制字段的訪問


4.抽取接口:將類的某些屬性,方法抽取組成個接口,該類自動實現該接口


5.提升方法內的局部變量為方法的參數:這主要是在寫代碼的過程中會使用到


6.刪除參數:將方法的一個或多個參數刪掉


7.重排參數:將方法的參數順序重新排列


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

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

相關文章

android 去掉標題欄、狀態欄、橫屏

// 去掉標題欄supportRequestWindowFeature(Window.FEATURE_NO_TITLE);// 全屏、隱藏狀態欄getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 橫屏setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION…

Spring Boot 整合Mybatis (一)

2019獨角獸企業重金招聘Python工程師標準>>> 新建spring-boot項目&#xff0c;相關依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><de…

x264 的 cache詳解

在這里和下一級別的分析中有必要先講一下這個h->mb.cache&#xff08;沒法講&#xff0c;就是cache!&#xff09;。 x264_macroblock_cache_load將參考幀中某位置的&#xff08;重建后&#xff09;數據保存進cache&#xff0c;供參考和反復使用。 x264_macroblock_cache_s…

同步/異步阻塞/非阻塞

平時開發中經常會聽大家說到什么同步阻塞、異步非阻塞等等名詞&#xff0c;這里我談下自己對這兩個名詞的理解&#xff0c;僅僅是個人觀點&#xff0c;并不一定正確。 1.阻塞/非阻塞 我認為判定阻塞還是非阻塞&#xff0c;取決于線程所做的操作是否需要將線程掛起等待。 舉個…

Repeater的使用

1.頁面代碼 如果要分頁&#xff0c;那么頁面開頭必須寫&#xff08;<% Register Src"~/Controls/Page.ascx" TagName"Page" TagPrefix"uc1" %>&#xff09; 并且分頁&#xff0c;頁腳<uc1:Page ID"Page2" runat"server&…

springboot 整合 mongodb實現 批量更新數據

現需求&#xff1a;需要批量將1000個數據先查詢在更新到mongodb&#xff08;如果查詢不到數據&#xff0c;則添加數據&#xff09; 1&#xff1a;工具類BathUpdateOptions 1 import org.springframework.data.mongodb.core.query.Query;2 import org.springframework.data.mong…

【開題報告】基于微信小程序的校園資訊平臺的設計與實現

1.選題背景與意義 隨著移動互聯網的快速發展&#xff0c;微信成為了人們日常生活中不可或缺的工具之一。在校園生活中&#xff0c;學生們對于校園資訊的獲取和交流需求也越來越高。然而&#xff0c;傳統的校園資訊發布方式存在信息不及時、傳播范圍有限等問題&#xff0c;無法…

三種Cache寫入方式原理簡介

三種Cache寫入方式原理簡介 在386以上檔次的微機中&#xff0c;為了提高系統效率&#xff0c;普遍采用Cache&#xff08;高速緩沖存儲器&#xff09;&#xff0c;現在的系統甚至可以擁有多級Cache。Cache實際上是位于CPU與DRAM主存儲器之間少量超高速的靜態存儲器&#xff08;S…

Minor GC和Full GC

我們在日常開發中可能經常會聽大家談論GC&#xff0c;但是其實很多人對GC的種類其實并不是很了解&#xff0c;接下來我們簡單介紹下Minor GC和Full GC及他們的區別。 MinorGC&#xff1a; 也可以叫作新生代GC&#xff0c;指的是發生在新生代的垃圾收集動作。因為新生代中對象大…

linux安裝軟件的幾種方法

見&#xff1a;http://blog.csdn.net/u010509774/article/details/50593231 一、rpm包安裝方式步驟&#xff1a; 1、找到相應的軟件包&#xff0c;比如soft.version.rpm&#xff0c;下載到本機某個目錄&#xff1b; 2、打開一個終端&#xff0c;su -成root用戶&#xff1b; …

Android NDK MediaCodec在ijkplayer中的實踐

https://www.jianshu.com/p/41d3147a5e07 從API 21&#xff08;Android 5.0&#xff09;開始Android提供C層的NDK MediaCodec的接口。 Java MediaCodec是對NDK MediaCodec的封裝&#xff0c;ijkplayer硬解通路一直使用的是Java MediaCodec接Surface的方式。 本文的主要內容是&a…

leetcode-49-字母異位詞分組(神奇的哈希)

題目描述&#xff1a; 給定一個字符串數組&#xff0c;將字母異位詞組合在一起。字母異位詞指字母相同&#xff0c;但排列不同的字符串。 示例: 輸入: ["eat", "tea", "tan", "ate", "nat", "bat"], 輸出: [[&quo…

【精心總結】java內存模型和多線程必會知識

內存模型 &#xff08;1&#xff09;java內存模型到底是個啥子東西&#xff1f; java內存模型是java虛擬機規范定義的一種特定模型&#xff0c;用以屏蔽不同硬件和操作系統的內存訪問差異&#xff0c;讓java在不同平臺中能達到一致的內存訪問效果&#xff0c;是在特定的協議下…

工作流 activity 視頻教程 + redis 視頻教程 百度網盤分享地址

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 云盤下載都沒有密碼&#xff0c;直接下載&#xff0c;解壓有密碼&#xff1a;chongxiangmengxiangjiaoyu&#xff0c; 解壓完成后就可以…

快速解決 GRADLE 項目下載 gradle-*-all.zip 慢的問題

1、首先根據項目中 gradle\wrapper\gradle-wrapper.properties 文件的 distributionUrl 屬性的值 #Tue Feb 06 12:27:20 CET 2018 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists zipStoreBaseGRADLE_USER_HOME zipStorePathwrapper/dists distributionUrlht…

[Python] 程序結構與控制流

1. 條件語句 if、else與elif語句用于控制條件代碼的執行。條件語句的一般格式如下&#xff1a; if expression:statements elif expression:statements elif expression:statements ... else:statements 如果不需要執行任何操作&#xff0c;可以省略條件語句的else和elif子句。…

webrtc 源碼結構

apiWebRTC 接口層。包括 DataChannel, MediaStream, SDP相關的接口。各瀏覽器都是通過該接口層調用的 WebRTC。call存放的是 WebRTC “呼叫&#xff08;Call&#xff09;” 相關邏輯層的代碼。audio存放音頻網絡邏輯層相關的代碼。音頻數據邏輯上的發送&#xff0c;接收等代碼。…

mysql查詢流程解析及重要知識總結

時光荏苒啊&#xff01;在過兩個月我就工作滿三年了&#xff0c;大學畢業的情景還歷歷在目&#xff0c;而我已經默默的向油膩中年大叔進發了。作為一名苦逼的后端工程師&#xff0c;我搞過一段時間python&#xff0c;現在靠java糊口&#xff0c;但后來才發現&#xff0c;始終不…

界面無小事(八):RecyclerView增刪item

界面無小事(一): RecyclerViewCardView了解一下 界面無小事(二): 讓RecyclerView展示更多不同視圖 界面無小事(三):用RecyclerView Toolbar做個文件選擇器 界面無小事(四):來寫個滾動選擇器吧! 界面無小事(五):自定義TextView 界面無小事(六):來做個好看得側拉菜單! 界面無小事…

Failed to install Tomcat7 service 解決

見&#xff1a; http://blog.csdn.net/desow/article/details/21446197 tomcat 安裝時出現 Failed to install Tomcat7 service 今天在安裝tomcat時提示 Failed to install Tomcat7 service了&#xff0c;花了大半天的時間找到了原因&#xff0c;下面分享給大家&#xff0c;希望…