1. 程式人生 > >java方法引數校驗實踐

java方法引數校驗實踐

     在 spring 的validation 驗證框架還沒有釋出出來,怎麼很優雅地對引數合法性做校驗呢 ?

有兩種時間方式:

(1)

result = method1();
if (result is error){ //根據返回結果判斷是否退出
         ...//加錯誤碼
         return result;
}
result = method2();
if (result is error){ //根據返回結果判斷是否退出
         ...//加錯誤碼
         return result;
}
do something...
(2)


        try {
            validators.checkNull(appVersionId, operator);// 如果有邏輯問題丟擲ErrorCodeException
            validators.checkAppVersionExist(appVersionId);// 如果有邏輯問題丟擲ErrorCodeException
        } catch (ValidationException e) {
    //將ErrorCodeException異常轉換為Result  
            appResult.setFinished(true);
            appResult.addResult(new Result<String, OperationException>(e.getMessage(),
                                                                       ResultStatus.ERROR, e));
            return appResult;
        }
        return deploy(appVersionId, null, operator, true);

validator 驗證器裡面方法:

    public void checkNull(final Object... args) throws ValidationException {
        for (Object arg : args) {
            if (null == arg) {
                throw new ValidationException("", ErrorMessages.DEPLOY_ARGS_NULL);// 將錯誤碼封裝在 具體的驗證其裡面
            }
            if (arg instanceof List) {
                int count = ((List) arg).size();
                for(int i = 0;i< count ; i++){
                    ((List) arg).remove(null);
                }
            }
            if (arg instanceof Collection && ((Collection) arg).size() == 0) {
                throw new ValidationException("", ErrorMessages.DEPLOY_ARGS_NULL);
            }
            if (arg instanceof Map && ((Map) arg).size() == 0) {
                throw new ValidationException("", ErrorMessages.DEPLOY_ARGS_NULL);
            }
        }
    }

儘量將 錯誤碼封裝在具體的方法中,不要統一判斷然後設定錯誤碼。

但是我推薦採用第二種方式, 理由主要有三個方面: 

1. 從重構的角度來說, 如果一個方法中有多個return出口, 當方法膨脹之後需要將一塊程式碼抽取出來單獨形成一個方法的時候比較困難, 而採用異常的方式則可以很容易的抽取出單獨方法. 
2. 從程式碼重用的角度來說, 第一種如果method1, method2方法有多個地方呼叫, 這些需要呼叫的地方大部分情況下都要對結果進行判斷加錯誤碼並返回結果, 這個是重複的程式碼, 這樣重複性程式碼在ic中是隨處可見的, 我希望通過拋錯誤碼異常的方式來減少這種重複的東西. 
3. 從封裝的角度來說, 將非正常結果的處理封裝在方法的內部, 可以提高內聚性.