1、關於函數參數問題。html
當寫一個提供功能很靈活的函數的時候其接收的參數必然要不少(由於各類參數均可以由調用者靈活設定),一個比較經常使用的解決方案是設定一個封裝類,把要傳入的參數封裝到這個對象中而後傳入,好比:數據庫
1 /** 2 * 點工具 3 * @author CC11001100 4 * 5 */ 6 public class PointUtils{ 7 8 /** 9 * 計算兩點的距離 10 */ 11 public static double getDistance(double x1,double x2,double y1,double y2){ 12 return Math.sqrt(Math.pow(x1-y1,2)+Math.pow(x2-y2,2)); 13 } 14 15 }
很明顯這不符合面向對象的思想,咱們應該把(x1,y1) (x2,y2)封裝爲對象再傳入,好比封裝一個類表示點:設計模式
1 /** 2 * 平面上的一個點 3 * @author CC11001100 4 * 5 */ 6 public class Point { 7 8 private double x; 9 private double y; 10 11 public Point(double x, double y) { 12 this.x = x; 13 this.y = y; 14 } 15 16 public double getX() { 17 return x; 18 } 19 20 public void setX(double x) { 21 this.x = x; 22 } 23 24 public double getY() { 25 return y; 26 } 27 28 public void setY(double y) { 29 this.y = y; 30 } 31 }
而後修改(注意並不必定是改進哦,凡事無絕對)以前的工具類:函數
1 /** 2 * 點工具 3 * @author CC11001100 4 * 5 */ 6 public class PointUtils{ 7 8 /** 9 * 計算兩點的距離 10 */ 11 public static double getDistance(Point p1,Point p2){ 12 return Math.sqrt(Math.pow(p1.getX()-p2.getX(),2)+Math.pow(p1.getY()-p2.getY(),2)); 13 } 14 15 }
這個時候再調用就感受比較爽了:工具
1 public class Main_022 { 2 3 public static void main(String[] args) { 4 5 double ans=PointUtils.getDistance(new Point(1,1),new Point(2,2)); 6 System.out.println(ans); 7 8 } 9 10 }
通常狀況均可以這麼處理,總結一下規律:學習
當形參的個數不少的時候,咱們就應該考慮如何精簡了,這個時候就將形參列表中能夠分爲一組的參數提取出來封裝爲一個類,而後經過這個類來傳遞參數。
我猜這個《重構》中確定會有,雖然我買了歷來沒看完,準確的說是由於能理解的部分太少了因而就看不下去了...... :(ui
也悟出了一個道理:平常生產中會有很是多的技巧,很是多的看起來很酷很炫的方法論,前人都將它們總結好了放在書中了,可是不少東西,若是沒有經歷過相似相應情景的時候是很難理解它的。知行合一講的大概就是這麼個道理吧。this
記憶-->理解-->創造 大概是這麼個過程。spa
可是呢,凡事都有兩面性。換種思路分析一下這種方法的弊端:
調用者必需要去花費額外的成本去了解提供的封裝類,由於點是咱們很熟悉的概念因此比較容易理解,若是是一個很複雜很抽象而且頗有多是程序編寫者自個兒創造的概念的話(別跟我說你沒這麼幹過...),再使用這個接口的學習成本就會大大提升,調用者必需要深刻細節。設計
若是不封裝呢,好比我以前寫過的一個圖像工具類:
public static void draw9patchImage(BufferedImage panel,BufferedImage ninePatchImage,int patchRectSize,int panelRectSize,int x,int y,int width,int height)
其實最後四個形參是比較通用的概念應該封裝爲對象再傳入的,但是我就是不想,而後在調用的時候就比較痛苦了:
//繪製數據庫邊框 ImageUtils.draw9patchImage(buffer,border,7,7,30,30,230,280);
最後的那些數字簡直看花眼有木有啊,而後我就發明了一種方法....(看來cnblog的代碼識別度並非特別好嘛...)
//繪製數據庫邊框 ImageUtils.draw9patchImage(buffer,border,7,7,/**/30,30,/**/230,280);
萬一耳鼻編寫者寫出了相似的接口,咱們調用的時候的一個小技巧就是能夠用註釋給實參分組。
這樣子的話一眼就能夠看出實參的哪一部分是用來幹嗎的,不至於再看花眼了。
固然應該儘可能設計讓人用着舒服用着爽的接口啦 :)
總結一下:
形參:對象分組,提取能夠分爲一組的參數封裝爲對象。 實參:註釋分組,藉助註釋實現相似分組的功能來管理。
後注:當參數實在太多的時候就該考慮使用Builder設計模式了。
參考資料:設計模式之構建者模式(Builder)