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

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

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

【问题讨论】:

    标签: logic


    【解决方案1】:

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

    basic operatorsde Morgan'sother basic lawstruth tables 以及例如存在disjunctiveconjunctive 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 逻辑是项目不断发展的一部分(例如,具有模块化算法的应用程序),那可能就是这样。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-04-06
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多