代碼重構實例

  給一個已有項目增加新需求時發現,原有項目中存在大量重複代碼,每個處理前臺的請求的方法中,參數檢查、權限認證、異常處理代碼都是一樣的,而真正的業務邏輯就被這一段段的重複代碼淹沒了,重複代碼的結構如下:

public Response getResult(String request){
    if(參數檢測失敗){
        return response(code 400);
    }
    if(權限檢測失敗){
        return response(code 403);
    }
    try{
        ***真正的業務邏輯***
        return response(code 200);
    }catch(Exception e){
        return response(code 500);
    }
}

  同一個給UI的資源類中,存在五段以上的代碼,而後續增加接口也還是需要做這些梳理。項目中存在大量重複代碼的弊端不需要我多說,經過設計後,開始重構代碼。因爲組裝返回碼的代碼都已存在,爲了複用原代碼,並減少重複代碼,做如下改動:
  新定義一個接口,其中有一個抽象方法execute():

public interface Handler{
    public Response execute(String... params);
}

  在原來的資源類中增加一個公共的私有方法(沒有定義再新的類,是因爲實際的業務代碼中用到了資源類中的其他私有方法,比如從請求中拿到用戶名),如下:

private Response dealMethod(Handler handler,String... params){
    if(參數檢測失敗){
        return response(code 400);
    }
    if(權限檢測失敗){
        return response(code 403);
    }
    try{
        return handler.execute(String... params);
    }catch(Exception e){
        return response(code 500);
    }
}

  使用String… 不定長度的參數,是因爲資源類中每個處理請求的方法中的參數不固定,但還好因爲是UI接口,參數都是String,否則就得使用Object…來處理了。
  最後,是資源類中原有的處理請求的方法,具體業務邏輯只需實現在Handler的execute方法中,即可實現業務分離:

public Response getResult(String request,String id){
    return dealMethod(new Handler(){
                public Response execute(String... params){
                    String request = params[0];
                    String id = params[1];
                    //具體的業務邏輯
                }
            },request,id);
}

  以下爲吐槽:

如果項目中有使用到Spring,那可以使用aop,簡單而又高大上,然而這個項目並沒有;據小夥伴說,AOP可獨立使用,引個jar包就行。但沒有必要時,真心不想額外引第三方jar包。自己玩玩隨意,但在項目中,每個jar包都是地雷啊。

雖然看過一遍23中設計模式,但以上具體使用了哪種模式,我還一臉懵逼,等有時間對上號了再填坑,但有時間就等於很久很久以後。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章