摆脱为每种可能的条件编写 if/else if 的习惯

2024-01-08

当解析 xml 文档的节点或属性时,如果文档很大,我会有一堆 if 和 else 语句。

显然,从长远来看,100+ ifs 并不能构成可维护的代码。

除了这样做之外,还有其他更好的方法吗?我在 Hanselman 的博客上读到,他的一位朋友也有同样的情况,并且编写了大量 ifs/else if 以及通常很差的代码。汉塞尔曼提供了一些更易于维护的方式的片段,但整个代码不可用,因此很难准确理解(整个情况)正在发生的事情。if、else之后的生活 http://www.hanselman.com/blog/BackToBasicsLifeAfterIfForAndSwitchLikeADataStructuresReminder.aspx

我正在使用 .NET 3.5,因此我可以使用扩展方法和 LINQ 的全部功能。然而,我使用 .NET 2.0 工作,所以也很感激 v2.0 中的任何解决方案。 :)

我的代码看起来与 Hanselman 网站上的问题非常相似:

if (xmlNode.Attributes["a"].Value == "abc" {

}
else if (xmlNode.Attributes["b"].Value == "xyz"
{
wt = MyEnum.Haze;
}

我可以有一个字典,将我正在寻找的值存储为键,也许还有值中的委托(或者我希望在查找所需值时发生的任何事情),所以我可以说 if (containskey) 获取委托并执行它,在伪代码中。

这样的事情一直持续着。显然是非常幼稚的编码方式。我在解析文本文档中的值等时遇到同样的问题。

Thanks


如果您需要地图<condition on xml node> to <change of state> 没有办法避免定义该映射某处。这完全取决于您可以对条件做出多少假设以及在这些条件下您会做什么。我认为字典的想法很好。为了提供尽可能多的灵活性,我会这样开始:

Dictionary<Predicate<XmlNode>, Action> mappings;

然后开始尽可能地简化。例如,您是否经常像示例中那样将 wt 设置为 MyEnum 的值?如果是这样,你想要这样的东西:

Func<MyEnum, Action> setWt = val => 
    () => wt = val;

对于可能常见的情况,您只需检查属性是否具有特定值,您也需要一些便利:

Func<string, string, Predicate<XmlNode>> checkAttr = (attr, val) => 
    node => node.Attributes[attr] == val;

现在您的字典可以包含以下项目:

 ...
 {checkAttr("a", "abc"), setWt(MyEnum.Haze)},
 ...

这很好又简洁,但也不限于简单<attribute, value> to <enum> 映射。好的,现在你有了这些条件-动作对的大字典,你只需说:

foreach(DictionaryEntry<Predicate<XmlNode>, Action> mapping in mappings)
{
     if (mapping.Key(xmlNode))
     {
         mapping.Value();
         break;
      }
}

如果您避免使用 lambda 语法和字典初始值设定项,您应该能够在 2.0 中做到这一点。

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

摆脱为每种可能的条件编写 if/else if 的习惯 的相关文章

  • Exit() 时是否调用基本对象析构函数?

    我意识到这个问题已经出现过几次 但我试图获得上述问题的明确答案 但我不断遇到相互矛盾的信息 我需要知道的是 当我使用 exit 时 基本类对象是否被破坏 我知道需要删除动态内存 但我的意思更像是 include
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

    In 本教程 https emscripten org docs porting connecting cpp and javascript Interacting with code html interacting with code
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • 模板类的模板构造函数的 C++ 显式模板特化

    我有一个像这样的课程 template
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我

随机推荐

  • 不受信任的 GPGPU 代码(OpenCL 等)- 安全吗?有什么风险?

    在典型的 CPU 上运行不受信任的代码有很多方法 沙箱 假根 虚拟化 GPGPU 不受信任的代码 OpenCL cuda 或已编译的代码 怎么样 假设在运行此类第三方不受信任代码之前清除了显卡上的内存 是否存在安全隐患 什么样的风险 Any
  • Mac OS X 是否带有 Emacs 内置的 Lisp 环境?

    我一直在尝试寻找一个不需要在我的 mac 上为 Lisp 安装任何其他东西的环境 因为我完成作业后就不会使用它了 谁知道我是否继续使用它 我试图寻找但我找不到任何东西 有人知道它是否有它 以及如何在 Emacs 中使用它吗 对于一键式 Li
  • 实施微软同步框架[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在寻找有关 Microsoft
  • Angular js - 返回包含 HTML 字符的字符串,例如

    我创建了一个过滤器 只是为了在另一个给定值不为空的情况下在值后添加反斜杠 并且我想将此反斜杠与字符串的其余部分分开 nbsp 实际上 过滤器本身可以工作 但可以将字符串 调整为页面中的样子 angular module ngMod filt
  • Java一直提示找不到jdbc mysql驱动

    这里还有一个关于jdbc的mysql驱动的问题 考虑到我在谷歌搜索时得到的搜索结果的数量 我很遗憾在其中没有发现任何对我有用的结果 错误 hostname java cp usr share java mysql connector jar
  • 使用 select 插入多行

    我正在尝试将 2 行插入同一个表中 第一个将从选择中输入数据 第二个将使用变量作为数据 我可以插入第一行 但插入多行时遇到问题 partner id 用于将行相互链接 为此 我使用 php 中生成的 32char 值 无论如何 是否可以使用
  • 并行减少(例如求和) hpx::futures 向量

    我们目前正在尝试实现用于数值模拟的红黑高斯 赛德尔求解器 为此 我们将模拟区域划分为大小相等的子网格 我们能够在每个子网格上异步执行压力方程的红黑循环 并具有正确的依赖性和hpx dataflow目的 但现在我们有以下问题 每第 n 个循环
  • 如何停止 Firestore 对 componentWillUnmount 的“get”查询

    好的 我正在从 Firestore 中的 componentDidMount 中获取数据 但是在获取数据时 如果我更改组件 则会收到错误消息 警告 无法在未安装的状态下调用 setState 或forceUpdate 成分 这是一个空操作
  • 如何在 Kotlin 中使用另一个类的变量?

    我只是有一个 希望如此 简单的问题 如何在一个类中创建一个变量可以被 Kotlin 中的另一个类访问 A类 var isBlue 1 Class B if isBlue 1 then class A class A var isBlue 1
  • 升级从自己的网络服务器下载的 apk

    我需要升级 apk 文件的帮助 我有为 android 2 2 开发的 apk 文件 但我不想在 android 市场上发布我的 apk 我在我们自己的网络服务器中发布了 apk 我可以将它下载到我的 Android 手机上 现在的问题是我
  • JSONDecodeError:期望值:第 1 行第 1 列

    我在 Python 3 5 1 中收到此错误 json decoder JSONDecodeError 期望值 第1行第1列 字符0 这是我的代码 import json import urllib request connection u
  • 为什么 List.toArray() 返回一个 Object 数组? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 List toArray 返回 Object 而不是 String 如何解决这个问题 https stackoverflow com questions 7909747 why does li
  • ActiveX控件转图片(Excel/VBA)

    我的公司为包含 ActiveX 控件的客户创建工作簿 在大多数情况下 与表单控件相比 我们需要额外的功能 当我们创建它们时 它们在我们这边工作得很好 但是当我们将它们压缩并将它们发送给我们的客户时 他们打开WB并且ActiveX控件不再是A
  • JavaScript 数组 - 过滤掉与特定字符串不匹配的值

    我正在尝试循环遍历数组并过滤掉所有项目do not匹配特定值 例如我有这个数组 const emails email protected cdn cgi l email protection email protected cdn cgi
  • 使用 CMAKE 生成 makefile 后未定义的引用

    我可以生成我的 CMake 项目 但无法构建它 我有一个相当简单的项目结构 bin build
  • 如何使用反应式表单验证禁用的控件(不触发验证)

    假设我有这样的表单结构 this entryForm this formBuilder group date value disabled true Validators required notes sum credit value di
  • 如何在R中访问子文件夹中的指定文件而不更改工作目录?

    在 R 中 我想访问子文件夹中的某个文件 但我不想更改工作目录然后移回 它失去了时间和漫长 例如 我正在从事 home phuong文件夹 这是 phuong 的树结构 phuong gt data1 data2 data3 data1 g
  • 使用 IntelliJ IDEA 在项目构建中自动运行 Gradle 任务

    我有一个使用 JPA2 元模型生成的 IntelliJ IDEA Gradle 项目JpaModelgen Gradle 插件 https github com iboyko gradle plugins tree master jpamo
  • .on() 函数调用之间的区别

    以下有什么区别 document on scroll wrapper1 function wrapper2 scrollLeft wrapper1 scrollLeft wrapper1 on scroll function wrapper
  • 摆脱为每种可能的条件编写 if/else if 的习惯

    当解析 xml 文档的节点或属性时 如果文档很大 我会有一堆 if 和 else 语句 显然 从长远来看 100 ifs 并不能构成可维护的代码 除了这样做之外 还有其他更好的方法吗 我在 Hanselman 的博客上读到 他的一位朋友也有