if语句太多了

Kon*_*rad 9 python conditional if-statement 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()
(...)
Run Code Online (Sandbox Code Playgroud)

从可读性的角度来看,我有一些顾虑.更好的是将它改成24个类并使用多态?我不相信它会使我的代码可维护......从一方面来说,这些代码if非常清晰,并且不应该难以理解,另一方面,有太多if的代码.

我的问题相当普遍,但是我用Python编写代码所以我不能使用像switch.

你怎么看?


更新:

一个重要的是StartObject(),StopObject()并且StatusObject()是构造函数,我想分配一个对象来strategy引用.

Sup*_*Man 12

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

operationFuncs = {
    Operation.START: strategy_objects.StartObject
    Operation.STOP: strategy_objects.StopObject
    Operation.STATUS: strategy_objects.StatusObject
    (...)                  
}
Run Code Online (Sandbox Code Playgroud)

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

try:
    strategy = operationFuncs[operation]()
except KeyError:
    strategy = strategy_objects.DefaultObject()
Run Code Online (Sandbox Code Playgroud)

或者使用字典的get方法,如果找不到您提供的密钥,则允许您指定默认值.

strategy = operationFuncs.get(operation(), DefaultObject())
Run Code Online (Sandbox Code Playgroud)

请注意,将它们存储在字典中时不包括括号,只需在调用字典时使用它们.这也需要Operation.START可以清洗,但是应该是这种情况,因为你将它描述为类似于ENUM的类.