我有一些话题要讨论。我有一个包含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非常清晰,应该不难理解,另一方面,if的数量太多了。
我的问题相当笼统,但是我正在用Python编写代码,所以我不能使用像switch这样的构造。
你认为如何?
更新
一件重要的事情是,StartObject()、StopObject()和StatusObject()是构造函数,我想为strategy引用分配一个对象。
发布于 2015-07-31 14:30:55
你可能需要一本字典。字典存储引用,这意味着函数完全可以使用,如下所示:
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的类。
发布于 2015-07-31 14:32:14
Python与switch语句的等价之处是使用字典。从本质上说,您可以像存储大小写一样存储密钥,而这些值就是对特定情况的调用。因为函数是Python中的对象,所以可以将它们存储为字典值:
operation_dispatcher = {
Operation.START: strategy_objects.StartObject,
Operation.STOP: strategy_objects.StopObject,
}然后可以如下所用:
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或者更简单地说:
strategy = operation_dispatcher.get(operation, default)
strategy() #call if needed这可能比有一堆乱七八糟的if-else语句要好得多。请注意,如果您没有其他情况可处理,您可以直接使用字典与operation_dispatcher[operation]。
发布于 2015-07-31 14:37:01
你可以试试像this这样的东西。
例如:
def chooseStrategy(op):
return {
Operation.START: strategy_objects.StartObject
Operation.STOP: strategy_objects.StopObject
}.get(op, strategy_objects.DefaultValue)就这样叫吧
strategy = chooseStrategy(operation)()此方法的优点是提供默认值(类似于最后的else语句)。当然,如果您只需要在代码中的一个位置使用此决策逻辑,则始终可以在不使用该函数的情况下使用策略= dictionary.get(op,默认值)。
https://stackoverflow.com/questions/31748617
复制相似问题