見:http://blog.csdn.net/u011889786/article/details/51865344
見:http://blog.csdn.net/weiky626/article/details/1602691
一.提取子函數
說白了就是一個大函數里,可以根據不同功能分成幾個小函數,因為說不定,其他函數也可能會用到其中的函數
二.把大家都要用的方法放到父類中
? ? 所有對象都要執行同一個方法,那就把這個方法放到他們的父類中
三.下移函數到子類
? ?子類特有的方法就沒必要放到父類中,單獨實現就可以了
四.封裝固定的調用邏輯(有點模板模式的意思)
代碼會按照一定的邏輯執行,要完成這個功能,需要執行A,在執行B,最后執行C,這些邏輯通常比較固定,在實現了A,B,C功能之后就要調用它們實現功能,但是每次調用這三個功能函數,必然會造成代碼重復
不科學的代碼如下:
- Car?audi?=?new?Audi();??
- audi.closeDoor();??
- audi.start();??
- audi.speedup();??
- ??
- Car?bmw?=?new?BMW();??
- bmw.closeDoor();??
- bmw.start();??
- bmw.speedup();??
科學的代碼如下:
- public?abstract??class?SmartCar?extends?Car{??
- ????public?final??void?autoSpeedup(int?speed){??
- ????????this.closeDoor();??
- ????????this.start();??
- ????????this.speedup();??
- ????????System.out.println("xcqw?加速到?:"+speed);??
- ????}??
- }??
可以看到我們在autoSoeedUp函數中按照順序調用了關門,啟動,加速3個操作,這樣在其他地方只需要調用autoSpeedup函數即可。autoSpeedup函數實際上運用了模板方法模式,它封裝了3個邏輯流程,并且這個流程不能被修改,但是子類可以重寫這三個過程
五.使用泛型去除重復邏輯
- /存儲Int的集合類??
- public?class?IntArrayList{??
- ????private?int[]?dataSet;??
- ????public??IntArrayList(int?size){??
- ????????dataSet?=?new?int[size];??
- ????}??
- ????public?int?get(int?position){??
- ????????return?dataSet[position];??
- ????}??
- ??
- ????public?void?add(int?pos?,int?data){??
- ????????dataSet[pos]?=data;??
- ????}??
- ????public?int?size(){??
- ????????return?dataSet.length;??
- ????}??
- }??
- ??
- public?class?StringArrayList{??
- ????private?String[]?dataSet;??
- ????public?StringArrayList(int?size){??
- ????????dataSet?=?new?String[size];??
- ????}??
- ????public?String?get(int?position){??
- ????????return?dataSet[position];??
- ????}??
- ????public?void?add(int?pos?,String?data){??
- ????????dataSet[pos]?=?data;??
- ????}??
- ????public?int?size(){??
- ????????return?dataSet.length;??
- ????}??
- }??
可以看到IntArrayList和StringArrayList都實現了get,add,size三個函數,他們的代碼都是一樣的,只是具體類型不太一樣
所以我們可以抽象集合類SimpleArrayList的實現:
- public?class?SimpleArrayList<T>?{??
- ????private?T[]?dataSet;??
- ????public?SimpleArrayList(int?size){??
- ????????dataSet?=?(T[])?new?Object[size];??
- ????}??
- ????public?T?get(int?position){??
- ????????return?dataSet[position];??
- ????}??
- ????public?void?add(int?pos?,T?data){??
- ????????dataSet[pos]?=?data;??
- ????}??
- ????public?int?size(){??
- ????????return?dataSet.length;??
- ????}??
- } ?
- ??
- ??
- IntArrayList?intArr?=?new?IntArrayList(2);??
- intArr.add(0,3);??
- intArr.add(1,55);??
- System.out.println(intArr.get(1));??
- ??
- StringArrayList?strArr?=?new?StringArrayList(3);??
- strArr.add(0,"hello");??
- System.out.println(strArr.get(0));??
- ??
- ??
- ??
- SimpleArrayList<Integer>?intArrayList?=?new?SimpleArrayList<>(3);??
- intArrayList.add(0,3);??
- intArrayList.add(1,55);??
- System.out.println(intArrayList.get(1));??
- ??
- ??
- SimpleArrayList<String>?strArrayList?=?new?SimpleArrayList<>(3);??
- strArrayList.add(0,"hello?,?SimpleArrayList");??
- System.out.println(strArrayList.get(0));??
六.函數避免過多的入參
- ??
- public?void?shareToMoment(String?title,String?content,String?thumbUrl,String?targetUrl,String?creator){??
- ????System.out.println("分享到朋友圈:文章標題為:"+title+"內容為:"+content);??
- }??
- ??
- public?static?void?shareToMoment(ShareData?shareData){??
- ????System.out.println("分享到朋友圈:文章標題為:"+shareData.title+"內容為:"+shareData.content);??
- }??
- public?class?ShareData{??
- ????public?String?title;??
- ????public?String?content;??
- ????public?String?thumbUrl;??
- ????public?String?targetUrl;??
- ????public?String?creator;??
- }??
- ShareData?shareData?=?new?ShareData();??
- shareData.title?="平凡之路";??
- shareData.content?=?"我曾經失落失望失掉所有方向,直到看見平凡才是唯一的答案";??
- shareData.targetUrl?=?"http://WWW.xxx.com";??
- ??
- ShareData(shareData);??
七.重構的支柱-----轉移函數,函數要職責分明
如果一個類中有太多行為(即函數),或一個類與另一個類之間有太多的函數調用,導致高度耦合,我就會考慮轉移該函數到更適合的類型中。(說白了就是要函數要職責分明)
- /班級類??
- public?class?AClass{??
- ????public?List<Student>?students?=?new?ArrayList<Student>();??
- ????public?void?add(Student?student){??
- ????????sudent.add(student);??
- ????}??
- }??
- ??
- public?class?Student{??
- ????public?String?id;??
- ????public?String?name;??
- ????public?Student(String?sId,String?sName){??
- ????????this.id?=?sId;??
- ????????this.name?=?sName;??
- ????}??
- ??????
- ????public?boolean?isBelongTo(AClass?class1){??
- ????????for(Student?stu?:class1.students){??
- ????????????if(stu.id.equals(this.id)){??
- ????????????????return?true;??
- ????????????}??
- ????????}??
- ????????return?false;??
- ????}??
- ??
- ????@Override??
- ????public?String?toString()?{??
- ????????return?"Student[?id=?"+id+",name="+name+"]";??
- ????}??
- }??
- ??
- ??
- public?class?Aclass{??
- ????public?List<Student>?students?=?new?ArrayList<Student>();??
- ????public?void?add(Student?student){??
- ????????sudent.add(student);??
- ????}??
- ??????
- ????public?boolean?contain(Student??student){??
- ????????for(Student?stu?:students){??
- ????????????if(stu.id.equals(student.id)){??
- ????????????????return?true;??
- ????????????}??
- ????????}??
- ????????return?false;??
- ????}??
- } ?
八.狀態模式---參考設計模式中的介紹
狀態模式介紹
九.避免對象為null,就寫個什么都不做的對象,如果是null就把這個給他
十.把功能拆開
不要把所有功能放在一個函數中。
另:
1.重命名:對類,接口,方法,屬性等重命名,以使得更易理解
2.抽取代碼:將方法內的一段代碼抽取為另一個方法,
以使得該段代碼可以被其他方法調用,這是重構中很重要很常用的,
此舉可以極大的精煉代碼,減少方法的代碼行數
3.封裝字段:將類的某個字段轉換成屬性,可以更加合理的控制字段的訪問
4.抽取接口:將類的某些屬性,方法抽取組成個接口,該類自動實現該接口
5.提升方法內的局部變量為方法的參數:這主要是在寫代碼的過程中會使用到
6.刪除參數:將方法的一個或多個參數刪掉
7.重排參數:將方法的參數順序重新排列