2013-09-29 32 views
0

在測試最終用戶插入的參數時使用異常或流量控制更好嗎? 僞代碼:異常與流量控制處理方法參數

class A{ 
List listOfPeople; 
public void insertName(String name) 
{ 
//if the name is not inserted in the registry it throws a runtime exception 
throw new IllegalArgumentException("Please insert a registered name"); 
} 
} 

或者也許是更好地執行以下操作:

class A{ 
List listOfPeople; 
public void insertName(String name) 
{ 
if (!listOfPeople.contains(name){ 
System.out.println("name not in the list, please insert a registered name"); 
reInsertName(); 
} 
else 
..do stuff.. 
} 
} 

我已閱讀,拋出異常是非常昂貴的..這是否意味着,只要有可能不把他們我們要避免讓他們試圖流動控制問題?

謝謝,的確ITIS

回答

0

,但在第二個執行你在同一個類來處理錯誤的情況下,我的意思是一個分離式的錯誤處理程序模塊是一個更好的辦法,分隔條件方面和應用單一責任類是較好的我認爲的實施方式

+0

是否會覆蓋使用異常增加凝聚力由單一的責任的開支? –

+0

這取決於項目的規模,如果它是一個大而複雜的項目,而且還需要考慮更新,則可以輕鬆地進行更新和添加新功能。在小項目中,您可能不會應用該項目。 – nik

+0

我打算使用狀態測試方法,以便分離責任並且不使用昂貴的例外。正如J.B.的Effective Java所述。 –

0

IllegalArgumentException當API方法(即public或protected)接收到違反其合約的參數時應拋出,例如如果參數爲null或空字符串,則您的方法insertName可能會拋出一個。

這樣簡單的檢查放在開頭,參數的約束應該被記錄下來。拋出異常來表示客戶端代碼中的錯誤(使用該方法的代碼)。

在你的情況下,對參數的約束更多的是在業務邏輯方面,它們依賴於程序狀態(該名稱以前已被添加到某個列表中)。使用IllegalArgumentException來表示程序狀態無效似乎不正確。如果有的話,那麼IllegalStateException在這裏好多了。

但我不會那樣設計它。如何多一點OO:

public class A { 

    List listOfPeople; 

    public static class Registration { 

     private final String name;    

     private Registration(String name) { 
      this.name = name; 
     } 
     public void insert() { 
      // ha, no need of exception throwing, because the person had to be registered first! 
     } 
    } 

    public Registration register(String name) { 
     listOfPeople.add(name); 
     return new Registration(name); 
    } 
}