最近经常做业务逻辑代码review的工作,发现各种风格的代码,其中有一种是封装和抽象做的非常的多,代码层次非常的深入,表面给人感觉是:牛逼的代码。

但是从清晰度和可维护性来说,还是不推荐这么做。

1、这种代码出现问题后,很难定位哪里出现问题;

2、后续别人维护起来也相当困难;

3、每看一个简单的case,都要跟踪很久;

4、写UT(单元测试)也相当麻烦

我个人认为编写业务逻辑代码还是要从可读性入手,轻松的能看懂代码,如果代码有问题,可以快速定位和修复。我们又不是做底层框架编写,要追求各种设计和扩展性。

下面列举我觉得是清晰可维护的业务逻辑代码的一些特性。

清晰

虽然面向对象讲究内聚和封装,但是太多的子方法和类,实在是会把人绕到头晕,我推荐的做法是,方法尽量的内联,是同一个业务的就通通放到某个方法里面,如果这段逻辑实在太长,可以考虑抽取一些子方法(尽量别太多)。至于类,别动不动就来个类封装一把,要避免类膨胀。

好的命名和注释

现在网上的一些文章流行去除所有注释,通通用一个好的方法名字表达即可。这种做法我个人是很反对的。虽然方法的命名极其重要,但是写业务逻辑代码,必要的注释还是要的,另外的同事阅读代码的时候,也比较容易读懂代码的意图。

精准有意义的日志输出

如果从事过互联网项目的同学,应该有一种深深的体会,线上出现问题,除了看各种监控系统之外,就是看日志了。日志的输出必须是有意义准确的,尤其是 异常日志和业务日志。好的日志输出,可以快速定位问题并快速解决。如果解决一个问题要一个小时的话,有可能公司就损失几百万了。

代码对称性

例如:

getInputParameter();

process();

output();

这种就属于代码的对称性。

必要的设计

只是简单的根据业务场景直白的编写代码也是不可行的。必要的设计可以带来更加清晰的代码结构。

一定要有UT(单元测试)

没有UT的代码实在是太恐怖了,尤其是互联网应用的代码,稍微出点问题,公司就有可能损失一大笔钱。

编写ut的时候,至少一定要把重要的流程覆盖到,万一代码有问题了,也只是小问题。再者,由于需求的变更,原来写好的代码还需要再次改动,如果你没有ut覆盖的话,可能影响原来代码的功能。ut可以带给我们信心。另外UT也可以促进你编写清晰的代码。

 

