
在《程序员之拍案惊奇:为什么我会一天到晚的想说FUCK!》这篇文章里我贴一张程序员抓狂的配图,其实这一点都不夸张,读读下面这个故事,我相信无论谁做这个代码审查的当事人都会抓狂,你觉得呢?
这是一个真实的发生在Java代码审查中的故事。
被审查的是下面这行代码:
if (currentQueryType.name().equalsIgnoreCase("ALL_THE_WORDS")) {
...
}
其中currentQueryType是枚举,在其它地方定义,代码如下:
public enum QueryType {
BOOLEAN, DOCUMENT_IDS , ALL_THE_WORDS, ANY_OF_THE_WORDS, LITERAL_PHRASES;
}
审查者:
(心里想:什么玩意?)请重构这个switch-case语句
印度外包技术负责人:
这样写不行:
switch (type.ordinal()){
case 0:
...
case 1:
...
}
审查人:
???
像这样写:
switch (type) {
case DOCUMENT_IDS:
...
case ALL_THE_WORDS
...
}
外包技术负责人:
这样也不行:
审查者:
肯定能行,让我看看你的编译输出信息
外包技术负责人:
我想原因可能是我们在switch case里使用了===操作符,而在if/then/else里我们使用==进行比较:http://stackoverflow.com/questions/2573145/switch-case-for-strings-in-javascript-not-working-as-expected
审查者:
我们不是写Javascript,是Java!
外包技术负责人:
但我这边的switch case是这种情况:所有的case它都认为是true,都去执行,而不是只执行等于我传入值的那个case,比这个值大的它也执行。如果我传入2,case 2会执行,case 3也执行,我能把代码发给你吗,你可以在你机器上试一试。
审查者:
你是不是忘了在每个case后写break;?
外包技术负责人:
哦。我在switch case前后都放了一个break(断点),这样我可以按F6进行调试。
审查者:
我不是跟你说断点(breakpoinit),我说的是break语句!在谷歌里搜一下switch case
外包技术负责人:
哦!!!
引用来自“Lunar_Lin”的评论
引用来自“LongCity”的评论
引用来自“Ellipse”的评论
引用来自“Tobyee”的评论
至少他们还有代码审核这一环节……
switch enumState {
case ...
}
改成
if("XXX".eqaulsIgnoreCase(stringState))
当时我也抓狂了
要破坏的逻辑流, 不管怎样都会破坏的. 都函数调用了, 还在乎什么流水线. 这些年很多书籍都TMD的胡乱写,包含中文,英文.业界都该反省反省. 该用的关键字就要用的. 看有人为了躲避goto 使用了dowhile(0) 心中真是无数次草泥马在奔腾. goto多么好的东西!!
引用来自“Ellipse”的评论
引用来自“Tobyee”的评论
至少他们还有代码审核这一环节……
switch enumState {
case ...
}
改成
if("XXX".eqaulsIgnoreCase(stringState))
当时我也抓狂了
%掌权决定的. 评审者只是提个建议, 作者想采纳就采纳,不想采纳就不采纳, 评审只是为了让作者获得别人对代码的评价,集思广益. 任何事都还是要回归到本质. 我之前的东家还会有 评审通过者, 通过与否的标准是 是否所有代码被仔细完整的看过了, 而和评审的具体内容无关.
引用来自“LongCity”的评论
引用来自“Ellipse”的评论
引用来自“Tobyee”的评论
至少他们还有代码审核这一环节……
switch enumState {
case ...
}
改成
if("XXX".eqaulsIgnoreCase(stringState))
当时我也抓狂了
要破坏的逻辑流, 不管怎样都会破坏的. 都函数调用了, 还在乎什么流水线. 这些年很多书籍都TMD的胡乱写,包含中文,英文.业界都该反省反省. 该用的关键字就要用的. 看有人为了躲避goto 使用了dowhile(0) 心中真是无数次草泥马在奔腾. goto多么好的东西!!
引用来自“熊二”的评论
引用来自“ckgoodness”的评论
引用来自“熊二”的评论
感觉没多大意义啊,浪费时间,孔乙己会写几个回字,有什么用,逻辑能跑通就行了
引用来自“yuzhouliu”的评论
印度的外包也不全是这样,至少我知道一个团队一直被雇佣做Amozon的云服务,技术不是一般的强
引用来自“piggy”的评论
意思就是说,这个外包的根本就不懂什么是switch case.
case DOCUMENT_IDS:
...
break;
case ALL_THE_WORDS
...
break;
}
是这个意思吧
引用来自“ckgoodness”的评论
引用来自“熊二”的评论
感觉没多大意义啊,浪费时间,孔乙己会写几个回字,有什么用,逻辑能跑通就行了
引用来自“Ellipse”的评论
引用来自“Tobyee”的评论
至少他们还有代码审核这一环节……
switch enumState {
case ...
}
改成
if("XXX".eqaulsIgnoreCase(stringState))
当时我也抓狂了
引用来自“Tobyee”的评论
至少他们还有代码审核这一环节……
switch enumState {
case ...
}
改成
if("XXX".eqaulsIgnoreCase(stringState))
当时我也抓狂了
引用来自“袁国涛”的评论
一声长叹啊……这连我们公司面试可能都过不去啊。
引用来自“fangjun105”的评论
应该是没有在每个分支后写上 break
引用来自“kxt”的评论
引用来自“狄仁傑”的评论
引用来自“魔力猫”的评论
连基本语法都不懂就开发,那边招人的标准太宽了吧。
引用来自“熊二”的评论
感觉没多大意义啊,浪费时间,孔乙己会写几个回字,有什么用,逻辑能跑通就行了
引用来自“狄仁傑”的评论
引用来自“魔力猫”的评论
连基本语法都不懂就开发,那边招人的标准太宽了吧。
2)不知道switch case有没有要求,至少if else if最好是把频率可能最高的放在最前面,以尽快结束整个if;
3)沟通不畅,把breakpoint当做break了;
引用来自“u_xtian”的评论
if ("ALL_THE_WORDS".equalsIgnoreCase(currentQueryType.name())) 这样写会比这样if (currentQueryType.name().equalsIgnoreCase("ALL_THE_WORDS")) 好很多。
引用来自“xiaog”的评论
引用来自“红薯”的评论
没看懂
引用来自“魔力猫”的评论
连基本语法都不懂就开发,那边招人的标准太宽了吧。
引用来自“u_xtian”的评论
if ("ALL_THE_WORDS".equalsIgnoreCase(currentQueryType.name())) 这样写会比这样if (currentQueryType.name().equalsIgnoreCase("ALL_THE_WORDS")) 好很多。
引用来自“u_xtian”的评论
if ("ALL_THE_WORDS".equalsIgnoreCase(currentQueryType.name())) 这样写会比这样if (currentQueryType.name().equalsIgnoreCase("ALL_THE_WORDS")) 好很多。
Java 使用Enum 比较好处就是可以使用 Type safe 方式,为什么还要转换成 String equals 比较。