- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我继承了一个怪物。
它伪装成 .NET 1.1 应用程序处理符合医疗保健 claim 支付 (ANSI 835) 标准的文本文件,但它是一个怪物。正在处理的信息涉及医疗保健 claim 、EOB 和报销。这些文件由在前几个位置具有标识符的记录和根据该类型记录的规范格式化的数据字段组成。一些记录 ID 是控制段 ID,用于分隔与特定类型事务相关的记录组。
为了处理一个文件,我的小怪物读取第一条记录,确定即将发生的事务类型,然后根据当前正在处理的事务类型开始处理其他记录。为此,它使用嵌套的 if。由于有许多记录类型,因此需要做出许多决定。每个决策都涉及一些处理和 2-3 个其他决策,需要根据之前的决策做出。这意味着嵌套的 if 有很多嵌套。这就是我的问题所在。
这个嵌套的 if 有 715 行长。是的,这是正确的。七百五十条线。我不是代码分析专家,所以我下载了几个免费软件分析工具,得出的 McCabe 循环复杂度等级为 49。他们告诉我这是一个相当高的数字。与亚特兰大地区的花粉计数一样高,其中 100 是高标准,新闻称“今天的花粉计数为 1,523”。这是我有幸看到的箭头反模式最好的例子之一。在其最高处,缩进深度为 15 个制表符。
我的问题是,你会建议用什么方法来重构或重组这样的东西?
我花了一些时间寻找想法,但没有什么能让我站稳脚跟。例如,用保护条件代替级别是一种方法。我只有其中一个。一窝下来,十四走。
也许有一种设计模式可能会有所帮助。指挥链会是解决这个问题的一种方式吗?请记住,它必须保留在 .NET 1.1 中。
感谢您的任何想法。
最佳答案
本周我刚刚有一些遗留代码在工作,与您所描述的相似(尽管没有那么可怕)。
没有一件事能让你摆脱困境。 state machine可能是您的代码采用的最终形式,但这不会帮助您到达那里,您也不应该在解开已有的困惑之前决定这样的解决方案。
我要采取的第一步是为现有代码编写一个测试。这个测试不是为了证明代码是正确的,而是为了确保你在开始重构时没有破坏一些东西。获取大量数据进行处理,将其提供给怪物,然后获得输出。那是你的试金石。如果您可以使用代码覆盖率工具执行此操作,您将看到您的测试未涵盖的内容。如果可以,构建一些人工记录,这些记录也将执行此代码,然后重复。一旦你觉得你已经完成了这项任务,输出数据将成为你测试的预期结果。
重构不应改变代码的行为。记住这一点。这就是为什么您知道输入和输出数据集来验证您不会破坏事情的原因。这是你的安全网。
现在重构!
我做了几件我觉得有用的事情:
反转if
声明
当我找不到相应的 else
时,我遇到的一个大问题是刚刚阅读代码声明,我注意到很多 block 看起来像这样
if (someCondition)
{
100+ lines of code
{
...
}
}
else
{
simple statement here
}
if
我可以看到一个简单的案例,然后知道另一个已经做了什么,然后进入更复杂的模块。变化不大,但帮助我理解。
关于if-statement - 需要重构 Arrow 反模式的想法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/105602/
我尝试使用 graphviz 包中的 dot 为 MPLUS 分析创建图表。有没有人有使用 dot 来可视化结构方程模型/潜在类混合模型的经验?特别是有一个功能我无法弄清楚如何漂亮地做: 我需要从节点
我有一个文本框,在它下面有一个列表框。 当用户在文本框中输入时,如果他按下向上或向下箭头,他应该在列表框中进行选择。文本框检测到所有字符(空格除外),但似乎无法检测到箭头按下。 有什么解决办法吗?顺便
我有一个大数据集并试图绘制 PCA。我对最终的情节相当满意,但我想改变一些事情: 箭头:它们似乎在背景中并被数据点覆盖。1)我怎样才能把它们放在前面?2)如何更改颜色和喜欢的大小? 省略号:3) 如何
我需要做的是找到一个向上箭头字符并将其替换为向上箭头形状,并对向下箭头执行相同的操作。我是 VBA 的新手,但对我希望宏如何工作有一个想法。它应该循环遍历 powerpoint 上的所有幻灯片。 1)
我需要做的是找到一个向上箭头字符并将其替换为向上箭头形状,并对向下箭头执行相同的操作。我是 VBA 的新手,但对我希望宏如何工作有一个想法。它应该循环遍历 powerpoint 上的所有幻灯片。 1)
很抱歉提出这样一个基本问题,但我需要知道当我将鼠标悬停在 #leaderboard 上时如何向两个 div 添加类,#left-arrow 和 #right-arrow。 我知道我可以使用调用悬停()
这样的代码会产生一个错误: if(hr>t1[0]||(hr==t1[0]&&min=>t1[1]) && hr=而不是=引起的。但我仍然很好奇为什么错误是这样表述的,以及箭头函数应该是什么。 编辑
我有一个针对 Apache Arrow C++ 库构建的 C++ 库,使用 Pybind 绑定(bind)到 python。我希望能够用 C++ 编写一个函数来获取用 PyArrow 构造的表,例如:
介绍 Arrow是一个Python库,它提供了一种合理且对人类友好的方法来创建、操作、格式化和转换日期、时间和时间戳。它实现了对datetime类型的更新,填补了功能上的空白,提供了一个智能的模块A
非常基本的问题: 我如何知道端口/信号/值应该放在箭头的哪一侧?我注意到通过切换 port_a => x至x port_a不工作 我什至不知道箭头应该指向哪个方向。 非常感谢您的回答! 最佳答案 是
由于输入无效,箭头会引发ParserError: >>> arrow.get('abc') ParserError: Could not match input to any of [u'YYYY-M
IE9 有这个可笑的蓝色箭头,只要浏览器窗口有选择,它就会呈现: 无论是用户做出选择还是通过 JavaScript 以编程方式进行选择(如我的情况),都会发生这种情况。是否有可能不显示此蓝色箭头? 最
如何让 Arrow 返回两个时间戳之间的小时差? 这是我所拥有的: difference = arrow.now() - arrow.get(p.create_time()) print(differ
我正在使用 Raphaël 库来创建一个快速绘图工具。 但是箭头末端有一个错误,它们为所有行分配了相同的值。 说,我有一个带有#raphael-marker-oval 箭头的 lineA。然后,我绘制
sequenceA是一个众所周知的函数: sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a) 我想知道我们是否可以为 A
如果要使用箭头/箭头功能之一绘制箭头而不是轴线,如何显示线/箭头?下面的例子: import matplotlib.pyplot as plt import matplotlib.patches as
我最近一直在使用 kotlin arrow,但遇到了一个让我陷入困境的特定用例。 假设我有一些对象的集合,我想使用转换函数将其转换为另一种数据类型。假设这个 convert 函数有失败的能力——但它不
我继承了一个怪物。 它伪装成 .NET 1.1 应用程序处理符合医疗保健 claim 支付 (ANSI 835) 标准的文本文件,但它是一个怪物。正在处理的信息涉及医疗保健 claim 、EOB 和报
我有一个庞大的数据集,正在使用 Apache Spark 进行数据处理。 使用 Apache Arrow,我们可以将兼容 Spark 的数据帧转换为兼容 Pandas 的数据帧并在其上运行操作。
我在哪里可以找到隐藏在语言 pragma 后面的源代码 {-# LANGUAGE Arrows #-} 我已经阅读了相关的论文(如 Paterson, A New Notation for Arrow
我是一名优秀的程序员,十分优秀!