0

我不确定如何搜索这个,所以如果已经回答,请指点我。

我再次遇到一个相当普遍的情况,我不确定最佳实践。考虑一个函数具有三个可能值之一的情况;我们会说它们是“a”、“b”和“c”。

如果我收到“a”或“b”,在某些特定情况下,我有大量的重叠处理要做。但是,如果我收到“c”,我需要做一些完全不同的事情。举例来说,这是微不足道的,但我有一些非常重要的例子。

示例(Python):

def doStuff(self, val):
    if   val == 'a':
        self.counter += 1
        print val, "is very good"
        self.passing = True
        self.doMoreStuff()
    elif val == 'b':
        self.counter += 2
        print val, "is not too bad"
        self.passing = True
        self.doMoreStuff()
    elif val == 'c':
        self.counter -= 1
        self.passing = False
        print val, "is unacceptable"
        self.weAreDoneHere()

所以这个想法是,对于“a”或“b”,有一些特定于案例的说明和一些重复的东西,但对于“c”,它是完全不同的。在某些情况下,只留下三个单独的案例并不算太糟糕,尽管它让我干涩的眼睛抽搐着看它。在其他情况下,如果有很多重复的代码,这可能是一个更大的问题。

一种解决方案如下所示:

def doStuff(self, val):
    if   val == 'a' or val == 'b':
        if val == 'a':
            self.counter += 1
            print val, "is very good"
        elif val == 'b':
            self.counter += 2
            print val, "is not too bad"
        self.passing = True
        self.doMoreStuff()
    elif val == 'c':
        self.counter -= 1
        self.passing = False
        print val, "is unacceptable"
        self.weAreDoneHere()

这种双重检查值方法好吗?它也让我干涩的眼睛有点抽搐,但不如重复大量代码。

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

4

1 回答 1

1

我不知道 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;
    }
};

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

于 2013-04-05T19:38:17.573 回答