欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

什么样的代码是好代码?

程序员文章站 2022-06-20 09:01:02
关于什么是好代码,软件行业烂大街的名词一大堆,什么高内聚、低耦合、可复用、可扩展、健壮性等等。也有所谓设计6原则—SOLID,即Single Responsibility (单一职责),Open Close(开闭),Liskov Substitution(里氏替换),Interface Segreg ......

什么样的代码是好代码?

关于什么是好代码,软件行业烂大街的名词一大堆,什么高内聚、低耦合、可复用、可扩展、健壮性等等。也有所谓设计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年内把代码写好,技术博客字字推敲,坚持零拷贝和原创
  • 写博客的意义在于锻炼逻辑条理性,加深对知识的系统性理解,锻炼文笔,如果恰好又对别人有点帮助,那真是一件令人开心的事

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