关于什么是好代码,软件行业烂大街的名词一大堆,什么高内聚、低耦合、可复用、可扩展、健壮性等等。也有所谓设计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最好
大对象,如果可以放在循环外,被共享,推荐这么搞
try块只包住真的可能发生异常的语句
如io句柄,数据库连接,网络连接等。不清理掉,后果很严重,你若不信,软件就死给你看
丑陋的
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#社区有专门的讨论
基本类型更快,更省空间。避免不经意引起自动装箱和拆箱。是否相等的比较,装箱基本类型可能回出错
不搞这个,空异常妥妥地
这个的确是一种优化,即需要用到它的值时,才初始化。如果永不用到,就永远不会被初始化。但要慎用
如果大致知道业务场景下这些集合类的数量,初始哈吧。不然默认好多16,结果你有1100个,会有数次重新分配内存和拷贝,费时间啊,我也懒,想耍啊
未完待续,困了
注:
参考《effective java》《重构 —— 改善既有代码的设计》
*****************************************************************************************************
精力有限,想法太多,专注做好一件事就行
*****************************************************************************************************
如对本文有疑问, 点击进行留言回复!!
网友评论