標籤:最佳化 bre java 面向 流程 mod get 裡氏替換 路徑
轉載請註明本文出自Cym的部落格(http://blog.csdn.net/cym492224103),謝謝支援!
1.物件導向的3要素。
2.物件導向開發的6大原則。
1.單一職責原則
應該有且僅有一個原因引起類的變更。
2.裡氏替換原則
僅僅要父類能出現的地方,其子類就應該能出現。
也就是用子類替換父類後。保證程式照樣執行。
3.依賴倒置原則
面向介面編程。
4.介面隔離原則
介面細化,也就是介面中的方法要盡量少。
5.迪米特法則
也稱為最少知識原則,其定義為:一個對象應當對其它對象有最少的瞭解。也就是一個類中不要有過多的其它類。
6.開閉原則
開閉原則的核心是:對擴充開放。對改動關閉。
3.循環複雜度(Cyclomatic Complexity,CC)
循環複雜度(下面簡稱CC)是一種度量方法,表明一個方法中運行路徑的數量。
CC從1開始,每多一個條件陳述式(if。else。switch…case。while,for)CC值加1;
一個方法的CC值越大,表明該方法越複雜;
CC值指明了全然測試一個方法所須要的測試用例。
4.循環複雜度度量
CC∈[0,5]:代碼品質不錯;
CC∈[6,20]:可能存在須要拆分的代碼,應該儘可能想辦法重構。
CC∈[21, ∞ ):必須進行重構。假設你的代碼CC常常達到這個水平,請又一次整理Coding的思路;
請儘可能保證CC<10。
5.循環複雜度計算
V(G) = e – n + 2;
V(G):循環複雜度
e:程式流程圖中的邊數。
n:程式流程圖中的節點數;
6.循環複雜度計算
代碼:
void test() { int cnt = 0; for(int I = 0;I < 100;i++) { cnt++; } if(cnt > 100) { System.out.println(); } …}
對應流程圖:
7.減少循環複雜度
方法一
提煉函數,抽取方法:
最佳化前:
Int getAppKey(String user, String package) { String userId = “”; String packageId = “”; System.out.println(“=============”); if(null == user) { System.out.println(“user id is null.”); } else { userId = “user_” + id1; System.out.println(“userid is ” + userId ); } if(null == package) { System.out.println(“packageId id is null.”); } else { packageId = “package_” + id2; System.out.println(“packageId is ” + packageId ); } System.out.println(“=============”); return userId .hashCode() ^ packageId .hashCode();}
最佳化後:
Int getAppKey(String user, String package) { String userId = geId(“user_”, user); String packageId = getId(“package_”, package); printId(userId, packageId ); return userId .hashCode() ^ packageId .hashCode();}String getId(String head, String key) { String id = “”; if(key != null) { id= head + user; } return id;}String getPrintInfo(String name, String value) { String info = name + “is ” + value; if(“”.equals(value)) { info = name + “is null.”; } return id;}void printId(String userId , String packageId) { System.out.println(“=============”); System.out.println(getPrintInfo(“userId”, userId)); System.out.println(getPrintInfo(“packageId”, packageId)); System.out.println(“=============”);}
方法二
用迴圈覆寫準則式:
最佳化前:
String getName(String id) { String name = null; if("0000".equals(id)) { name = "小吳"; } if("0001".equals(id)) { name = "小王"; } if("0002".equals(id)) { name = "老趙"; } if("0003".equals(id)) { name = "小李"; } if("0004".equals(id)) { name = "小劉"; } if("0005".equals(id)) { name = "小張"; } return name; }
最佳化後:
private static String getName(String id) { String name = null; //當元素個數較多的時候,將數組替換成Map。數組對象可作為參數傳入。 String[] idArray = new String[]{"0000", "0001", "0002", "0003", "0004", "0005"}; String[] nameArray = new String[]{"小吳", "小王", "老趙", "小李", "小劉", "小張"}; for(int i = 0;i < idArray.length;i++) { Object peopleID = idArray[i]; if(peopleID.equals(id)) { name = nameArray[i]; break; } } return name; }
方法三
用初始值消減條件分支:
最佳化前:
String getCode(String id) { String code = ""; if(null == id) { code = "0000"; } else { code = "00" + id; } return code; }
最佳化後:
String getCode(String id) { //初始化時設為預設值 String code = "0000"; if(id != null) { code = "00" + id; } return code; }
方法四
函數取代參數:
最佳化前:
String getValue(String param) { String value = null; if("name".equals(param)) { value = mName; } else if("hight".equals(param)) { value = mHight; } else if("X".equals(param)) { value = mX; } else if("Y".equals(param)) { value = mY; } return value; }
最佳化後:
String getName() { return mName; } private static String getHight() { return mHight; } private static String getX() { return mX; } private static String getY() { return mY; }
方法五
用參數應對變化:
最佳化前:
private static int getWidth(int val) { int width = 0; if(val == 10) { width += ((val << 2) ^ 0x10) * 200; } else if(val == 100) { width += ((val << 2) ^ 0x1a) * 200; } return width; }
最佳化後:
private static int getWidth(int val) { int width = 10; width += getDeta(val, 0x10); width += getDeta(val, 0x1a); return width; } private static int getDeta(int val, int trim) { int deta = 0; if(val == range) { deta = ((val << 2) ^ trim) * 200; } return deta; }
ym——最佳化你的Java代碼(新)