(转)牛B的代码不一定是好代码的更多相关文章

  1. 牛客网Java刷题知识点之代码块(局部代码快、构造代码块、静态代码块)

    不多说,直接上干货! 代码块包括局部代码快.构造代码块.静态代码块. 代码块,就是一段独立的代码空间. 1.局部代码快 对局部变量的生命周期进行控制. 2.构造代码块 对所有对象进行初始化. 3.静态 ...

  2. 每周一书-编写高质量代码:改善C程序代码的125个建议

    首先说明,本周活动有效时间为2016年8月28日到2016年9月4日.本周为大家送出的书是由机械工业出版社出版,马伟编著的<编写高质量代码:改善C程序代码的125个建议>. 编辑推荐 10 ...

  3. C++统计代码注释行数 & 有效代码行数 & 代码注释公共行 & 函数个数

    问题来源,在14年的暑假的一次小项目当中遇到了一个这样的问题,要求统计C++代码的注释行数,有效代码行数,代码注释公共行数,以及函数个数. 下面稍微解释一下问题, 1)注释行数:指有注释的行,包括有代 ...

  4. c代码中调用c++,c++代码中调用c代码

    注意这里的c调用c++或者c++调用c的意思是.c文件中调用.cpp文件中的代码,或者相反 集成开发环境如vc++6.0或者vs都是通过文件后缀来区别当前要编译的是C代码还是C++代码,然后采用相应的 ...

  5. final、static、代码块、静态代码块、内部类、代码执行顺序

    final final域使得确保初始化安全性(initialization safety)成为可能,初始化安全性让不可变形对象不需要同步就能自由地被访问和共享 作用在类上               ...

  6. 关于java构造函数,静态代码块,构造代码块,和普通代码块相关总结(一)

    构造函数.构造代码块和静态代码块容易混淆,它们的执行条件和执行顺序也常常容易犯迷.这里就针对这些问题说一下我个人的一些理解,顺便对这部分内容做个小结. 一.构造函数 格式:类名(参数1,参数2,-){ ...

  7. 如何把if-else代码重构成高质量代码

    原文:https://blog.csdn.net/qq_35440678/article/details/77939999 本文提纲: 为什么我们写的代码都是if-else? 这样的代码有什么缺点? ...

  8. java代码编译与C/C++代码编译的区别

    Java编译原理 1.Java编译过程与c/c++编译过程不同 Java编译程序将java源程序编译成jvm可执行代码--java字节码. Java在编译过程中一般会按照以下过程进行: (1)JDK根 ...

  9. Swagger结合mustache模板生成后台接口代码、以及前后台建模代码

    之前项目中使用的的thrift来建模,维护前后台模型以及rest接口,前台使用的是angular2: 但是使用thrift只能生成建模,后台的rest接口的Controller文件还是需要手动去写,一 ...

  10. .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中

    不知你是否见过 try { } finally { } 代码中,try 块留空,而只往 finally 中写代码的情况呢?这种写法有其特殊的目的. 本文就来说说这种不一样的写法. 你可以点开这个链接查 ...

随机推荐

  1. MapReduce实战(一)自定义类型

    需求: 处理以下流量数据,第1列是手机号,第7列是上行流量,第8列是下行流量.将手机号一样的用户进行合并,上行流量汇总,下行流量也汇总,并相加求得总流量. 1363157985066 13726230 ...

  2. Sql Server根据表名生成查询的存储过程(查询条件可选)

    static void Main(string[] args) { string 表名 = "water_emstime"; string sql = "exec Get ...

  3. Oozie安装与部署

    原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3885162.html 安装基础环境: Hadoop – 2.2.0  Linux – Centos 6. ...

  4. java网络编程4-ServerSocket

    //端口号为0则系统随机分配端口,连接队列系统一般默认50,指过超过系统最大的就以系统为准 //如果客户端的连接超过连接队列,则会被主机拒绝 ServerSocket serverSocket=new ...

  5. 4190. Prime Palindromes 一亿以内的质数回文数

    Description The number 151 is a prime palindrome because it is both a prime number and a palindrome ...

  6. VC++ Debug产生异常时中断程序执行Break on Exception

    It is possible to instruct the debugger to break when an exception occurs, before a handler is invok ...

  7. 【转】HDC,CDC,CWindowDC,CClientDC,CPaintDC等等

     转载出处:http://blog.sina.com.cn/s/blog_447611f20100lirt.html 首先说一下什么是DC(设备描述表) Windows应用程序通过为指定设备(屏幕,打 ...

  8. TypeScript 变量声明(二)

    ES6 中,变量声明一共有6种,分别是var.function .let.const.class和import. let 基本语法:let 变量名 :类型.其中类型不是必须的. 1.用于声明变量,其用 ...

  9. MySQL数据库安装文件夹与配置文件简易说明

    1.MySQL安装文件夹 bin:存放着可执行文件 include:存放头文件 lib:存放库文件 share:存放字符集.语言等信息 2.配置文件 my.ini:MySQL软件正在使用的配置文件 m ...

  10. IIS部署ASP.NET MVC (4.0)网站出现的错误

    (1)无法读取配置节“system.web.extensions”,因为它缺少节声明 在IIS中,在基本设置中,将程序池选择为ASP.NET 4.0即OK! (2)由于 Web 服务器上的“ISAPI ...