首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >过多的if语句

过多的if语句
EN

Stack Overflow用户
提问于 2015-07-31 14:27:40
回答 7查看 20.1K关注 0票数 13

我有一些话题要讨论。我有一个包含24个ifs/elifs的代码片段,Operation是我自己的类,表示类似于Enum的功能。

下面是一个代码片段:

代码语言:javascript
复制
if operation == Operation.START:
    strategy = strategy_objects.StartObject()
elif operation == Operation.STOP:
    strategy = strategy_objects.StopObject()
elif operation == Operation.STATUS:
    strategy = strategy_objects.StatusObject()
(...)

从可读性的角度来看,我有一些顾虑。是否最好将其转换为24个类并使用polymorphism?我不相信它会使我的代码可维护..。一方面,这些if非常清晰,应该不难理解,另一方面,if的数量太多了。

我的问题相当笼统,但是我正在用Python编写代码,所以我不能使用像switch这样的构造。

你认为如何?

更新

一件重要的事情是,StartObject()StopObject()StatusObject()是构造函数,我想为strategy引用分配一个对象。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-07-31 14:30:55

你可能需要一本字典。字典存储引用,这意味着函数完全可以使用,如下所示:

代码语言:javascript
复制
operationFuncs = {
    Operation.START: strategy_objects.StartObject
    Operation.STOP: strategy_objects.StopObject
    Operation.STATUS: strategy_objects.StatusObject
    (...)                  
}

为了以防万一,最好有一个默认的操作,所以当您运行它时,使用try except并处理异常(即。相当于你的else条款)

代码语言:javascript
复制
try:
    strategy = operationFuncs[operation]()
except KeyError:
    strategy = strategy_objects.DefaultObject()

或者使用字典的get方法,该方法允许在找不到您提供的键时指定默认值。

代码语言:javascript
复制
strategy = operationFuncs.get(operation(), DefaultObject())

请注意,在字典中存储括号时不包括括号,您只需在调用字典时使用它们。这也要求Operation.START是可理解的,但是应该是这样的,因为您将它描述为类似于ENUM的类。

票数 19
EN

Stack Overflow用户

发布于 2015-07-31 14:32:14

Python与switch语句的等价之处是使用字典。从本质上说,您可以像存储大小写一样存储密钥,而这些值就是对特定情况的调用。因为函数是Python中的对象,所以可以将它们存储为字典值:

代码语言:javascript
复制
operation_dispatcher = {
    Operation.START: strategy_objects.StartObject,
    Operation.STOP: strategy_objects.StopObject,
}

然后可以如下所用:

代码语言:javascript
复制
try:
    strategy = operation_dispatcher[operation] #fetch the strategy
except KeyError:
    strategy = default #this deals with the else-case (if you have one)
strategy() #call if needed

或者更简单地说:

代码语言:javascript
复制
strategy = operation_dispatcher.get(operation, default)
strategy() #call if needed

这可能比有一堆乱七八糟的if-else语句要好得多。请注意,如果您没有其他情况可处理,您可以直接使用字典与operation_dispatcher[operation]

票数 4
EN

Stack Overflow用户

发布于 2015-07-31 14:37:01

你可以试试像this这样的东西。

例如:

代码语言:javascript
复制
def chooseStrategy(op):
    return {
        Operation.START: strategy_objects.StartObject
        Operation.STOP: strategy_objects.StopObject
    }.get(op, strategy_objects.DefaultValue)

就这样叫吧

代码语言:javascript
复制
strategy = chooseStrategy(operation)()

此方法的优点是提供默认值(类似于最后的else语句)。当然,如果您只需要在代码中的一个位置使用此决策逻辑,则始终可以在不使用该函数的情况下使用策略= dictionary.get(op,默认值)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31748617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档