java代碼優化

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;

    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章