什么样的代码是好代码?

关于什么是好代码,软件行业烂大街的名词一大堆,什么高内聚、低耦合、可复用、可扩展、健壮性等等。也有所谓设计6原则—SOLID,即Single Responsibility (单一职责),Open Close(开闭),Liskov Substitution(里氏替换),Interface Segregation(接口隔离),Dependency Inversion(依赖反转)

详情可参考: https://www.cnblogs.com/huangenai/p/6219475.html

不喜欢这些抽象名词,我们搞点简单明了的。一匹跑得快,少生病(健壮),可以驮载各类货物(可扩展),容易辨识(容易看懂),病好治(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年内把代码写好,技术博客字字推敲,坚持零拷贝和原创
  • 写博客的意义在于锻炼逻辑条理性,加深对知识的系统性理解,锻炼文笔,如果恰好又对别人有点帮助,那真是一件令人开心的事

*****************************************************************************************************

猜你喜欢

转载自www.cnblogs.com/NaughtyCat/p/what-is-good-codes.html