什么样的代码是好代码?
关于什么是好代码,软件行业烂大街的名词一大堆,什么高内聚、低耦合、可复用、可扩展、健壮性等等。也有所谓设计6原则—solid,即single responsibility (单一职责),open close(开闭),liskov substitution(里氏替换),interface segregation(接口隔离),dependency inversion(依赖反转)
详情可参考:
不喜欢这些抽象名词,我们搞点简单明了的。一匹跑得快,少生病(健壮),可以驮载各类货物(可扩展),容易辨识(容易看懂),病好治(bug好发现),高大英俊的千里汗血马是也
什么是好代码,不好定义,但是关于什么是代码里的"坏味道",比较容易搞清楚,避免代码里的“坏味道",离好的代码就不远了。坏味道一二三:
- 代码重复
- 函数太长
如果太长(一般不宜超过200行,但不绝对),你自己都不太容易读懂,请不要犹豫,拆成小函数吧。笔者刚毕业,参与一个大型复杂的金融软件,核心业务类,函数1000行算小case,5000多行的不在少数,我的内心是哇凉哇凉的,一万只*在心中奔腾,还好大致逻辑比较清晰
- 类太大
一般不宜操过1000行,同样不绝对,jdk源码过千行的不少嘛。还是那个大型复杂的金融软件,核心的几个algo c++文件,2万到3万行,我的心在滴血
- 函数参数列表太长
工作中有7个参数的函数调用,搞清楚每个参数的业务含意,和顺序有点头晕。尽管可能有默认函数参数,不小心的时候确实范过错误,后面直接引入一个线上bug,紧张
- 变量名、函数名称、类名、接口等命名含义不清晰
苦命的天朝程序员,还要把中文翻译为英文,我也很头大鸭。函数名能让人望名知义,看名字就知道函数的功能是啥,以至于几乎不需要多少comments最好
- 太多的if else
- 在循环里定义大量耗资源的变量
大对象,如果可以放在循环外,被共享,推荐这么搞
- try 块代码太长
try块只包住真的可能发生异常的语句
- 不用的资源未及时清理掉,流及时关闭
如io句柄,数据库连接,网络连接等。不清理掉,后果很严重,你若不信,软件就死给你看
- try-finally丑陋,明显更爱try-with-resources,颜控,没办法
丑陋的
static string firstlineoffile(string path) throws ioexception{ bufferedreader br = new bufferedreader(new filereader(path)); try { return br.readline(); } finally { br.close(); } }
漂亮的小姐姐
static string firstlineoffile(string path) throws ioexception{ try (bufferedreader br = new bufferedreader(new filereader(path))) { return br.readline(); } }
- 循环里字符串的拼接不要用”+“
有改过一个outofmemery的bug,字符串拼接用”+“,产生了一百多万的字符串变量。用visual vm程序占用内存空间比较多,数量最大的,通常都是string,所以用stringbuilder的append吧
- 太巨量的循环,用直接乘除法
移位运算吧,效率快太多
- 避免运行时大量的反射
不知道java社区 不太关注反射耗时的问题,以前写c#都会谨慎使用,c#社区有专门的讨论
- 基本类型优于装箱基本类型
基本类型更快,更省空间。避免不经意引起自动装箱和拆箱。是否相等的比较,装箱基本类型可能回出错
- 未作参数有效性检查
不搞这个,空异常妥妥地
- 延迟初始化和懒加载
这个的确是一种优化,即需要用到它的值时,才初始化。如果永不用到,就永远不会被初始化。但要慎用
- hashmap、arraylist等集合类,没有初始化数量
如果大致知道业务场景下这些集合类的数量,初始哈吧。不然默认好多16,结果你有1100个,会有数次重新分配内存和拷贝,费时间啊,我也懒,想耍啊
未完待续,困了
注:
参考《effective java》《重构 —— 改善既有代码的设计》
*****************************************************************************************************
精力有限,想法太多,专注做好一件事就行
- 我只是一个程序猿。5年内把代码写好,技术博客字字推敲,坚持零拷贝和原创
- 写博客的意义在于锻炼逻辑条理性,加深对知识的系统性理解,锻炼文笔,如果恰好又对别人有点帮助,那真是一件令人开心的事
*****************************************************************************************************