什么时候应该尝试消除 switch 语句? [复制]

2024-03-26

我在我正在处理的代码库中遇到了一个 switch 语句,我正在尝试找出如何用更好的东西替换它switch 语句被认为是代码味道 http://c2.com/cgi/wiki?SwitchStatementsSmell。然而,读完后several https://stackoverflow.com/questions/126409/ways-to-eliminate-switch-in-codestackoverflow 上的帖子关于替换 https://stackoverflow.com/questions/374239/why-doesnt-python-have-a-switch-statement#374290 switch https://stackoverflow.com/questions/561401/refactor-my-c-code-switch-statement 声明 https://stackoverflow.com/questions/338206/switch-statement-with-strings-in-java我似乎想不出一种有效的方法来替换这个特定的 switch 语句。

这让我想知道这个特定的 switch 语句是否可以,以及是否有特定情况下 switch 语句被认为是合适的。

就我而言,我正在努力解决的代码(自然有点混乱)是这样的:

private MyType DoSomething(IDataRecord reader)
{
    var p = new MyType
                {
                   Id = (int)reader[idIndex],
                   Name = (string)reader[nameIndex]
                }

    switch ((string) reader[discountTypeIndex])
    {
        case "A":
            p.DiscountType = DiscountType.Discountable;
            break;
        case "B":
            p.DiscountType = DiscountType.Loss;
            break;
        case "O":
            p.DiscountType = DiscountType.Other;
            break;
    }

    return p;
}

谁能建议一种方法来消除这个开关?或者这是开关的适当使用吗?如果是的话,switch 语句还有其他合适的用途吗?我真的很想知道它们在哪里合适,这样我就不会浪费太多时间试图消除我遇到的每个 switch 语句,因为它们在某些情况下被认为是一种气味。

Update:在建议下Michael https://stackoverflow.com/questions/1071856/when-should-one-try-to-eliminate-a-switch-statement/1071879#1071879我做了一些搜索这个逻辑的重复,发现有人在另一个类中创建了逻辑,这实际上使整个 switch 语句变得冗余。因此,在这段特定代码的上下文中,switch 语句是不必要的。然而,我的问题更多是关于代码中 switch 语句的适当性,以及我们是否应该在发现它们时始终尝试替换它们,因此在这种情况下,我倾向于接受此 switch 语句是适当的答案。


这是 switch 语句的适当用途,因为它使选项可读,并且易于添加或减去选项。

