首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有没有一种更干净的方法来向这段代码中添加额外的switch语句?

当然,可以通过使用策略模式(Strategy Pattern)来使代码更加干净和易于扩展。策略模式允许你定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。这样可以避免使用大量的switch或if-else语句。

基础概念

策略模式是一种行为设计模式,它允许你在运行时选择算法的行为。通过定义一系列算法,把它们封装到各个策略类中,并使它们可以互换,策略模式让算法独立于使用它的客户端而变化。

优势

  1. 可扩展性:新增策略时,只需添加新的策略类,无需修改现有代码。
  2. 可维护性:每个策略类职责单一,易于理解和维护。
  3. 灵活性:可以在运行时动态切换策略。

类型

策略模式通常涉及三个角色:

  • Context(上下文):使用策略的类,它持有一个策略接口的引用。
  • Strategy(策略):定义所有支持的算法的公共接口。
  • ConcreteStrategy(具体策略):实现了策略接口的具体算法类。

应用场景

适用于需要在不同情况下使用不同算法或行为的情况,例如支付方式的选择、排序算法的选择等。

示例代码

假设我们有一个计算器应用,需要根据不同的操作符(如加、减、乘、除)执行不同的计算。

传统方法(使用switch语句)

代码语言:txt
复制
function calculate(num1, num2, operator) {
    switch (operator) {
        case '+':
            return num1 + num2;
        case '-':
            return num1 - num2;
        case '*':
            return num1 * num2;
        case '/':
            return num1 / num2;
        default:
            throw new Error('Invalid operator');
    }
}

使用策略模式

代码语言:txt
复制
// 定义策略接口
class OperationStrategy {
    execute(num1, num2) {
        throw new Error('You have to implement the method execute!');
    }
}

// 具体策略类
class AddStrategy extends OperationStrategy {
    execute(num1, num2) {
        return num1 + num2;
    }
}

class SubtractStrategy extends OperationStrategy {
    execute(num1, num2) {
        return num1 - num2;
    }
}

class MultiplyStrategy extends OperationStrategy {
    execute(num1, num2) {
        return num1 * num2;
    }
}

class DivideStrategy extends OperationStrategy {
    execute(num1, num2) {
        return num1 / num2;
    }
}

// 上下文类
class Calculator {
    constructor(strategy) {
        this.strategy = strategy;
    }

    setStrategy(strategy) {
        this.strategy = strategy;
    }

    calculate(num1, num2) {
        return this.strategy.execute(num1, num2);
    }
}

// 使用示例
const calculator = new Calculator(new AddStrategy());
console.log(calculator.calculate(10, 5)); // 输出: 15

calculator.setStrategy(new SubtractStrategy());
console.log(calculator.calculate(10, 5)); // 输出: 5

解决问题的方法

通过使用策略模式,我们可以避免在代码中使用大量的switch或if-else语句,从而使代码更加清晰、易于维护和扩展。每当需要添加新的操作时,只需创建一个新的策略类并实现相应的逻辑即可。

这种方法不仅提高了代码的可读性和可维护性,还使得添加新功能变得更加简单和直观。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

代码之丑

,这段代码客观上也造就了重复。...建议:不能以性能为由编写长函数,性能优化不应该是写代码的第一考量;面向意图拆分小函数,不能“平铺直叙”;让营地比你来时更干净(—— 童子军军规),坚决对抗一次加一点,逐渐糟糕腐坏的代码。...七、滥用控制语句7.1 嵌套的代码问题:平铺直叙地写代码。...,级别越高折扣就越高,最类似的部分就是switch,这也是一种坏味道:重复的 switch(Repeated Switch)。...优化:Book类使用approve()方法修改状态字段,而不是直接使用set去操作字段。建议:相比于读数据修改是一个更危险的操作。缺乏封装再加上不可控的变化,setter 几乎是排名第一的坏味道。

68041

“干净”的代码,贼差的性能

这些要求相当具体,听起来只要照着做了,就让编写出“干净”的代码。但问题是,这样的代码执行起来效果如何? 为了更确切地测试“干净”代码的实际表现,我决定直接用相关文献里列出的示例代码。...现在,这段代码不再从虚拟函数调用中获取面积,而是通过 switch 语句从函数中获取——这跟“干净”编程的原则完全不符。但大家应该看得出来,后面这种更简洁,而且代码并没多大变化。...Switch 语句的每种执行情况,都跟类层次结构中的相应虚拟函数有着相同的代码。...Switch 语句的性能达到了“干净”版本的 2 倍,而查表版本更是达到后者的 15 倍。 这也凸显出“干净”代码的深层次问题:需求越复杂,这些规矩就越有损性能。...从之前的演示中可以看到,如果代码库围绕着函数进行架构设计,那么从表中取值或者删除 switch 语句等需求才会易于实现;而如果是围绕类型进行架构设计,那难度将大大增加。

