在代码清晰度方面,是否有更好的方法来编写具有大量AND检查的条件而不是大的IF语句?
例如,如果其他字段不符合某些要求,我当前需要在屏幕上设置字段。目前我有一个IF语句,运行超过30个LOC,这似乎不对。
if(!(field1 == field2 &&
field3 == field4 &&
field5 == field6 &&
.
.
.
field100 == field101))
{
// Perform operations
}
解决方案是简单地将这些分解为更小的块并将结果分配给更少数量的布尔变量吗?使代码更具可读性的最佳方法是什么?
由于
答案 0 :(得分:9)
我会考虑以谓词形式建立规则:
bool FieldIsValid() { // condition }
bool SomethingElseHappened() { // condition }
// etc
然后,我会创建一个这些谓词的列表:
IList<Func<bool>> validConditions = new List<Func<bool>> {
FieldIsValid,
SomethingElseHappend,
// etc
};
最后,我会写出提出条件的条件:
if(validConditions.All(c => c())
{
// Perform operations
}
答案 1 :(得分:2)
正确的方法将根据您未提供的详细信息而有所不同。如果可以通过某种索引(数字计数器,字段标识符列表等)选择要比较的项目,那么最好这样做。例如,像:
Ok = True For Each fld as KeyValuePair(Of Control, String) in CheckFields If fld.FormField.Text fld.RequiredValue Then OK = False Exit For End If Next
构建控件和字符串列表可能会有些麻烦,但有合理的方法可以做到。
答案 2 :(得分:1)
就我个人而言,我觉得将其分成几块只会使整体陈述不那么明确。这将使代码更长,而不是更简洁。
我可能会将此检查重构为类中的方法,因此您可以根据需要重用它,并在一个地方进行测试。但是,我很可能会把支票写成你所写的 - 一个if语句有很多条件,每行一个。
答案 3 :(得分:1)
您可以将条件重构为单独的函数,并使用De Morgan's Laws来略微简化逻辑。
此外 - 你的变量真的都被称为fieldN
?
答案 4 :(得分:1)
我改变易读性的第一件事是通过反转语句(使用De Morgan's Laws)来消除几乎隐藏的否定:
if ( field1 != field2 || field3 != field4 .... etc )
{
// Perform operations
}
虽然使用了一系列&amp;&amp;而不是||确实有一些轻微的性能提升,我觉得原始代码缺乏可读性值得改变。
如果性能是一个问题,你可以将语句分成一系列if语句,但到那时它会变得一团糟!
答案 5 :(得分:1)
部分问题在于您正在混合元数据和逻辑。
需要哪些问题(/必须等于/最小长度/等)是元数据。
验证每个字段是否满足它的要求是程序逻辑。
需求列表(以及适用的字段)应该全部存储在其他地方,而不是存储在大型if语句中。
然后您的验证逻辑会读取列表,循环遍历它,并保持运行总计。如果ANY字段失败,则需要提醒用户。
答案 6 :(得分:1)
开始使用C#的工作流引擎可能很有用。它专门用于帮助图形化地布置这些复杂的决策算法。
答案 7 :(得分:0)
您正在比较的所有变量之间是否存在其他可以利用的关系?
例如,他们是两个班级的所有成员吗?
如果是这样,并且如果您的性能要求不排除这一点,您可以将它们全部写入List或数组,然后循环比较它们。有时您可以在对象构造中执行此操作,而不是每次比较。
在我看来,真正的问题是在架构中的其他地方而不是在if()语句中 - 当然,这并不意味着它很容易修复,我很欣赏。
答案 8 :(得分:0)
这不是arrays
基本上用于什么?
不要将100 variables
命名为fieldn
,而是创建array
100 values
。
然后,如果条件匹配,您可以在数组中使用loop
组合函数和return true or false
。