昨天做权限限制的需求,给自己配置了两个新的分组,然后就发现登录不了项目了,sql报错ORA-01795: maximum number of expressions in a list is 1000,一路debugger找到了元凶,看逻辑是想把两个不同表里的分组去重然后合并到一起,从表面上看,代码没啥毛病,但是细看一下,就发现了问题。现在我通过简易代码还原一下:
public static void main(String[] args) {
List<String> aList = new ArrayList<>();
aList.add("a");
aList.add("b");
aList.add("c");
aList.add("d");
aList.add("e");
aList.add("f");
aList.add("h");
aList.add("i");
aList.add("j");
List<String> bList = new ArrayList<>();
bList.add("k");
bList.add("l");
for (int i = 0; i < aList.size(); i++) {
String a = aList.get(i);
for (int j = 0; j < bList.size(); j++) {
String b = bList.get(j);
if (b.equals(a)){
continue;
}else{
bList.add(a);
}
}
}
System.out.println(bList.size());
}
有兴趣的小伙伴可以猜一下这个bList的size是多少。
然后向负责人提交截图,逻辑分析,结果负责人说修改这个风险有点高,你先设定其他分组试试,能继续目前的开发需求就行,否决了我修改这段代码的提议。
把代码修改成不就好了吗,又不破坏原有的逻辑,也能避免问题的出现:
public static void main(String[] args) {
List<String> aList = new ArrayList<>();
aList.add("a");
aList.add("b");
aList.add("c");
aList.add("d");
aList.add("e");
aList.add("f");
aList.add("h");
aList.add("i");
aList.add("j");
List<String> bList = new ArrayList<>();
bList.add("k");
bList.add("l");
for (String a : aList) {
if(!bList.contains(a)){
bList.add(a);
}
}
System.out.println(bList.size());
}
这段代码是项目初始化时候就有的,满打满算有9年了,真真的祖传代码,负责人可能跟甲方沟通没问题,但是修改这个祖传的东西还是下不了手。
我就想问问,人制定的使用规范能胜过严谨的代码逻辑吗?你们在项目开发中有没有遇到相似的情况呢?