请参阅此链接。 https://stackoverflow.com/questions/449273/why-the-switch-statement-and-not-if-else

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么时候应该尝试消除 switch 语句? [复制] 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 如何将多个 SHA1 指纹添加到我的 Android 应用程序中进行测试?

    我的 Android 应用程序已经在 Google 开发者控制台上有另一个开发者不久前生成的 SHA1 指纹 现在 我正在应用程序中调试 Google 登录错误 结果发现 Google 登录使用在中找到的默认 SHA 1 android d
  • iTunesConnect - 自动下载应用程序的使用情况分析

    iTunes 连接 https itunesconnect apple com的应用程序分析页面有两个部分 销售和使用情况 对于第一部分 他们有自动摄取工具 https www apple com itunesnews docs AppSt
  • 在 Swift 3 中使用 -observeValueForKeyPath:ofObject:change:context:

    我正在尝试将 Swift 2 2 项目转换为 Swift 3 但收到以下错误 Method observeValue forKeyPath ofObject change context with Objective C selector
  • 将人类友好的日期转换为毫秒[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何将人类友好的日期转换为自 UNI
  • 如何在 Linux 中获取“文件创建时间”

    我需要找出在 Linux 中使用 C 创建文件的时间和日期 如何获取文件的最后修改日期 http www jb man ac uk slowe cpp lastmod html struct stat attrib 1 create a f
  • 在特定时间过后自动更改 WooCommerce 订单状态?

    有没有办法让 WooCommerce 在经过这么长时间后自动将自定义订单状态更改为不同的自定义订单状态 基本上 我希望所有订单状态更改为 退款已提交 的订单在 30 天后自动更改为 退款已过期 我意识到这些不是正常的 WooCommerce
  • Google OAuth 访问令牌

    我对 OAuth 和 Google 感到很困惑 我花了很长时间才获得刷新令牌来创建新的访问令牌 然后发现refresh token也过期了 这有什么意义啊 我需要做的就是保留一个有效的 access token 以供使用legato htt
  • 如何在 WebView 中加载 HTML 页面时显示进度对话框

    我正在使用 Web 视图来显示 html 页面 并且我想在页面加载之前显示一个进度对话框 完成后 对话框必须消失 我为此使用了 AsyncTask 但对话框不显示 请参阅下面的我的代码 class DownloadAysnc extends
  • 异步调用完成后渲染 React 函数组件的一部分

    我将 Material ui 与 React 函数组件一起使用 并使用其自动完成组件 我自定义了它 每当我更改输入字段中的文本时 我希望该组件呈现新的搜索结果 callAPI xyz 我在操作中调用 API 并使用 xyz 参数 从该函数组
  • 不同的构建操作在 csproj 中有何作用? IE。附加文件或假货

    不同的构建操作在 Web API 项目中起什么作用 也可能适用于其他类型 我看到 无 编译 内容 嵌入式资源 AdditionalFiles CodeAnalysisDictionary ApplicationDefinition 页面 资
  • Windows 10 上的 npx 和 nvm 导致需要安装以下软件包

    我已经安装了用于 Windows 的 nvm https github com coreybutler nvm windows和 nvm 列表显示 17 2 0 16 13 1 Currently using 64 bit executab
  • 如何在 SwiftUI 中使用 DatePicker 创建提醒

    我要显示DatePicker在警报视图或操作表视图中 但我找不到任何资源来执行此操作 我想要以下视图 谢谢您的帮助 你想要的实际上是被苹果劝阻的 根据这个答案 https stackoverflow com a 26342100 86977
  • 图标不是 3.00 格式

    在 Visual Studio 2008 中构建 C 应用程序时 我收到以下错误 iconfile ico 不是 3 00 格式 我使用 Paint 创建了图标文件 并将其保存为 ico 文件 我尝试将其保存为 16 位 24 位和 256
  • 仅匹配括号内字符的模式

    我在这里查看了很多关于 SO 的帖子 其中包含有关 REGEX 模式的建议 以从括号中获取文本 但是 根据我的研究 我找不到有效的解决方案 例如 我查看了以下内容 R 正则表达式提取包含关键字的括号之间的文本 https stackover
  • PHP性能考虑?

    我正在建造一个PHP网站 但目前唯一PHP我在某些页面上使用的是六个左右的包含内容 我最终可能会使用一些数据库查询 很简单include 声明关注速度或扩展 而不是静态HTML 什么样的事情容易导致网站陷入困境 当然 include 比静态
  • Activity 方法:onCreate() 和 onDestroy()

    当第一次创建活动时 系统会调用OnContentChanged 方法作为系统的第一个方法和最后一个调用是OnDetachedFromWindow 方法当一个 Activity 被杀死时 但 android 文档说 Activity 的整个生
  • 如何使用PageDown Markdown编辑器?

    我想为用户提供实时预览使用 Markdown 创建的笔记的能力 但是我在该项目中找不到任何下载 我怎样才能开始使用PageDown 降价 https github com balpha pagedown编辑 PageDown 的文档非常混乱
  • 使用 pyExcelerator/xlrd 进行数据透视

    如何使用 pyExcelerator xlrd 等 Python 库创建带有数据透视表的工作表 在 Excel 工作簿中 我需要生成一份每日报告 其中有一个数据透视表来汇总其他工作表上的数据 一种选择是使用一个空白模板 我可以复制该模板并用
  • TFS 分支和合并策略

    我在 TFS 中有一个团队项目 每天都会提交任务 我想独立完成每个任务 然后在测试后将其合并到主线中 目前有一个 MAIN 分支和一个 DEV 分支 它是 MAIN 的子分支 更改在 DEV 分支中进行 然后在准备就绪时合并到 MAIN 中
  • 什么时候应该尝试消除 switch 语句? [复制]

    这个问题在这里已经有答案了 我在我正在处理的代码库中遇到了一个 switch 语句 我正在尝试找出如何用更好的东西替换它switch 语句被认为是代码味道 http c2 com cgi wiki SwitchStatementsSmell