Kon*_*rad 9 python conditional if-statement code-readability code-maintainability
我有一些话题需要讨论.我有一个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()
(...)
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的类.