当前位置: 首页 > 知识库问答 >
问题:

太多if语句

万俟炯
2023-03-14

我有一些话题要讨论。我有一个24ifs/elifs的代码片段。操作是我自己的类,它表示类似于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()是构造函数,我想将一个对象分配给策略引用。

共有3个答案

闻人昊昊
2023-03-14

你可以试试这样的。

例如:

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),不带函数

马德宇
2023-03-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\u dispatcher[operation]

冯曾笑
2023-03-14

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

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语句,有没有一种方法可以将它压缩成一个较短的代码块,如果可能的话,可以压缩成一行或两行,因为似乎有一种方法可以缩短这样一段代码