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

我怎样才能重构这个switch语句?

您好!您想要重构 switch 语句,以便更好地组织和管理代码。在这里,我将向您介绍一些常用的重构技巧和方法,以帮助您实现这一目标。

  1. 使用映射(Map):

将 case 语句替换为映射(Map),其中键是原始 case 语句中的条件,值是要执行的函数。这样可以消除 switch 语句,并使代码更易于阅读和维护。

代码语言:javascript
复制
function handleActions(action) {
  const actionsMap = {
    'CASE1': () => { /* do something */ },
    'CASE2': () => { /* do something else */ },
    // ...
  };

  if (actionsMap.hasOwnProperty(action)) {
    actionsMap[action]();
  } else {
    // handle default case
  }
}
  1. 提取方法(Extract Method):

将每个 case 语句中的代码提取为单独的方法。这将使代码更具可读性,并允许您轻松地重构代码以消除 switch 语句。

代码语言:javascript
复制
function handleCase1() {
  // do something
}

function handleCase2() {
  // do something else
}

function handleActions(action) {
  switch (action) {
    case 'CASE1':
      handleCase1();
      break;
    case 'CASE2':
      handleCase2();
      break;
    // ...
  }
}
  1. 使用策略模式(Strategy Pattern):

将每个 case 语句表示的策略封装为具有通用接口的独立对象。然后,根据条件选择要使用的策略对象,并调用其方法。

代码语言:javascript
复制
class Strategy {
  execute() {
    throw new Error('Not implemented');
  }
}

class Strategy1 extends Strategy {
  execute() {
    // do something
  }
}

class Strategy2 extends Strategy {
  execute() {
    // do something else
  }
}

function handleActions(action) {
  let strategy;

  switch (action) {
    case 'CASE1':
      strategy = new Strategy1();
      break;
    case 'CASE2':
      strategy = new Strategy2();
      break;
    // ...
  }

  strategy.execute();
}
  1. 使用 if/else 语句:

如果 switch 语句中只有几个 case 语句,您可以考虑使用 if/else 语句代替。这将使代码更简洁,更易于阅读。

代码语言:javascript
复制
function handleActions(action) {
  if (action === 'CASE1') {
    // do something
  } else if (action === 'CASE2') {
    // do something else
  } else {
    // handle default case
  }
}

希望这些建议能帮助您重构 switch 语句,以实现更好的代码组织和可维护性。如果您有任何其他问题,请随时提问。

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

相关·内容

去,你写的 switch 语句也太老土了吧

但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。...是时候冷静下来谈谈上述 switch 语句的老土问题了。 ?...看到上图了吧,当不小心删掉 default 语句后,编译器就会报错,提示:“没有返回语句”,为了解决这个问题,我们可以新建一个 player 变量作为返回结果,就像下面这样: private static...从 JDK 12 开始(本例使用的是 JDK 13),switch 语句升级了,不仅可以像传统的 switch 语句那样作为条件的判断,还可以直接作为一个返回结果。...语句变成了强大的 switch 表达式,美滋滋啊!

39520

【JS】332- 为什么更喜欢对象而不是 switch 语句

