【发布时间】:2010-10-12 04:27:00
【问题描述】:
我个人的一个编程恶魔一直是需要由 if 语句(或类似语句)控制的复杂逻辑。也不一定总是那么复杂,有时只需要考虑几个状态。
开发人员是否可以在设计期间执行任何工具或步骤来帮助查看“状态”并采取措施重构代码以简化生成的代码?我正在考虑按照这些思路绘制一个矩阵或其他东西......?
【问题讨论】:
标签: logic
我个人的一个编程恶魔一直是需要由 if 语句(或类似语句)控制的复杂逻辑。也不一定总是那么复杂,有时只需要考虑几个状态。
开发人员是否可以在设计期间执行任何工具或步骤来帮助查看“状态”并采取措施重构代码以简化生成的代码?我正在考虑按照这些思路绘制一个矩阵或其他东西......?
【问题讨论】:
标签: logic
我会为每个有抱负的程序员推荐propositional logic 的基础课程。起初,符号和希腊字母可能会让厌恶数学的人感到反感,但它确实是你技能中最强大(也经常被忽视)的工具之一,而且核心相当简单。
basic operators、de Morgan's 和 other basic laws、truth tables 以及例如存在disjunctive 和 conjunctive normal forms 让我大开眼界。在我了解它们之前,条件表达式感觉就像是危险的野兽。从那以后,我知道我可以在必要时用重炮将他们鞭打!
【讨论】:
真值表基本上是详尽无遗的方法,并将(希望)突出所有可能性。
您可能想看看Microsoft Pex,它有助于发现您没有想到的边缘案例。
【讨论】:
我认为开发人员在问如何在处理复杂的 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;
【讨论】:
真值表和单元测试 - 绘制表格(n 维,n 个变量),然后将它们用作单元测试的输入,单元测试可以测试每个变量组合并验证结果。
【讨论】:
多年来我看到的复杂 IF 的最大问题是人们不会测试所有分支。确保为每个可能的分支编写一个测试,无论您看起来多么不可能都成功。
【讨论】:
您可能还想尝试Karnaugh maps,它适用于最多 4 个变量。
【讨论】:
如果您还没有,我强烈建议您阅读Code Complete。它对诸如此类的主题有很多建议。我现在手头没有我的副本,否则我会在书中发布这部分的摘要。
【讨论】:
将逻辑分解为离散单元(a && b 等),每个单元都有自己的变量。然后使用您需要的逻辑构建这些。使用适当的名称为每个变量命名,以便您的复杂语句具有相当的可读性(尽管它可能会占用几行额外的行和相当多的临时变量)。
【讨论】:
你有什么理由不能只用警戒语句处理逻辑?
【讨论】:
Karnaugh maps 是从真值表(Visage 建议)中获取信息并将其转换为紧凑和/或/非表达式的好方法。这些通常在 EE 数字逻辑课程中教授。
【讨论】:
您尝试过设计模式吗?您可以研究一下所谓的策略模式:http://en.wikipedia.org/wiki/Strategy_pattern
【讨论】:
查看核选项:Drools。它有很多内容——我花了一两天时间阅读文献来了解它的功能。但是,如果您的应用程序中复杂的 if-then 逻辑是项目不断发展的一部分(例如,具有模块化算法的应用程序),那可能就是这样。
【讨论】: