2010-10-08 56 views
1

如果一個函數內部進行了所有正確的檢查,我應該在調用它之前檢查一切,還是更好?安全冗餘被認爲是一種好的做法嗎?保險是好還是不好的方式?

例子(一種類似C#的僞代碼的使用按引用參數傳遞):

 

doSomething(vector v) { 
    ...; 
    v.clear; 
    useCleanVector(v) 
} 

useCleanVector(vector v) { 
    if(!v.isClean) v.clear; 
    ... 
} 
 
+3

真的取決於你正在寫什麼樣的軟件。 – 2010-10-08 01:52:38

+4

這個問題對於一個很好的答案來說太籠統了......也許你可以給出一些代碼示例? – 2010-10-08 01:54:14

+0

這與函數式編程有什麼關係? – 2010-10-08 02:24:28

回答

0

我會說這是不好的形式。不可怕的形式,但同一種形式,導致此:

v.clear(); // clear the vector to be safe. 
v = v2; 

如果你的方式是通過在功能讓它重現這已經是一個函數裏,那麼你就不能節省時間的代碼第一名。如果每次調用某個函數都有相同的前導碼,則違反了DRY概念。

最好理解該函數檢查的內容以及它沒有做什麼並相應地使用它。

+0

我不認爲這是他的意思。他的意思是像調用函數時檢查函數參數的有效性一次,並且一旦它進入它就好像 – 2010-10-08 01:57:28

+0

@Pekka。但從數學邏輯的角度來看,就像@JoshD所說的那樣。 – Ivan 2010-10-08 02:00:35

+0

@Ivan是的,但你的函數可能會在以後的* *不執行第一個檢查的環境中使用。在這種情況下,第二個檢查*可能有意義(這也可能是不必要的,真的取決於你的項目) – 2010-10-08 02:02:19

4

最重要的是你以一種明顯的方式記錄你的先決條件和特殊條件。像這樣的東西似乎是明智的。

/** 
* precondition : id must be the id of a flarg. 
* 
* myfunc will return -1 if value is outside the valid 0-10 range. 
*/ 
int myfunc(int id, int value); 

這讓我的代碼是這樣的

int flarg_id = ... 
if (! is_flarg(flarg_id)) { printf("Bad flarg"); exit(1); } 
int value = ... 
int rv = myfunc(flarg_id, value); 
if(rv == -1) { printf("Bad value"); exit(1); } 
+0

+1。只要文檔能清楚地說明在什麼情況下功能將會做什麼,一大部分不確定性就會消失 – 2010-10-08 02:00:47

0

是的,你應該總是在執行的範圍內該級別所需要的檢查。

原因?當n個月後有人進來時,他們不會按照最後一個項目調用函數。確保每個函數本身都受到保護,這將有助於緩解愚蠢的錯誤,或者更糟的是,難以追蹤的錯誤。

+0

雖然這取決於支票的價格。如果代碼是有據可查的,那麼嚴格可能會超出必要的範圍 – 2010-10-08 02:00:12

+0

我認爲這樣做很重要,但恐怕在某些情況下甚至會引入難以追蹤的錯誤。 – Ivan 2010-10-08 02:02:10

+0

@ Ivan不是如果你的函數有很好的文檔記錄,並且每一個調用該函數的實例都是根據該文檔編寫的。文檔是關鍵 - 如果它很好,可以根據它編寫代碼,並相信它會提供預期的輸入 – 2010-10-08 02:04:23

1

有冗餘(通常很好),並且有重複你自己。

借用Josh的例子,如果函數Foo保證它清除一個向量,沒有理由事先清除它。信任並驗證您的API提供的保證。另一方面,即使你確信數據訪問表面完全抵禦任何惡意活動(你檢查了每個過程前後的條件!),但沒有理由將該表面暴露給非法用戶。找到你的瓶頸,並確保它們的安全,以防萬一你的代碼更深入地存在你還不知道的漏洞。

相關問題