编码技巧:多条件判断拼接字符串
在写代码业务逻辑的时候,有时候需求稍微变化一下都让代码变的很麻烦,如果只在现有代码基础上硬改,可能会让可读性降低,本文通过一个例子来演示字符串拼接的变化。后来连上面这种写法中如果不满足,前面就是"",此时如果后面条件满足,拼接时会额外带上and导致语法错误,如果不嫌麻烦把and这样倒是能实现功能了,但是不易于阅读,看着就很乱。我们来看看GitHub Copilot会如何解决上面的变化。
在写代码业务逻辑的时候,有时候需求稍微变化一下都让代码变的很麻烦,如果只在现有代码基础上硬改,可能会让可读性降低,本文通过一个例子来演示字符串拼接的变化。
一开始的业务逻辑比较简单,是固定条件加一个需要判断再追加的条件:
List<String> currentUserDeptIds = getCurrentUserDeptIds();
return "forcetender = 1 " +
(currentUserDeptIds.isEmpty() ? "" : " and cdeptid in (" + String.join(",", currentUserDeptIds) + ")");
后来连 forcetender = 1
都要变成可选条件时,这里简单的字符串拼接就不可行了,例如改成下面:
String forceTenderPublish = Parameter.get("FORCE_TENDER_PUBLISH");
return ("1".equals(forceTenderPublish) ? "" : "forcetender = 1 ") +
(currentUserDeptIds.isEmpty() ? "" : " and cdeptid in (" + String.join(",", currentUserDeptIds) + ")");
上面这种写法中如果 "1".equals(forceTenderPublish)
不满足,前面就是 ""
,此时如果后面条件满足,拼接时会额外带上 and
导致语法错误,如果不嫌麻烦把 and
改成条件判断就变成了:
String forceTenderPublish = Parameter.get("FORCE_TENDER_PUBLISH");
return ("1".equals(forceTenderPublish) ? "" : "forcetender = 1 ") +
(currentUserDeptIds.isEmpty() ? "" : ("1".equals(forceTenderPublish) ? "" : "and ") + " cdeptid in (" + String.join(",", currentUserDeptIds) + ")");
这样倒是能实现功能了,但是不易于阅读,看着就很乱。
我们来看看GitHub Copilot会如何解决上面的变化。
Ask:
getDefaultCondition方法(基于上面第一次改动)最后的return有问题,当前面一个为空时,后面不需要有 and 前缀,请修改正确。
GitHub Copilot:
您的观察是正确的。在当前的实现中,如果forceTenderPublish不等于"1",那么返回的字符串将以" and “开始,这可能会导致SQL查询错误。我们可以通过将所有条件添加到一个列表中,然后使用String.join方法来解决这个问题。这样,只有当列表中有多个元素时,” and "才会被插入。
以下是修改后的getDefaultCondition方法:
String forceTenderPublish = Parameter.get("FORCE_TENDER_PUBLISH");
List<String> conditions = new ArrayList<>();
if ("1".equals(forceTenderPublish)) {
conditions.add("forcetender = 1");
}
List<String> currentUserDeptIds = getCurrentUserDeptIds();
if (!currentUserDeptIds.isEmpty()) {
conditions.add("cdeptid in (" + String.join(",", currentUserDeptIds) + ")");
}
return String.join(" and ", conditions);
在这个修改后的版本中,我们首先创建一个空的conditions列表。然后,我们检查forceTenderPublish和currentUserDeptIds,如果它们满足条件,我们就将相应的条件添加到列表中。最后,我们使用String.join方法将所有条件连接起来,每个条件之间用" and “分隔。这样,只有当有多个条件时,” and "才会出现。
按照上面的方案,不仅方便我们增加更多的类似条件,而且可读性也大大提高了,遇到类似变化的时候,不能只实现功能,还要考虑易读性和后续可能的变化。
更多推荐
所有评论(0)