57210
  • 嘿~这里有一份超实用的 switch 教程,真的好想推荐给你

    所以如果几个条件之间是多选一的关系,一定要使用 if…else if 结构 。 2 switch 和 break 语句 处理多分支结构,可以考虑使用语法更简便的 switch 语句,如下所示 ?...所以如果只希执行某一个 case 后面的语句和程序块,还需要配合一个 break 语句,让代码在适当的位置跳出 switch,即如下所示 ?...然而,这段代码实际功能却与编程者的意图相去甚远。原因在于 C 语言中else 始终与同一对括号内最近的未匹配的 if 结合。...如果我们按照上面这段程序实际上被执行的逻辑来调整代码缩进,大致是这个样子: ? 也就是说,如果 x != 0,程序将不会做任何处理。...此外,在 C 语言中赋值符号被作为一种操作符对待,因而重复进行赋值操作(如 a = b = c)可以很容易地书写,并且赋值操作还可以被嵌入到更大的表达式中。

    85720

    降低认知复杂度的5个整洁代码技巧

    降低认知复杂度是帮助你编写安全、可维护和可靠的 干净代码 的关键,这将使其他开发人员(包括你自己)在长期内更快乐。以下是如何采取纪律性方法。 1. 编写团队会感谢你的代码 软件开发非常像团队运动。...如果所有代码都是一个接一个的命令链 - 没有循环或曲折 - 你就不会有任何问题在脑海中理清所有事情。在代码中添加循环和分支会使理解和处理代码变得越来越困难。 每次这样做都会使代码的认知复杂度逐渐增加。...查看你的代码,看看哪些嵌套组件导致了最大的头痛。然后,找到另一种编写代码的方法。了解每个组件带来的认知复杂度将帮助你走上正确的道路。 4....switch 语句是一种很好的方法,可以帮助消除一系列嵌套的 if 或 if/else 语句,这些语句使代码变得模糊不清,并且不会增加代码的认知复杂度。...帮助你跳出循环的 continue 或 break 语句也可以帮助你编写更清晰的代码,并且同样不会增加复杂度。这些只是可以帮助降低认知复杂度的不同类型结构中的一部分。 5.

    15710

    你一定需要知道的高阶JAVA枚举特性!

    JAVA枚举,比你想象中功能还要强大! 我经常发现自己在Java中使用枚举来表示某个对象的一组值。 在编译时确定类型可以具有什么值的能力是一种强大的能力,它为代码提供了结构和意义。...事实证明,Java枚举具有相当高级的特性,可以使代码干净、不易出错,功能强大。 让我们一起来看看Java中的一些高级枚举特性,以及如何利用这些特性使代码更简单、更可读。 枚举是类!...这是因为Java编译器知道上面的第一个问题,并且希望确保我们能够处理在不知情的情况下向Operation中添加了新枚举。 还好,Java8用函数式编程为我们提供了一个干净的解决方案。...因为我们的函数接受两个参数,所以我们可以使用(x,y)来指定它们。 然后我们定义了一个单行方法,它使用 ->x+y 返回一个值。这相当于下面的方法,只是更简洁而已。   ...如果没有这一点,如果我们在添加新Operation时还不记得更新switch语句,就有可能得到UnsupportedOperationException()。

    44520

    Java枚举:小小enum,优雅而干净

    这段代码实际上调用了3次Enum(String name, int ordinal)(ordinal单词的意思为顺序),也就是: new Enum("WANGER", 0); new Enum...的判断条件 使用枚举作为switch语句判断条件能让我们的代码可读性更强,示例如下。...因为Java虚拟机在加载枚举类的时候,会使用ClassLoader的loadClass方法,这个方法使用了同步代码块来保证线程安全。 ②、避免反序列化破坏单例。因为枚举的反序列化并不通过反射实现。...第一,CheckType新添加了构造方法,还有两个字段,key为int型,text为String型。...5)枚举会比静态常量更消耗内存吗? 说完枚举最常用的4个知识点后,我们来讨论一下“枚举会比静态常量更消耗内存吗?”这个话题——知乎上有人问这样的问题,还有很多人参与回答。

    46520

    Java枚举:小小enum,优雅而干净

    这段代码实际上调用了3次Enum(String name, int ordinal)(ordinal单词的意思为顺序),也就是: new Enum("WANGER", 0); new Enum...的判断条件 使用枚举作为switch语句判断条件能让我们的代码可读性更强,示例如下。...因为Java虚拟机在加载枚举类的时候,会使用ClassLoader的loadClass方法,这个方法使用了同步代码块来保证线程安全。 ②、避免反序列化破坏单例。因为枚举的反序列化并不通过反射实现。...第一,CheckType新添加了构造方法,还有两个字段,key为int型,text为String型。...5)枚举会比静态常量更消耗内存吗? 说完枚举最常用的4个知识点后,我们来讨论一下“枚举会比静态常量更消耗内存吗?”这个话题——知乎上有人问这样的问题,还有很多人参与回答。

    69330

    Python:编写条件分支代码的技巧

    Python 里的分支代码 Python 支持最为常见的 if/else 条件分支语句,不过它缺少在其他编程语言中常见的 switch/case 语句。...其实,通过为 UserCollection 添加 __len__ 魔法方法,上面的分支可以变得更简单: class UserCollection: def __init__(self, users...通过定义魔法方法 __len__ 和 __bool__ ,我们可以让类自己控制想要表现出的布尔真假值,让代码变得更 pythonic。 3....在编写包含多个 and 和 or 的表达式时,请额外注意 and 和 or 的运算优先级。即使执行优先级正好是你需要的那样,你也可以加上额外的括号来让代码更清晰。...结语 代码内的分支语句不可避免,我们在编写代码时,需要尤其注意它的可读性,避免对其他看到代码的人造成困扰。 看完文章的你,有没有什么想吐槽的?请留言告诉我吧。

    90000

    Python 工匠:编写条件分支代码的技巧

    Python里的分支代码 Python 支持最为常见的 if/else 条件分支语句,不过它缺少在其他编程语言中常见的 switch/case 语句。...其实,通过为 UserCollection 添加 __len__ 魔法方法,上面的分支可以变得更简单: class UserCollection: def __init__(self, users...通过定义魔法方法 __len__ 和 __bool__ ,我们可以让类自己控制想要表现出的布尔真假值,让代码变得更 pythonic。 3....在编写包含多个 and 和 or 的表达式时,请额外注意 and 和 or 的运算优先级。即使执行优先级正好是你需要的那样,你也可以加上额外的括号来让代码更清晰。...结语 代码内的分支语句不可避免,我们在编写代码时,需要尤其注意它的可读性,避免对其他看到代码的人造成困扰。 看完文章的你,有没有什么想吐槽的?请留言告诉我吧。

    56220

    Python 工匠:编写条件分支代码的技巧

    Python 里的分支代码 Python 支持最为常见的 if/else 条件分支语句,不过它缺少在其他编程语言中常见的 switch/case 语句。...其实,通过为 UserCollection 添加 __len__ 魔法方法,上面的分支可以变得更简单: class UserCollection: def __init__(self, users...通过定义魔法方法 __len__ 和 __bool__ ,我们可以让类自己控制想要表现出的布尔真假值,让代码变得更 pythonic。 3....在编写包含多个 and 和 or 的表达式时,请额外注意 and 和 or 的运算优先级。即使执行优先级正好是你需要的那样,你也可以加上额外的括号来让代码更清晰。...代码内的分支语句不可避免,我们在编写代码时,需要尤其注意它的可读性,避免对其他看到代码的人造成困扰。 看完文章的你,有没有什么想吐槽的?请留言告诉我吧。

    1.1K40

    带你认识Python的列表推导式

    1.用字典映射代替switch case语句 大家首先看下面这段用C#编写的switch case代码,代码很好理解,switch函数传入一个参数day,参数的不同对应不同的case语句,那怎么将这段代码用...default: dayName = "Unknown"; break; } 我的第一反应是if else条件语句,但是如果用条件语句的话,就体现不出现Python代码的强大了...,条件语句是各种语言都通用的一种形式,再想想有没有其他的方法?...day,第二个刚好对应switch case语句中的‘unknown’ 但这样写还是用一定的局限性,有点基础的同学都知道,switch case之间可以随便扩展,写很多模块,那么这样一来,再把字典的值当作是一个常量就不合适了...,因此,我们可以自定义函数,将函数作为一个参数传入字典中的值位置,具体代码如下 day = 0 def get_sunday(): return 'Sunday' def get_MOnday

    48530

    【React】1981- React 的 8 种条件渲染的方法

    Switch Case 语句 误差边界 高阶组件 (HOC) 渲染道具 让我们深入它们的使用方法,我们现在开始吧。 01、If/Else 语句 传统的 if/else 语句用于分支逻辑。...它们帮助根据条件是真还是假来执行代码的某些部分。这是一种根据条件控制流量的简单方法。 if/else 语句检查条件:如果条件为真,则运行“if”块内的代码。否则,“else”块将运行。...05、Switch Case 语句 “switch”语句评估表达式并执行相关的“case”块,匹配表达式的值。它非常适合在 React 中导致不同渲染的多种条件,确保代码有组织且可读。...它们提供了一种灵活的方式来跨组件共享逻辑,同时保持代码库干净。 渲染道具:当您需要对渲染进行细粒度控制并希望在组件之间共享渲染逻辑时,渲染道具模式是一个不错的选择。...每种技术都有其优点,选择适合工作的技术可以带来更干净、更易于维护的代码和更好的用户体验。 条件渲染中的提示、技巧和常见陷阱 乍一看,浏览 React 中的条件渲染似乎很简单。

    13810

    Python 进阶指南(编程轻松进阶):六、编写 Python 风格的代码

    这段笨拙的代码可以工作,但是通过学习编写 Python 风格代码的更标准的方法,您可以节省一些时间和精力。本节解释了程序员常犯的错误,以及应该如何编写代码。...使用字典代替switch语句 Java 之类的语言有一个switch语句,这是一种if-elif-else语句,它根据判定变量包含的众多值中的哪一个来运行代码。...默认情况下,Java switch语句具有“跳转”功能,要求每个块以一个break语句结束。否则,执行将继续到下一个块。忘记添加这个break语句是一个常见的错误来源。...同样,与手动调用open()和close()相比,with语句是一种更干净、更不容易出错的文件处理方式。with语句确保无论何时执行跳出with语句块,都会调用close()。...另外,虽然 Python 中没有switch语句,但是使用字典是一种简洁的方法来实现它的等价语句,而不需要使用几个if-elif-else语句,并且在两个值之间求值时可以使用三元运算符。

    94860

    【周一电台】11个值得掌握的Java代码性能优化技巧

    作为一个开发者,我们应该尽可能地保证自己写的代码干净、没有缺陷,并且尽可能地考虑性能问题。 为此,笔者总结了以下11个你肯定会用到的Java代码性能优化的技巧。...一方面,从维护角度来说,适当长度的方法易读性更强,更容易理解;另一方面,在类的加载和方法调用的过程中,方法会被加载到内存中。如果一个方法太大,处理起来就需要消耗额外的内存和CPU周期。...我们应该学会在恰当的逻辑点上将一个长方法拆开。 2.2 避免多个if-else语句 对于这个优化点,大家应该很熟悉了。但是实际在写代码的时候,还是if-else一撸到底。...另外,如果可能的话,我们可以考虑使用switch语句来代替多个if-else。switch语句比if-else有性能优势。...对比上面这段代码,合适的做法应该如下: boolean result = (condition1 && condition2) && (condition3  || condition4) 2.3 避免使用

    23410

    分享一些对你有帮助的JavaScript技巧

    有些用法比其他替代方法更好。 你如何改变你的JS代码,让它更简单,更容易阅读? 如果你在一个团队中工作,写出简单的代码是很重要的。因为你不是在真空中工作,所以你的程序必须容易被你的团队成员所遵循。...每个人都喜欢干净的代码! 学习如何让JavaScript尽可能的不痛苦,是一项宝贵的技能,肯定会让你成为办公室的宠儿。...->promise 为了让事情变得更干净、更高效,你可以将回调(ourCallbackFn)转化为承诺是一个函数。...; } 这段代码太多,需要检查布尔条件并调用函数。 if (isPrime) { startWatching(); } 使用(&&)运算符的简写呢?是的,完全避免使用if语句。酷吧?...如果你不为param传值,它将是未定义的,可能会引起一些不必要的副作用。 在定义函数参数时,有一种简单的方法可以将默认值传递给函数参数。

    1.2K20

    分享一些你可能不知道的但却很有帮助的JavaScript小技巧

    有些用法比其他替代方法更好。 你如何改变你的JS代码,让它更简单,更容易阅读? 如果你在一个团队中工作,写出简单的代码是很重要的。因为你不是在真空中工作,所以你的程序必须容易被你的团队成员所遵循。...每个人都喜欢干净的代码! 学习如何让JavaScript尽可能的不痛苦,是一项宝贵的技能,肯定会让你成为办公室的宠儿。...->promise 为了让事情变得更干净、更高效,你可以将回调(ourCallbackFn)转化为承诺是一个函数。...; } 这段代码太多,需要检查布尔条件并调用函数。 if (isPrime) { startWatching(); } 使用(&&)运算符的简写呢?是的,完全避免使用if语句。酷吧?...如果你不为param传值,它将是未定义的,可能会引起一些不必要的副作用。 在定义函数参数时,有一种简单的方法可以将默认值传递给函数参数。

    1.1K50
    领券