昨天做权限限制的需求,给自己配置了两个新的分组,然后就发现登录不了项目了,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年了,真真的祖传代码,负责人可能跟甲方沟通没问题,但是修改这个祖传的东西还是下不了手。
我就想问问,人制定的使用规范能胜过严谨的代码逻辑吗?你们在项目开发中有没有遇到相似的情况呢?