python - 太多的 if 语句

标签 python if-statement conditional code-readability code-maintainability

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

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 非常清楚,应该不难理解,另一方面, 太多了>如果s.

我的问题很笼统,但是我正在用 Python 编写代码,所以我不能使用像 switch 这样的结构.

你怎么看?


更新:

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

最佳答案

您可以使用字典。字典存储引用,这意味着函数完全可以使用,如下所示:

operationFuncs = {
    Operation.START: strategy_objects.StartObject
    Operation.STOP: strategy_objects.StopObject
    Operation.STATUS: strategy_objects.StatusObject
    (...)                  
}

最好有一个默认操作以防万一,所以当你运行它时使用 try except 并处理异常(即等同于你的 else 子句)

try:
    strategy = operationFuncs[operation]()
except KeyError:
    strategy = strategy_objects.DefaultObject()

或者使用字典的 get 方法,如果找不到您提供的键,您可以指定一个默认值。

strategy = operationFuncs.get(operation(), DefaultObject())

请注意,将括号存储在字典中时不包括括号,您只需在调用字典时使用它们。此外,这还要求 Operation.START 是可散列的,但情况应该如此,因为您将其描述为类似于 ENUM 的类。

关于python - 太多的 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31748617/

相关文章:

python - Django 条件聚合

python - 需要帮助修改洪水填充算法

r - 在 R 中嵌套 ifelse

ruby - ruby 中有 each_if 吗?

java - Android 中 "IF STATEMENT"的行为非常奇怪

c - 字符串问题(do/while 循环和 if 逻辑)

scala - 基于scala中变量类型的条件

python - 在 DataFrame.groupby 的情况下,如何根据另一列的最大值获取列的值

python - 如何在 Python 3 中将 QImage(QPixmap) 转换为 PIL Image?

字符串中的python反向标记