我認爲你要找的是方法preconditions或者更一般地說contracts。
讓我們假設你的代碼是分裂成許多小的方法,因爲它應該是。然後你爲每種方法定義先決條件和後置條件。這些都需要得到滿足,否則就會失敗。如果你一直這樣做,那麼把這些檢查放在哪裏的問題將以相當直觀的方式回答自己。
舉個例子,讓我們考慮兩種方法,你可以寫做了一個User
的方法:
private void doSomethingWithUser(User u) {
if (u == null) {
/* take appropriate steps */
}
/* perform some action on the user object */
}
以上,該方法以零檢查的護理。因此,調用代碼不需要這樣做。
/*
* Does this and that with the User.
* Precondition: the User `u` may not be null!
*/
private void doSomethingWithUser(User u) {
/* perform some action on the user object */
}
這裏,該方法不檢查u
的null
,但閱讀的評論,我們可以看到,這是該方法是如何設計的。調用代碼的責任是交出一個非空對象,否則行爲將是未定義的。
當然,現在你面對的時候與這些去的決定。顯然,您可以爲您的方法和設置先決條件,讓他們仍然執行適當的檢查。然後他們可以返回一個表示錯誤的值或拋出一個異常,這很常見。
編輯:
但如果有大量的對象需要檢查之前,我使用他們,我應該檢查他們所有?
考慮一下:
public class SimpleClass {
public static void main (String[] args) {
User sware = new User("sware");
User domdom = new User("domdom");
doSomethingWithUser(sware);
doSomethingWithUser(domdom);
}
}
在這裏,我們宣佈和在main
方法的初始化兩個對象。我們知道他們不是零。然後,我們馬上使用它們。無論該方法是否檢查null
,我都不會在外面執行這樣的檢查 - 這些對象只是null
。
現在,假設我們有一個更復雜的代碼:
public class VeryComplexClass extends ComplexClass implements ComplexInterface {
/* ... */
@Override
private boolean doSomethingWithUser(User u) {
if (u == null) {
return false;
}
/* ... */
}
}
比方說,我們需要實現doSomethingWithUser()
方法來滿足該接口。或者方法來自父類,我們覆蓋它。我們不知道u
將來自哪裏。誰可能會調用這種方法?來自課堂外的用戶?或者這個方法是由這個類本身使用的?會傳入一個成員來調用它嗎?這一點很難說。因此,我會建議將null
檢查到位。
我覺得沒有你不應該因爲單元測試測試了代碼塊的邏輯正在按預期工作,您應該檢查那只是在您的代碼 –
對不起,我沒有明確表達,我的意思是當我編寫JUnit測試時,我發現我的代碼有問題,而不是int單元測試代碼 – kevin
是的,我知道了,只要使用前提條件並檢查前提條件 –