编码编成翔的十八般兵器
程序员最怕读别人的代码,比这个更可怕的是什么?
从别人那里接手一个老项目
别问为什么,并且不接受反驳。
前任程序员或者是编码能力不行,或者是跳槽之前故意摆烂……于是,一个隐藏着一堆烂摊子的项目,扔给了后来接手的人。
本来以前是代码里夹翔,后来就是翔夹代码了。
这些翔有各种各样的风味,其中就有那么十八种味道最是冲人。
1. 块里堆上我满满的翔
Java 中有着无数的语句块,这些语句块可以嵌套。于是我们有很多优秀的产翔大师会在这些语句块中不断地嵌套,犹如无数层的俄罗斯套娃。
2. 把翔藏在注释里,有时候它会“惊艳”了世界
有些哥们儿很鸡贼的把一些代码藏在注释里,这些代码可以随时成为定时炸弹。
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. 我要把所有业务逻辑都揉进几个类里,就好像女友第一次来我家
有些哥们,你看看他负责的项目,你发现整个项目没几个类。你很纳闷,觉得业务很复杂,竟然可以实现的如此简单吗?你再打开他的类看源码,哦豁,这就是个垃圾箱啊,什么都能往里塞啊。
哥们儿,这不是女朋友去你租的房子里,你为了显得干净,把你那些垃圾到处塞啊。
11. 是男人就来看我继承一百层类
有些爷爷不知道怎么想的,在他们眼里可能只有儿子和老子,一个类很不得搞一百层的类继承。你这样继承,您家万贯家财还能遭得住吗?
12. 如果我不用缓存,我就能多浪费公司的几台服务器
还有些哥们儿,明明知道他这个功能可能被频繁访问,比如登录的时候查相关的白名单、黑名单。哥儿们儿知道并发量大,可从来不想套个缓存,就是死从数据库里要数据。数据库想:生产队的驴也没我这么忙啊。
13. 线程安全?那是什么?能吃吗?
有些号称老程序员的老司机们,经年有余的不管线程安全。上来口吐异步同步,可是到手上了,线程就是个后娘养的,不管人家的数据安全了。合着身前叫人家小甜甜,落地了叫人家牛夫人了?
14. 在我手中无物不锁
还有些哥们儿,怕线程跟怕老婆一样,一旦可能多线程了,上来先上个同步锁。你打开他写的代码,十个方法十把锁。于谦儿这种大户人家也不带这样上锁的啊。
15. 我只知道 ArrayList,LinkedList 它配我用吗?
有些兄弟可能只知道 ArrayList 能放东西。就算需要动态调整的场景,哥们儿也从不考虑 LinkedList。系统慢的跟龟爬一样,愣是说系统遇到瓶颈。
16. 我的方法里有无数的参数,也许里面需要一个宇宙
有些程序大师,他需求可能比较多,性格比较贪婪。写的方法也跟性格一样邪恶,一个方法需要的参数,从天上到地下,什么都需要。你要调他的方法,就跟有个黑洞吸住你不放一样,陷进去你就出不来了。放我去飞好不好?
17. 递归里偷偷抹掉出口条件,就让服务器的 CPU 燃烧殆尽吧
有时候看到没有出口的递归方法,你就知道,写这段代码的人的人生是多么悲催,他悲惨的连测试都不敢,生怕碰伤了自己。没有出口的递归,就跟没有出路的人生一样。
18. 如果我不关闭资源,那么我就能让公司多花些内存钱
用了资源您不释放,您是嫌山上的笋不够采,下山来夺笋了吧。行行好,放了那个资源吧。
得,看到了这里,列位看官看个乐就行了,希望诸位千万别使用这十八般兵器。
你好,我是四猿外。
一家上市公司的技术总监,管理的技术团队一百余人。
我从一名非计算机专业的毕业生,转行到程序员,一路打拼,一路成长。
我会通过公众号, 把自己的成长故事写成文章, 把枯燥的技术文章写成故事。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
开源框架WebRTC 10年发展,现已成为官方Web标准
Web实时通信(WebRTC)最近成为万维网联盟(W3C)的建议和Internet工程任务组(IETF)的标准。 这是WebRTC漫长征途中的一个重要里程碑,WebRTC始于2011年,当时Google开源了关键通信技术,而爱立信则实现了ConnectionPeer API。 随着WebRTC工作组努力整合新的用例(音频和视频提要的实时处理,物联网用例等),新标准将继续发展。 Ericsson对采用新标准发表了评论: “在建立人对人通信系统方面有着悠久的历史的爱立信(Ericsson)参与了WebRTC的早期开发,以期将这项技术塑造成可在不同的移动和固定环境中使用的技术。 WebRTC现在已成为全球官方标准的消息意味着,每个人都可以使用它来构建和提供不同的通信解决方案,这是一个稳定的基础。现在,我们正在采取下一步措施,在5G网络中也使用WebRTC。” WebRTC出现的时候,实时通信(RTC)既复杂又昂贵,其音频和视频技术要么必须获得许可,要么内部开发。使用RTC的网站(例如Skype,Facebook,Google Hangouts)通常需要下载,安装,更新插件或本机应用程序-有时...
- 下一篇
物联网快速开发平台 ThingsPanel 发布!
如何快速、高质量交付物联网项目并获得更高的利润是全球所有物联网公司所关心的核心问题。 针对这一问题,Amazon、Azure、Intel、aliyun等提出了快速的SAAS方案,但是给客户带来了长期的运行成本,也并不有利于物联网服务厂商获得更高的利润。于是方案就转向了Node-red、Grafana、Thingsboard等方案,但是由于Node-red美观度差、体验一般,Grafana功能单一,只能可视化等问题,于是Thingsboard变成了几乎唯一的选择。国内外的中小服务公司纷纷在Thingsboard上进行二次开发。Thingsboard的缺陷是复杂、美观度差、用户门槛高、交付之后客户不满意。因此Thingspanel应运而生。 ThingsPanel物联网平台是一套面向快速实施的物联网方案开发与共享平台,平台以简单、快速、美观、通用为特点,技术研发人员通过ThingsPanel平台可以快速构建应用,并将业务打包分发给世界各地的用户以获取收入。对业务人员而言,ThingsPanel不用写代码,一整套方案开箱即用。业务交付时间是传统的物联网方案的30%以下。成本也大幅度降低,Th...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度