这不是第一次遇到这个问题,肯定不会是最后一次。每当有多个选项供用户选择时,应该有比无数IF语句更有效的方法,这个用户为几个变量而不是其他变量提供输入,尽管我们需要为其他人做一些工作 - 在他们的未选择的国家需要一些工作。
带有子选项的5个选项意味着我们的IF语句数量急剧增长,我不确定SWITCH是否适用,因为仍然需要比较逻辑,因此我们仍然需要以某种方式评估SWITCH的变量,然后再使用它如果??如果您已经了解范围,请更好地了解要处理这些案例的模式或解决方案吗?或者,如果你没有,我已经准备好一个例子来更好地解释。这是我们都遇到过的非常普遍的问题所以如果你觉得你不理解,请不要忽视 - 我可能只是很难解释它。
我的第一个例子很长,但与更新用户详细信息(预填表格+验证)有关。当用户提交一些参数但不是全部时,我们不希望触发那些保持不变的字段的验证。简而言之,这会生成许多嵌套的IF。
现在第二个例子,我希望能够清除所有关于我的问题的困惑。考虑简单的HTML表格。在我们的表中,我们有四列名称:
活动名称|事件类型|即使开始日期|活动结束日期
在我的场景中,我应该允许按两个字段排序。
作为用户,我可以为您生成4X3 = 12 仅使用任意两个字段进行排序的情况
有三个增长到4x3x2 = 24
显然没有IF或SWITCH语句可以拯救我们(很短的方式)。事实上我很少使用SWITCH语句和asfaik它至少在java中非常有限,允许用整数或字符串切换。
但是,SWITCH的一个有趣的问题是先前向它提供变量我必须首先评估它们。所以从HTML表单我提交两个变量sortByParamOne = NAME sortByParamTwo = TYPE
然后我必须声明:
if(sortByParamOne.equals("NAME")&&sortByParamTwo.equals("TYPE"))
case = 1
else if ...
case = 2
else if ...
12x IF总计只是为了准备变量
一种方式或另一种开关仅适用于单一输入,并且当我们有两个演员变量承担不同的角色时似乎提供了很少的帮助。如果我错了,请纠正我。
你如何应对这种不使用大量IF保持代码干净和简短的情况?这似乎是一种数学领域,而不是设计模式或我们的编程策略,甚至可能与SQL中的集合理论相关,我们可以以任何可想到的方式使用ORDER BY并使用任意数量的参数。
我认为在一本“春天”的frmwrk书中,他们专门用这个表来解决这个多排序示例问题。可能是另一个图书馆,它几乎没有说明工作原理。我没有拥有它,所以不能查看。
答案 0 :(得分:1)
除了俱乐部条件的一般技巧,使用switch语句,反射API,我建议考虑如何使代码模块化。您可以将代码划分为更小的方法,并可以减少您编写的条件数。尝试尽可能重复使用方法。始终尝试以通用方式编写方法以实现可重用性。
很多理论,现在让我们看一些例子吧。假设您需要找到三个数字中最大的一个。这就是我们如何在不使用模块化方法的情况下编写它:
public int largest(int first, int second, int third) {
int largest = first;
if ( second > largest )
largest = second;
else if (third > largest)
largest = third;
}
现在使用方法
重新编写它public int largest(int first, int second, int third) {
return largest(first,largest(second,third));
}
public int largestOfTwo(int first, int second) {
int largest = first;
if( second > largest)
largest = second;
return largest;
}
上述样本中应该可以看到差异。如果没有,那么我无法证明我的理论: - (
答案 1 :(得分:0)
我们来看看你的排序示例。尽管用户希望按顺序排序的可能性很多,但它们都是对称。这意味着,您要对哪个字段进行排序并不重要,因为您将对其应用相同的方法。
所以,假设您必须编写自定义比较器来执行排序。我会做类似的事情:
public CustomComparator implements Comparator<TableRow> {
// this will contain the column names that the table will be sorted by, in order
// eg. "NAME", "TYPE", "STARTDATE"
private List<String> conditions;
public CustomComparator(List<String> cond) { conditions = cond; }
public int compare(TableRow row1, TableRow row2)
{
for (String condition : conditions)
{
int result = row1.getColumn(condition).compareTo(row2.getColumn(condition));
if (result != 0) return result;
}
return 0;
}
}
当然,上面的示例假设所有列都是Comparable
。