1. 程式人生 > >ym——優化你的Java代碼(新)

ym——優化你的Java代碼(新)

idt blank rgb 流程圖 spa int 倒置 職責 代碼

轉載請註明本文出自Cym的博客(http://blog.csdn.net/cym492224103),謝謝支持!


1.面向對象的3要素。

技術分享

2.面向對象開發的6大原則。

1.單一職責原則

應該有且僅有一個原因引起類的變更。

2.裏氏替換原則

僅僅要父類能出現的地方,其子類就應該能出現。

也就是用子類替換父類後。保證程序照樣執行。

3.依賴倒置原則

面向接口編程。

4.接口隔離原則

接口細化,也就是接口中的方法要盡量少。

5.迪米特法則

也稱為最少知識原則,其定義為:一個對象應當對其它對象有最少的了解。也就是一個類中不要有過多的其它類。

6.開閉原則

開閉原則的核心是:對擴展開放。對改動關閉。


3.圈復雜度(Cyclomatic ComplexityCC

圈復雜度(下面簡稱CC)是一種度量方法,表明一個方法中運行路徑的數量。

CC1開始,每多一個條件語句(ifelseswitch…casewhileforCC值加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代碼(新)