我有以下(简化)条件需要针对我正在撰写的表单进行验证:
a> B'/ P>
a> ç
a> d
b> ç
b> d
c> d
从图形上看,这可以看作:
用户可以自由输入a,b,c和d的值,这就是为什么需要对其进行验证以确保遵守这些规则的原因。我遇到的问题是写一些清楚有效地评估每个陈述的东西。当然,最明显的方法是将每个语句分别作为if语句进行评估。不幸的是,这会占用很多代码行,而且我宁愿避免使用一堆if-blocks来完成同样的事情。我确实使用数组提出了以下嵌套的for循环解决方案。我构建了一个值数组,并将其循环两次(在类似Python的伪代码中演示):
A = [a, b, c, d]
for i in range(3):
for j in range(i, 4):
if i > j and A[i] >= A[j]:
print("A[i] must be less than A[j]")
else if i < j and A[i] <= A[j]:
print("A[j] must be greater than A[i]")
我对此解决方案的问题是难以阅读和理解 - 解决方案并不清楚。
我有这种唠叨的感觉,那里有一个更好,更清晰的答案,但我无法想到它对我的生活。这不是家庭作业或任何事情 - 我实际上正在研究一个项目,这个问题(或它的微妙变化)不止一次出现,所以我想制作一个清晰有效的可重用解决方案。任何输入将不胜感激。谢谢!
答案 0 :(得分:6)
if a > b > c > d:
do ok
else:
for x in range(3):
if A[i] <= A[i+1]:
print A[i], ' not greater than', A[i+1]
答案 1 :(得分:2)
如果你不能假设比较的传递性:
from itertools import combinations
for x, y in combinations(A, 2):
if x <= y:
print("{} not greater than {}".format(x, y))
否则,f p的解决方案是最佳的。
答案 2 :(得分:0)
您可以为每个检查创建委托,并将这些委托添加到数组中。创建适当的委托,比如bool LargerCheck(a,b,字符串错误)并将它们添加到一个可以循环遍历的数组中......
虽然更具可读性,但工作量很大,而且更复杂。我想我只是将凌乱的支票隐藏在一个验证块中,并且在普通代码中有一个易于阅读的单一检查。像这样的东西;
// Simple readable check in normal code
if (!ValidationOk(a,b,c,d,response)
{
ShowResponse(response);
Break;
}
// messy routine
private bool ValidationOk(a,b,c,d,List<string> valerrors)
{
valerrors.Clear();
if (a<b) valerrors.Add("a < b");
if (a<c) valerrors.Add("a < c");
....
return valerrors.Count == 0;
}