2011-04-21 57 views
9

是否有任何設計模式或乾淨的方式來做功能/方法參數檢查(針對允許的值)?什麼是乾淨的方式(或模式)做功能參數檢查?

目前,我的函數中的很多初始代碼都包含這些參數檢查(空字符串,無效字符,現有id,...),並且在必要時,它有點醜陋,並且模糊了「真實」代碼的功能。通常情況下,我的代碼是這樣的:

def my_function(p1,p2,p3,p4): 
    #check parameters 
    if p1 == '' 
     raise InvalidArgError('p1 can not be empty') 
    if p1 not in valid_list: 
     raise InvalidArgError('p1 does not exist') 
    if p2 < 0: 
     raise InvalidArgError('p2 can not be negative') 
    ... 

    #finally do something 
    p = p2+p3 

對於解決方案,我沿着decorators在Python的思路思考。
我正在使用Python,但我想一個好的解決方案將是語言無關的。

回答

0

我想不是真的,不是一個統一的方式來做到這一點。

我親自澄清它在我的職能在實際代碼開始,如果有很多參數的檢查做(隨便舉個例子):

def setpoint(x, y): 
    # checking for out of bounds 
    if x < 0 or x >= maxwidth: return false 
    if y < 0 or y >= maxheight: return false 

    # start function 
    map[x][y] = true 

也許你應該考慮在更小的功能分裂的功能了,傳播參數檢查。

3

唯一還算語言無關的事情,我可以在那一刻想象某種代碼的合同,所以你可以做這樣的事情:

func foo(param1, param2) 
{ 
    Contract.NotNull(param1) 
    Contract.IsIn(0, 100, param2) 
} 

我想你能想出的一些種類在大多數的實現編程語言。

更新

Microsoft is working on an implementation並有a Java implementation

+0

我不熟悉代碼的含義。你有什麼好的入門鏈接? (谷歌返回的結果乍一看似乎有點過高) – Rabarberski 2011-04-21 19:39:23

1

方法的每個參數都表示一個實體。對於方法/整個類所用的參數值必須存在一些約束或假設。所以我寫這些參數的有效性檢查方法。

void drawRectangle(int length, int width) { 
    if (isValidLength(length) == false || isValidWidth(width) == false) { 
     // log about invalid argument so that it can be easily traced for debugging 
     return; 
    } 

    // remaining code 
} 

boolean isValidLength(int length) { 
    if (value < 0 || value > 100) { 
     return false; 
    } 

    return true; 
} 

優點是避免重複的代碼。如果是空檢查,範圍檢查是在幾種方法中爲相同的參數類型完成的,並且稍後某個參數的範圍由於需求修改而發生變化,則會在多個地方進行更改。另一方面,如果檢查是通過單獨的方法完成的,則更改的範圍會縮小。

相關問題