程序员最怕读别人的代码,比这个更可怕的是什么?
从别人那里接手一个老项目
别问为什么,并且不接受反驳。
前任程序员或者是编码能力不行,或者是跳槽之前故意摆烂……于是,一个隐藏着一堆烂摊子的项目,扔给了后来接手的人。
本来以前是代码里夹翔,后来就是翔夹代码了。
这些翔有各种各样的风味,其中就有那么十八种味道最是冲人。
1. 块里堆上我满满的翔Java 中有着无数的语句块,这些语句块可以嵌套。于是我们有很多优秀的产翔大师会在这些语句块中不断地嵌套,犹如无数层的俄罗斯套娃。
有些哥们儿很鸡贼的把一些代码藏在注释里,这些代码可以随时成为定时炸弹。
public static void main(String[] args) { String a = "Hello"; // \u000d a="world"; System.out.println(a); // \u000a a="hello world!"; System.out.println(a); }上面这段代码运行之后,说好的“Hello”呢?
world hello world! 3. 我家大门常打开,欢迎错误走进来在 Java 中,如果你想接手一个项目,看到一个父类的字段是非 private 的,而子类还存在同名字段,要注意了,这个项目的前任可能比较渣,你可能会恼火的想给他烧纸。比如:
public class Base { public int field = 0; public int getField() { return field; } } public class Sub extends Base { public int field = 1; public int getField() { return field; } }你这样测试下看看
public static void main(String[] args) { Sub s = new Sub(); Base b = s; System.out.println(s.field); System.out.println(b.field); System.out.println(((Sub) b).field); System.out.println(((Base) s).field); } 4. 我抓到了异常,但是我不想处理了,因为我要离职了有些哥们儿走之前可能人未动心已远,也可能是懒的处理异常,他会给你留下一个谜之空白。
public class EmptyCatchBlockTest { public static void main(String[] args) { try { int a = 4, b = 0; int c = a/b; } catch(ArithmeticException ae) { // ??? } } }对不起,兄弟,你留下这种薛定谔的处理是想让人帮你掀桌吗?
5. 只要我不考虑任何意外的情况,那么项目就一定会出意外有些直性子的人,认为天下万物都可以直来直去,就好像直男只会让女生“多喝热水”一样。所以,他们写的代码非常直率,直接就不考虑意外情况。
public static void main(String[] args) { int a = args.length; int b = 42 / a; if (a == 1) { a = a / (a - a); } if (a == 2) { int c[] = {1}; c[42] = 99; } }上边的代码很直率,既不考虑 a 可能为 0 的情况,也不考虑数组越界。直来直去,就好像“我不尴尬,尴尬的就是别人”。
6. 我要把方法里可能的异常藏起来不告诉任何人还有些哥们也不知道是不是有什么见不得人的事情,该抛出来的异常从来不抛出来,导致你根本不知道发生了什么事情。
InputStream is = null; try { is = new FileInputStream("一个文件.txt"); } catch (FileNotFoundException e) { } int b; try { while ((b = is.read()) != -1) { } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } }上面的代码里,如果文件找不到,接手人要撞墙的。
7. 我不走正道,因为我是个光荣的产翔侠还有些人,不知道从哪里学会的邪门歪道,喜欢通过在捕获异常里写业务逻辑。对这种人,你九阴真经练成了梅超风啊。
public DateTime override Add(TimeSpan ts) { try { return base.Add(ts); } catch (ArgumentOutOfRangeException nb) { // calculate how much the MaxValue is exceeded // regular program flow TimeSpan saldo = ts - (base.MaxValue - this); return DateTime.MinValue.Add(saldo) } catch(Exception anyOther) { // 'real' exception handling. } }我就想问问,如果以异常来控制流程,那么如何在这些异常中寻找真正的异常情况?
8. 为了我走之前不出意外,我要捕获所有的 NPE有些哥们儿会把 NPE 捕获住,恩,不解决问题,但是把提出问题的人给解决了。
private static void callInstanceMethodOfNull() { try { Integer age = null; age.toString(); } catch (NullPointerException exception) { Logging.log(exception); } catch (Throwable exception) { Logging.log(exception, false); } }但是呢,这在正常的业务逻辑里很可能就把别人坑了,因为 Null 本身就是代表着一种非法状态。拿着前朝的剑斩今朝的官,包大人干的好啊。
9. 一个方法我如果写成一万行,公司一定会倒闭的有些朋友可能有分离焦虑症,一个方法里能写上 1 万行代码。对不起,读书读几页都会犯困,读你这一万行代码……
10. 我要把所有业务逻辑都揉进几个类里,就好像女友第一次来我家