Design patterns 什么是进行函数参数检查的干净方法(或模式)?

Design patterns 什么是进行函数参数检查的干净方法(或模式)?,design-patterns,parameters,Design Patterns,Parameters,是否有任何设计模式或干净的方法来进行函数/方法参数检查(对照允许的值) 目前,我的函数中的许多初始代码都由这些参数检查(空字符串、无效字符、现有id等)组成,虽然必要,但它有点难看,混淆了函数的“真实”代码。通常,我的代码是这样的: def my_function(p1,p2,p3,p4): #check parameters if p1 == '' raise InvalidArgError('p1 can not be empty') if p1 not

是否有任何设计模式或干净的方法来进行函数/方法参数检查(对照允许的值)

目前,我的函数中的许多初始代码都由这些参数检查(空字符串、无效字符、现有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
def my_函数(p1、p2、p3、p4):
#检查参数
如果p1=''
raise InvalidArgError('p1不能为空')
如果p1不在有效的_列表中:
raise InvalidArgError('p1不存在')
如果p2<0:
raise InvalidArgError('p2不能为负')
...
#终于做点什么了
p=p2+p3
对于解决方案,我将按照Python中的思路进行思考。

我正在使用Python,尽管我想一个好的解决方案应该是独立于语言的。

我想不是真的,不是一种统一的方法

我个人在我的函数中澄清了这一点,如果需要进行大量参数检查,那么实际代码将从这里开始(随机示例):

def设定点(x,y):
#检查是否有越界
如果x<0或x>=maxwidth:返回false
如果y<0或y>=maxheight:返回false
#启动功能
map[x][y]=真

也许你应该考虑在更小的函数中分割函数,扩展参数检查。

,我现在唯一能想象到的与语言无关的东西是某种代码契约,这样你就可以做如下事情:

func foo(param1, param2)
{
    Contract.NotNull(param1)
    Contract.IsIn(0, 100, param2)
}
我假设您可以在大多数编程语言中提出某种实现

更新


方法的每个参数都代表一个实体。对于方法/整个类工作所基于的参数值,必须有一些约束或假设。因此,我编写了这些参数的有效性检查方法

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;
}
void draw矩形(int-length,int-width){
如果(isValidLength(长度)==false | | isValidWidth(宽度)==false){
//记录有关无效参数的日志,以便可以轻松跟踪以进行调试
返回;
}
//剩余代码
}
布尔值isValidLength(整数长度){
如果(值<0 | |值>100){
返回false;
}
返回true;
}

优点是避免重复代码。如果空值检查,则在几种方法中对同一参数类型进行范围检查,稍后该参数的范围会因需求修改而更改,然后在多个地方进行更改。另一方面,如果使用单独的方法进行检查,则更改范围会减小。

我不熟悉代码冲突。你有什么好的起始链接吗?(谷歌返回的结果乍一看似乎有点太高)将函数参数提取到一个函数中,并让它负责验证。这在
my_函数中只剩下业务逻辑。
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;
}