当前位置: 移动技术网 > IT编程>软件设计>架构 > 什么样的代码是好代码?

什么样的代码是好代码?

2019年09月26日  | 移动技术网IT编程  | 我要评论

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网