我的一个个人编程恶魔一直是复杂的逻辑,需要由if语句(或类似的)控制。并不总是那么复杂,有时只需要考虑几个状态。
开发人员在设计期间是否可以执行任何工具或步骤来帮助查看“状态”并采取措施重构代码以简化生成的代码?我正在考虑制作一个矩阵或类似的东西......?
答案 0 :(得分:17)
我建议每个有抱负的程序员使用propositional logic的基础课程。起初,符号和希腊字母似乎对数学规则不利,但它实际上是你技能组中最强大(而且经常被忽略)的工具之一,而且很简单,核心。
basic operators,de Morgan's和other basic laws,truth tables以及例如disjunctive和conjunctive normal forms令我大开眼界。在我了解它们之前,条件表达式感觉像是危险的野兽。从那时起,我知道我可以在必要时通过打破重炮来鞭打他们!
答案 1 :(得分:5)
真理表基本上是详尽的方法,并且(希望)突出了所有可能性。
您可以查看Microsoft Pex,这有助于发现您没有想到的边缘情况。
答案 2 :(得分:4)
我认为开发人员在处理复杂的代码时会问如何让他的生活更轻松。
我处理复杂的方式,如果代码是尽可能平坦的代码,并首先清除所有的否定。如果你把它的一部分放在上面就可以去除化合物,那就去做吧。
简洁之美是它不需要书本或课堂来学习它。如果你可以分手,那就去做吧。如果您可以删除它的任何部分,请执行此操作。如果你不理解它,那就不同了。而flat几乎总是比嵌套更好(感谢python!)。
阅读起来比较简单:
if(broken){
return false;
}
if (simple){
doit();
return true;
}
if(complicated){
divide();
conquor();
}
if(extra){
extra();
}
比阅读:
if(!broken && (simple || complicated)){
....
}
return false;
答案 3 :(得分:3)
真值表和单元测试 - 绘制表(n个变量的n维),然后将它们用作单元测试的输入,可以测试每个变量组合并验证结果。
答案 4 :(得分:2)
我多年来看到的复杂IF的最大问题是人们不会测试所有分支机构。确保为每个可能的分支编写一个测试,无论你看起来多么不可能。
答案 5 :(得分:2)
您可能还想尝试Karnaugh maps,最多可以使用4个变量。
答案 6 :(得分:1)
如果您还没有,我强烈建议您阅读Code Complete。它对此类主题提出了很多建议。我目前没有方便的副本,否则我会在书中发布这一部分的摘要。
答案 7 :(得分:0)
将逻辑拆分为离散单位(a&& b等),每个单位都有自己的变量。然后使用您需要的逻辑构建它们。使用适当的名称为每个变量命名,以便您的复杂语句具有相当的可读性(尽管它可能会占用额外的几行和一些临时变量)。
答案 8 :(得分:0)
你有什么理由不能用守护语句处理逻辑吗?
答案 9 :(得分:0)
Karnaugh maps可以很好地从真值表中获取信息(由Visage建议)并将它们转换为紧凑和/或/不表达式。这些通常在EE数字逻辑课程中讲授。
答案 10 :(得分:0)
你尝试过设计模式吗?您可以查看所谓的策略模式:http://en.wikipedia.org/wiki/Strategy_pattern
答案 11 :(得分:0)
查看核选项:Drools。它有很多东西 - 花了我一两天时间阅读文献只是为了掌握它的能力。但是,如果您的应用程序中复杂的if-then逻辑是项目的一个不断发展的部分(例如,具有模块化算法的应用程序),则可能就是这样。