是否有任何工具可以帮助处理复杂的“如果”逻辑?

Posted

技术标签:

【中文标题】是否有任何工具可以帮助处理复杂的“如果”逻辑?【英文标题】:Are there any tools to aid with complex 'if' logic? 【发布时间】:2010-10-12 04:27:00 【问题描述】:

我个人的一个编程恶魔一直是需要由 if 语句(或类似语句)控制的复杂逻辑。也不一定总是那么复杂,有时只需要考虑几个状态。

开发人员是否可以在设计期间执行任何工具或步骤来帮助查看“状态”并采取措施重构代码以简化生成的代码?我正在考虑按照这些思路绘制一个矩阵或其他东西......?

【问题讨论】:

【参考方案1】:

我会为每个有抱负的程序员推荐propositional logic 的基础课程。起初,符号和希腊字母可能会让厌恶数学的人感到反感,但它确实是你技能中最强大(也经常被忽视)的工具之一,而且核心相当简单。

basic operators、de Morgan's 和 other basic laws、truth tables 以及例如存在disjunctive 和 conjunctive normal forms 让我大开眼界。在我了解它们之前,条件表达式感觉就像是危险的野兽。从那以后,我知道我可以在必要时用重炮将他们鞭打!

【讨论】:

【参考方案2】:

真值表基本上是详尽无遗的方法,并将(希望)突出所有可能性。

您可能想看看Microsoft Pex,它有助于发现您没有想到的边缘案例。

【讨论】:

【参考方案3】:

我认为开发人员在问如何在处理复杂的 if 代码时让他的生活更轻松。

我处理复杂代码的方式是尽可能地编写代码并首先清除所有否定。如果你可以通过将一部分放在上面来去除化合物,那么就这样做。

简单的美妙之处在于它不需要一本书或一堂课就能学会。如果你能打破它,就这样做。如果您可以删除它的任何部分,请执行此操作。如果你不明白,那就换个方式。而且 flat 几乎总是比嵌套更好(感谢 python!)。

阅读起来更简单:

if(broken)
  return false;

if (simple)
  doit();
  return true;

if(complicated)
  divide();
  conquor();

if(extra)
  extra();

比阅读:

if(!broken && (simple || complicated))
 ....

return false;

【讨论】:

【参考方案4】:

真值表和单元测试 - 绘制表格(n 维,n 个变量),然后将它们用作单元测试的输入,单元测试可以测试每个变量组合并验证结果。

【讨论】:

真值表总是二维的(除非有新的发展?)。您的意思是 n 列对应 n 个变量吗? 多维真值表?听起来令人兴奋! 呃...真值表包含所有变量的列和所有值组合的行。您可以表示任意数量的变量。 多变量真值表可以归类为多维(每个变量都有一个新轴)。然而,由于我们笨拙的大脑被限制在 3 个维度,我们倾向于将它们折叠起来。我们也倾向于在平坦的表面上进行,所以再次将它们折叠成二维表 :) @Bill - 您可以拥有任意数量的维度 - 例如,如果我想提出一个基于 3 个变量的布尔值,我将有一个 2x2x2 表,代表 8 个离散的输入组合...【参考方案5】:

多年来我看到的复杂 IF 的最大问题是人们不会测试所有分支。确保为每个可能的分支编写一个测试,无论您看起来多么不可能都成功。

【讨论】:

【参考方案6】:

您可能还想尝试Karnaugh maps,它适用于最多 4 个变量。

【讨论】:

卡诺图很适合这个。太糟糕了,我恨他们的热情。他们让我相信我永远不想成为一名计算机工程师。 :-)【参考方案7】:

如果您还没有,我强烈建议您阅读Code Complete。它对诸如此类的主题有很多建议。我现在手头没有我的副本,否则我会在书中发布这部分的摘要。

【讨论】:

【参考方案8】:

将逻辑分解为离散单元(a && b 等),每个单元都有自己的变量。然后使用您需要的逻辑构建这些。使用适当的名称为每个变量命名,以便您的复杂语句具有相当的可读性(尽管它可能会占用几行额外的行和相当多的临时变量)。

【讨论】:

好的,这几乎是我采用的方法,问题是我发现自己在填充新分支时,当我确定需要它们并且找不到现有分支时。这显然会导致意大利面条代码......我需要一种方法来解决这个问题并“看到更大的画面”【参考方案9】:

你有什么理由不能只用警戒语句处理逻辑?

【讨论】:

【参考方案10】:

Karnaugh maps 是从真值表(Visage 建议)中获取信息并将其转换为紧凑和/或/非表达式的好方法。这些通常在 EE 数字逻辑课程中教授。

【讨论】:

【参考方案11】:

您尝试过设计模式吗?您可以研究一下所谓的策略模式:http://en.wikipedia.org/wiki/Strategy_pattern

【讨论】:

【参考方案12】:

查看核选项:Drools。它有很多内容——我花了一两天时间阅读文献来了解它的功能。但是,如果您的应用程序中复杂的 if-then 逻辑是项目不断发展的一部分(例如,具有模块化算法的应用程序),那可能就是这样。

【讨论】:

以上是关于是否有任何工具可以帮助处理复杂的“如果”逻辑?的主要内容,如果未能解决你的问题,请参考以下文章

Vue组件

Vue组件

流程图总结

什么是组件化

数据中心的六个自动化障碍——逻辑思维软件

7.逻辑回归实践