2016-11-08 38 views
0

新手在這裏..我想知道什麼是在以下情況下的最佳做法:有多種錯誤可能性的多步驟程序 - 分別從外部類別調用每個步驟,或者有一種方法?

我使用MVC模式。我的控制器類需要調用Model-class來執行一個過程。這個程序有4個步驟。在前三個步驟中,如果出現問題,模型將生成一個字符串列表,控制器必須確保向用戶顯示,以及錯誤消息。在最後一步中,模型將生成一個Map,控制器必須確保向用戶顯示。在最後一步,也可能發生超時。

處理這個問題的最佳方法是什麼?

我在下面提出了兩個粗略的建議草案。

選擇1:

public class Model{ 


    public List<String> step1(){ 
     // return empty list if ok, fill list otherwise 
    } 

    public List<String> step2(){ // return empty list if ok, fill list otherwise} 

    public Map<String, String> step3(){  // return empty list if ok, fill list otherwise} 
} 


public class Controller{ 

    Model myMOdel; 

    public void doProcedure(){ 

     List<String> list = myModel.step1(); 
     if(list.size() != 0){ 
      String errormessage = "Step 1 error message" 
      // make sure View display list and errormessage 
      return; 
     } 


     list = myModel.step2(); 
     if(list.size() != 0){ 
      String errormessage = "Step 2 error message" 
      // make sure View display list and errormessage 
      return; 
     } 

     Map<String, String> map = myModel.step3(); 
     if(map.size()!=0){ 
      String errormessage = "Step 3 error message" 
      // make sure View display map and errormessage 
      return; 
     } 

     // make View display "procedure ok" message to user 
} 

,它開闢了可能性控制器去忘掉一個步驟,或做錯誤的順序步驟是什麼,我不喜歡這個。

備選方案2:

public class Model { 

    final static int STEP1_ERROR; 
    final static int STEP2_ERROR; 
    final static int STEP3_ERROR; 

    private void step1() throws ModelException{ 
     List<String> list; 
     if(somethingwentwrong){ 
      throw new ModelException(STEP1_ERROR, "errormessage for step1", list) 
     } 
    } 

    private void step2() throws ModelException {. 
      List<String> list; 
     if(somethingwentwrong){ 
      throw new ModelException(STEP2_ERROR, "errormessage for step2", list) 
     } 
    } 

    private void step3() throws ModelException{. 
     Map<String, string> map; 
     if(somethingwentwrong){ 
      throw new ModelException(STEP3_ERROR, "errormessage for step3", map) 
     } 
    } 

    public void procedure() throws ModelException{ 
     step1(); 
     step2(); 
     step3();  
    } 
} 


public class Controller{ 

    Model myModel; 

    try{ 
     model.procedure(); 
    } 
    catch(ModelException e){ 
     switch(e.getErrorNum){ 
      case // handle error type 1 
      case // handle error type 2 etc 
     } 
    } 

} 


public class ModelException extends Exception{ 

    List<String> list; 
    Map<String, String> map; 
    int errorNum; 

    public ModelException(int errorNum, String message, List<String>){ 
     .... 
    } 

    public ModelException(int errorNum, String message, Map<String><String>){ 
     .... 
    } 
} 

回答

0

的第二個選擇是肯定更好。

public class ModelException extends Exception{} 

public class Step1ModelException extends ModelException{ 
    public Step1ModelException(List<String> details) {...} 
    public List<String> getDetail(){...} 
} 

public class Step2ModelException extends ModelException{ 
    public Step2ModelException(List<String> details) {...} 
    public List<String> getDetail(){...} 
} 

public class Step3ModelException extends ModelException{ 
    public Step3ModelException(Map<String,String> details) {...} 
    public Map<String,String> getDetail(){...} 
} 
+0

感謝:但你甚至可以通過適當的層次異常更換ERRORNUM場(因爲每種類型的異常應說明在執行特定條件)完善它。我也喜歡2最好的。我沒有考慮過我可以製作這樣的子類。會嘗試 :) – Bugle

相關問題