我有一些话题要讨论。我有一个24if
s/elif
s的代码片段。操作
是我自己的类,它表示类似于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个类并使用多态性?我不相信它会使我的代码可维护。。。一方面,那些if很清楚,应该不难理解,另一方面,if太多了。
我的问题相当笼统,但是我用Python编写代码,所以我不能使用像switch这样的构造。
你觉得呢?
更新:
一件重要的事情是StartObject()
、StopObject()
和StatusObject()
是构造函数,我想将一个对象分配给策略
引用。
你可以试试这样的。
例如:
def chooseStrategy(op):
return {
Operation.START: strategy_objects.StartObject
Operation.STOP: strategy_objects.StopObject
}.get(op, strategy_objects.DefaultValue)
这样称呼
strategy = chooseStrategy(operation)()
此方法的优点是提供默认值(如最终else语句)。当然,如果您只需要在代码中的一个位置使用此决策逻辑,那么您可以始终使用strategy=dictionary。get(op,default),不带函数。
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\u dispatcher[operation]
。
您可以使用字典。字典存储引用,这意味着函数完全可以使用,如下所示:
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())
请注意,在字典中存储括号时不包括括号,只在调用字典时使用括号。这也需要操作。START可以散列,但应该是这样,因为您将其描述为类似于枚举的类。
下面的代码确实可以按照我需要的方式工作,但是它很难看、太多或者其他一些事情。我看过一些公式,并试图写出一些解决方案,但最终得到的是类似数量的语句。 在这种情况下,有没有一种数学公式对我有利,或者16个if语句是可以接受的? 解释一下代码,这是一种同时回合制游戏。两个玩家各有四个动作按钮,结果来自一个数组(0-3),但如果这有帮助,变量'one'和'two'可以赋值任何值。结果是,0=两个都不赢,1
问题内容: 我有一些话题要讨论。我有一个24 s / s的代码片段。是我自己的类,表示类似于的功能。 这是一段代码: 从可读性的角度来看,我有些担心。将其更改为24类并使用多态性更好吗?我不相信这将使我的代码可维护…一方面,这些s很清楚,应该很容易理解,另一方面,s太多了。 我的问题相当笼统,但是我正在用Python编写代码,所以我不能使用。 你怎么看? 更新 : 重要的一点是,并且是构造函数,我
我对JS有问题。我正在尝试制作三个按类型排序的配料列表(用于酿造药剂),所有这些都是标签中的复选框。 你应该选择(选中)三个列表中的每一个元素,以便酿造药水。如果你选择了正确的成分,然后按下“酿造药水”按钮,你就有了一种确定的药水,如果你选择三种不匹配的成分,它会显示 在页面底部写着“看来这次没用了!”按下“酿造药水”按钮后。 在JavaScript中,我对三个列表都使用了一个数组,对每个列表中的
好吧,我正在使用字典,例如: 然后我想做的基本上是说,如果“用户”(一个参数)的名称前面有“@”,那么将变量前缀分配为“@”,如果他们的名称前面有“~”,则将变量前缀分配为“~”,如果他们有“ 然后我想说,如果用户的名字前面有“%”,则将前缀变量设置为“%”,否则将其设置为“”(因为这些值只有两个键)。为此,我需要一个if语句,并将其与self进行比较。声音的价值。 分配前缀变量的当前代码 目前,
有可能做如下事情吗: 或者: 我知道用很多if-else语句也可以实现同样的目标,但如果它像上面那样工作,看起来会更干净。
我在python中有一个又长又难看的else if语句,有没有一种方法可以将它压缩成一个较短的代码块,如果可能的话,可以压缩成一行或两行,因为似乎有一种方法可以缩短这样一段代码