10

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

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

4

12 回答 12

17

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

基本运算符、德摩其他基本定律真值表以及例如析取和合取范式的存在让我大开眼界。在我了解它们之前,条件表达式感觉就像是危险的野兽。从那以后,我知道我可以在必要时用重炮将他们鞭打!

于 2009-03-09T13:16:49.627 回答
5

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

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

于 2009-03-09T13:17:45.363 回答
4

我认为开发人员在问如何在处理复杂的 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;
于 2011-10-21T00:11:34.307 回答
3

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

于 2009-03-09T13:03:00.877 回答
2

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

于 2009-03-09T13:21:57.193 回答
2

您可能还想尝试卡诺图,它适用于最多 4 个变量。

于 2009-03-09T13:36:46.783 回答
1

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

于 2009-03-09T13:40:47.837 回答
0

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

于 2009-03-09T13:12:17.983 回答
0

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

于 2009-03-09T13:24:28.983 回答
0

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

于 2009-03-09T13:37:11.980 回答
0

你试过设计模式吗?您可能会查看所谓的策略模式:http ://en.wikipedia.org/wiki/Strategy_pattern

于 2010-03-05T15:09:27.877 回答
0

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

于 2012-05-11T12:32:47.227 回答