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;
}