我有一些话题要讨论。我有一个包含 24 个 if
s/elif
s 的代码片段。 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/