If statement 使用DRY和几个部分重叠的逻辑流是否有最佳实践?

If statement 使用DRY和几个部分重叠的逻辑流是否有最佳实践?,if-statement,If Statement,我不确定如何搜索这个,所以如果它已经被回答,请告诉我 我再次遇到一个相当普遍的情况,我不确定最佳做法。考虑一种情况,其中函数具有三种可能的值之一;我们会说它们是‘a’、‘b’和‘c’ 如果我收到“a”或“b”,在一些具体情况之后,我要做大量的重叠处理。然而,如果我收到“c”,我需要做一些完全不同的事情。为了举例,这是微不足道的,但是我有一些关于这方面的非常重要的例子 示例(Python): def doStuff(self,val): 如果val=='a': self.counter+=1 打印

我不确定如何搜索这个,所以如果它已经被回答,请告诉我

我再次遇到一个相当普遍的情况,我不确定最佳做法。考虑一种情况,其中函数具有三种可能的值之一;我们会说它们是‘a’、‘b’和‘c’

如果我收到“a”或“b”,在一些具体情况之后,我要做大量的重叠处理。然而,如果我收到“c”,我需要做一些完全不同的事情。为了举例,这是微不足道的,但是我有一些关于这方面的非常重要的例子

示例(Python):

def doStuff(self,val):
如果val=='a':
self.counter+=1
打印val,“非常好”
自我传递=真
self.doMoreStuff()
elif val==“b”:
自我计数器+=2
打印val,“还不错”
自我传递=真
self.doMoreStuff()
elif val=='c':
self.counter-=1
自我传递=错误
打印val,“不可接受”
self.weAreDoneHere()
因此,无论是“a”还是“b”,都有一些特定于案例的说明和重复的内容,但对于“c”,则完全不同。在某些情况下,只留下这三个单独的病例并不太糟糕,尽管看着它会让我的干眼症抽搐。在其他情况下,如果有大量重复的代码,这可能是一个更大的问题

一种解决方案如下所示:

def doStuff(self,val):
如果val='a'或val='b':
如果val=='a':
self.counter+=1
打印val,“非常好”
elif val==“b”:
自我计数器+=2
打印val,“还不错”
自我传递=真
self.doMoreStuff()
elif val=='c':
self.counter-=1
自我传递=错误
打印val,“不可接受”
self.weAreDoneHere()
这是双重检查值方法吗?这也让我的干眼症有点抽搐,但没有重复大量代码那么严重


我想,我真正的问题是,这是在什么地方讨论过的,还是有一种标准的“最佳实践”方法来做到这一点?

我不懂python,但在大多数情况下,您会重构a和B之间的所有共同点,并将它们放在一个私有函数中,然后从a和B调用它

javascript中的一个示例:

var someFunction = function (someArg) {
    var stuffCommonToAandB = function () {
        // stuff for both A and B
    };

    switch (true) {
        case someArg === 'A':
            stuffCommonToAandB();
            // stuff for A only
            break;
        case someArg === 'B':
            stuffCommonToAandB();
            // stuff for B only
            break;
        case someArg === 'C':
            // stuff for C only
            break;
    }
};

值得一提的是,向函数传递这样的标志以切换不同的行为有时可能表明函数违反了,在这种情况下,您可能需要后退一步,进一步重新考虑您的设计。

我不懂python,但在大多数情况下,您会重构A和B之间的所有公共部分,并将它们放在一个私有函数中,然后从A和B调用它们。python不那么重要,这是一个相当随意的选择。如果公共代码不足以保证一个额外的方法,只有3或4行,那么情况会怎样?我想大多数人会认为,即使是一行公共代码也足以保证一个新的私有函数。我可以同意这一点。尽管我认为“一条公共线就足够了”这一点,因为调用函数需要一条公共线。两行?完成。另外,如果你把你的评论加入到回答中,我会给你一个接受的答复。