0

这不是我第一次遇到这个问题,当然也不会是最后一次。当有多个选项供用户选择时,应该有比执行无数 IF 语句更有效的方法,并且该用户为几个变量而不是其他变量提供输入,尽管我们也需要为其他未选择的变量做一些工作未选择的状态需要一些工作。

5 个带有子选项的选项意味着我们的 IF 语句数量急剧增加,我不确定 SWITCH 是否适用,因为仍然需要比较逻辑,所以我们仍然需要在使用 SWITCH 之前以某种方式评估变量,这又是 IF?

如果您已经了解范围,请提供您对更有效地处理这些案例的模式或解决方案的见解?或者,如果您没有,我已经准备了一个示例来更好地解释。这是我们都遇到过的非常普遍的问题,所以如果您觉得您不理解,请不要忽略 - 我可能真的不擅长解释它。

我的第一个示例很长,但与更新用户详细信息(预填充表单+验证)有关。当用户提交一些参数但不是全部时,我们不想为那些保持不变的字段触发验证。简而言之,这会生成许多嵌套的 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 中,我们可以以任何可以想象的方式并使用任意数量的参数进行排序。

我认为在一本“Spring”frmwrk 书中,他们已经将整章专门用于这个多排序的表格示例问题。可能是另一个图书馆,它很少说明事情是如何运作的。我的 atm 没有它,所以无法查找。

4

2 回答 2

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;
}

在上面的示例中应该可以看到差异。如果不是,那么我无法证明我的理论:-(

于 2013-09-22T03:54:25.677 回答
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.

于 2013-09-22T05:33:43.853 回答