switch 语句 switch 语句允许我们根据传递的表达式的值来执行表达式并执行某些特定的操作,通常当你学习编写代码和算法时,你会发现可以将它专门用于多种值的情况,你开始使用它,它看起来很好,你很快意识到它给了你很大的自由...如果不将 break 关键字添加到 switch 语句,则不会抛出错误。...我们来看看这个问题的一种表示形式: switch ('first') { case 'first': { console.log('first case'); }...当没有太多情况需要处理时,对象方法可能比 switch 语句的速度要慢,这可能是因为我们正在创建一个数据结构,然后接收一个键,然而在 switch 中,我们只是检查值并返回值。...结论 本文不打算改变你的编码风格或让你停止使用 switch 语句,它只是试图提高你对 switch 语句的认识,以便它可以正确使用,并开放你的思想探索新的替代方案,在这种情况下,已经分享了喜欢使用的方法

1.3K40

这个语句报了无效语法的错误 但是不知道是哪里写错了

一、前言 前几天在Python最强王者交流群【群除佬】问了一个Pandas处理的问题,提问截图如下: 代码如下所示: songid_tags_df['tblTags'].map(lambda x :..., x) if isinstance(x,str)) 二、实现过程 后来自己给了一个示例代码,如下所示: songid_tags_df['tblTags'].map(lambda x: re.findall...三、总结 大家好,是皮皮。这篇文章主要盘点了一个Pandas处理的问题,文中针对该问题,给出了具体的解析和代码实现,帮助粉丝顺利解决了问题。...最后感谢粉丝【群除佬】提问,感谢【皮皮】、【瑜亮老师】、【隔壁山楂】给出的思路和代码解析,感谢【Python进阶者】、【孤独】等人参与学习交流。

66020

不只是黑盒测试:测试工程师如何识别和消除代码坏气味?

Baumann 给出了一个如何在测试自动化中使用面向对象编程原则的例子: 我们可以使用对象母亲(Object Mother)模式,这个模式基于面向对象的“抽象”原则。...Baumann 说,使用面向对象编程原则也有助于消除代码坏气味: 消除代码坏气味就是在不改变代码行为的情况下修改代码,基本上就是重构。...对于重构,我们需要将单元测试作为安全网,这样就可以知道我们所做的修改有没有破坏了任何东西以及代码是否仍然按照预期那样运行。...InfoQ:怎样才能管理好测试数据? Baumann:在测试自动化中,相信处理测试数据最好的方法是让每个测试管理好自己的数据。...例如,面向对象原则“多态性”有助于消除“switch 语句”和“太多参数”坏气味。

17810

【封装那些事】 未利用封装

一种臭名昭著的坏味是,在客户代码中使用条件语句(if-else或switch语句)来显式地检查类型,并根据类型执行相应的操作。...可能需要在客户代码或一个工厂类中使用switch-case语句,而只需要使用一次这个switch-case语句。...即使有影响也是只需要使用一次的这个switch-case语句,修改代码代价极小。...这让想起,在看完《重构》后天真幼稚的想消除项目中的switch-case语句,只要项目中存在switch-case语句就觉得存在坏味道,此后的一段时间很痛苦,因为项目中总是存在消灭不了的switch-case...示例分析二 还是那句话switch-case语句和if-else语句不可怕,可怕的是多个witch-case语句和if-else语句

1K90

业务代码如何才能不再写出大串的ifelse?

控制语句,到底何错之有呢? 嵌套代码 CR 如下分发刚写完的一篇博客的案例: 逻辑很简单,但有多层缩进,for 循环一层,里面有俩 if ,又多加两层。...重构后的 issueArticle 函数: 如今这就只剩一层缩进,代码复杂度大大降低,可读性和可维护性也大大增强。 禁用else 大多数人印象中,if 和 else 几乎比翼齐飞。...根据文章信息进行收费: 不用 else,简单方式就是让每个逻辑提前返回,类似卫语句: 业务简单的代码,这重构还很轻松,但对复杂代码,就得上多态了。...引入 UserLevel 模型,消除 switch: 前面代码即可去掉 switchswitch 其实就是一堆“ if…else” 的简化写法,二者等价,所以,这个重构手法,以多态取代的是条件表达式...,而不仅是取代 switch

75410

你写的代码就是你的犯罪证据

最近工作的主要内容,是在和别人结对编程,以对一个大型的遗留系统项目进行重构。 过程中,发现一个特别有意思的东西,重构了很多的 if 语句。从这些 if 语句里,大抵是映射出了业务的变化。...于是,便想写一篇文章来记录一下相关的心得。 你写的 if 就是你的犯罪证据 业务的复杂性,导致了架构的复杂性。在这些代码故事里,发生得最多的地方就是 if 语句。...于是,后来,又不得加了一个if 语句,导致了这个条件变得更加复杂。...你又不能过度设计,成一个 switch-case。但是,后来又多了好多个场景。...针对于有限的 if 语句来说,可以转为 switch case(在 IDEA 里只需要 alt + enter 就可以自动完成)。

45310

实现一个简单的Database2(译文)

代码对main()重构以适合识别新关键字,在第一部分中,main()函数只能识别“.exit”关键字,也就是程序退出命令。...译注:在上边代码中使用了单独的if+switch来处理了以“.”开头的“meta-commands”。 接下来,增加一个步骤,将输入行命令转换成内部表示的语句。这是SQLite前端的一个破解版本。...最后,门将预编译语句传递到execute_statement()函数,这个函数将最终变成我们的虚拟机。...这个看起来像是异常(exception)。不喜欢使用exception(并且C语言甚至不支持exception),所以我在任何可行的地方都是用enum结果码做返回。...如果switch语句没有处理enum成员,C编译器会报错,所以我们能感到小有信心,我们能处理所有函数结果。预计将来会有更多的结果代码被加入。

34520

开发中滥用面向对象,你是否违背了编程原则

Switch 声明 Switch 声明(Switch Statements) 你有一个复杂的 switch 语句或 if 序列语句。 ?...问题原因 面向对象程序的一个最明显特征就是:少用 switch 和 case 语句。从本质上说,switch 语句的问题在于重复(if 序列也同样如此)。你常会发现 switch 语句散布于不同地点。...如果要为它添加一个新的 case 子句,就必须找到所有 switch语句并修改它们。面向对象中的多态概念可为此带来优雅的解决办法。 大多数时候,一看到 switch 语句,就应该考虑以多态来替换它。...switch 语句常常根据类型码进行选择,你要的是“与该类型码相关的函数或类”,所以应该运用 提炼函数(Extract Method) 将 switch 语句提炼到一个独立函数中,再以 搬移函数(Move...何时忽略 如果一个 switch 操作只是执行简单的行为,就没有重构的必要了。

77340

Android模块化专题(四), 常见问题和注意事项

本文是对模块化专题介绍的系列文章,包含了以下四部分:《所理解的Android模块化(一)—概念和路由》,《所理解的Android模块化(二)—模块通信和模块间服务调用》,《所理解的Android模块化...《所理解的Android模块化(一)》; 《所理解的Android模块化(二)》; 《所理解的Android模块化(三)》; 本文主要来说一下Android模块化过程中的常见问题和注意事项: 注意事项...常见问题 1.模块化项目中的onClick、onItemClick等各种回调方法中的不能使用switch (view.getId()) case语句会报错...., case语句,而APP中却是可以的呢?...如果模块没有集成进来,想要跳转到这个页面的时候,不会崩溃,设置debug模式的时候会出现找不到的提示,而点击属于这个模块的功能的时候则不会有反应。

55110

一天一点代码坏味道(4)

本文是学习《代码之丑》的学习笔记,今天最后一天,一起品品滥用控制语句的味道,再看看策略模式的使用。...那么,我们可以采用一种典型的重构手法:卫语句(guard clause),如下所示: private void DistributeEpub(Epub epub) { if (!...registered) { return; } SendEpub(epub); } 使用卫语句重构后,没有了嵌套,也就没有了多层缩进。...如果不假思索的设计,我们可能就会写一串重复的if/else或者switch代码出来,通过上面的分析,我们知道,这个代码的圈复杂度会很高,不利于维护和理解。...最后,感谢郑晔老师的这门《代码之丑》课程,让受益匪浅!也诚心把它推荐给关注Edison的各位童鞋!

47810

RBAC

请注意上面的代码,它并没有明确语句来定义”项目管理员”这一角色到底包含哪些可执行的行为,它只是假设一个关联了项目管理员角色的用户可查看项目报表,而开发人员也是基于这一假设来写 if/else 语句。...怎样才能做到这一点呢? 显式地访问控制:更好的选择 从上面的例子我们看到,当权限需求发生变动时,隐式的权限访问控制方式会给程序开发带来沉重的负担。...当你发现某些错误的或危险的安全策略时,你可以迅速地修改策略配置,同时你的系统还能正常使用,而不需要重构代码重新部署系统。 怎样才能达到上面的理想效果呢?...例如上面提到的查看项目报表的功能,显式的权限控制方式不会像传统隐式的RBAC权限控制那样因不同的用户/角色要进行这个操作就需要重构代码;只要这个功能存在,显式的方式的权限控制代码是不需要改变的。...RBAC新解:Resource-Based Access Control 对于上面列出的诸多好处,重点要说是这种显式的机制带给我们的富有弹性的权限模型。

1.3K20

RBAC新解:基于资源的权限管理(Resource-Based Access Control)

同时将讨论一种认为更好的权限管理方式。 什么是角色 当说到程序的权限管理时,人们往往想到角色这一概念。角色是代表一系列可执行的操作或责任的实体,用于限定你在软件系统中能做什么、不能做什么。...请注意上面的代码,它并没有明确语句来定义”项目管理员”这一角色到底包含哪些可执行的行为,它只是假设一个关联了项目管理员角色的用户可查看项目报表,而开发人员也是基于这一假设来写 if/else 语句。...怎样才能做到这一点呢? 显式地访问控制:更好的选择 从上面的例子我们看到,当权限需求发生变动时,隐式的权限访问控制方式会给程序开发带来沉重的负担。...当你发现某些错误的或危险的安全策略时,你可以迅速地修改策略配置,同时你的系统还能正常使用,而不需要重构代码重新部署系统。 怎样才能达到上面的理想效果呢?...例如上面提到的查看项目报表的功能,显式的权限控制方式不会像传统隐式的RBAC权限控制那样因不同的用户/角色要进行这个操作就需要重构代码;只要这个功能存在,显式的方式的权限控制代码是不需要改变的。

2.6K70

代码重构(二):类重构规则

在给方法搬家时需要做的就是在方法的新家中创建一个方法,实现要搬移的功能,如果新创建的函数需要旧类中的数据,那么就创建一个委托对象来解决这个问题。...再仔细分析,其中的Switch语句中的业务逻辑用的全是Book类的东西,和当前BookCustomer类没用什么关联。...但是这个Switch语句是当前charge()函数的核心,也就是BookCustomer严重依赖Book类的地方。...以此分析下去,我们就清楚的指定,该Switch语句块放错了地方,它应该放在Book类中。所以我们应该将这块代码进行搬移。...重构方法就是在Book类中创建一个charge()函数,将Switch语句块放入新的charge()函数中。然后在原来的charge()函数使用Switch语句时调用新的charge()方法。

1.2K100

程序中减少使用if语句的方法集锦

大约十年前,听说了反if的活动,觉得这个概念非常荒谬。如果不用if语句,又怎么能写出有用的程序呢?这简直太荒谬了。 但之后你会开始思考:是否还记得上周你拼命想读懂的深度嵌套代码?糟透了对么?...曾经看到过一些非常糟糕的代码,只是为了消除所有的if语句而刻意避开if语句。我们想要绕开这个误区, 下面给出的每种模式,都会给出使用范围。 单独的if语句如果不复制到其他地方,也许是不错的句子。...解决方案: 将这个方法拆分成两个新的方法,然后if就不见了。 ? 模式2:使用多态(Polymorphism) 背景: 根据类型switch时。 ?...问题: 在添加新的类型时,我们必须要记得更新switch语句,此外随着不同bird的概念添加进来,bird类的凝聚力越来越糟。...重构代码增进理解时,发现这些方法都很有用。要记得并非所有if语句都是魔鬼,不过现代编程语言还有很多功能值得我们探索并使用。

1.3K20

重构:你可能不知道的重构场景

switch过多 假如现在要做一个支持微信、支付宝、招行等渠道的支付平台,需要对接不同渠道,因为不同渠道对接方式不同,就需要用switch来根据类型选择对应渠道的对接方式,但是很多地方都可能用到这个switch...,一旦新渠道加入就要满世界的找哪里用到了switch。...可以将switch语句移植为独立的函数,将这些函数组成基类,case语句调用子类对应的函数,具体实现让子类去完成,这样支付渠道的增加和变更只需要修改一个类即可。...多余的类 创建的每一个类,对于其他人来讲都是有理解成本的,如果曾经为某个变化所添加的类,在实际场景中并没有发生变化,那么就把这个类去掉吧,我们需要真正有价值、理解成本低的系统。...幽灵类 项目中偶尔会出现一些“幽灵类”,这些类没有做什么实际工作,只是负责调用其它的类,不如把这个“中间人”去掉,让实际要调用的那个类与调用者发生关系。

27420
领券