(转)牛B的代码不一定是好代码
最近经常做业务逻辑代码review的工作,发现各种风格的代码,其中有一种是封装和抽象做的非常的多,代码层次非常的深入,表面给人感觉是:牛逼的代码。
但是从清晰度和可维护性来说,还是不推荐这么做。
1、这种代码出现问题后,很难定位哪里出现问题;
2、后续别人维护起来也相当困难;
3、每看一个简单的case,都要跟踪很久;
4、写UT(单元测试)也相当麻烦
我个人认为编写业务逻辑代码还是要从可读性入手,轻松的能看懂代码,如果代码有问题,可以快速定位和修复。我们又不是做底层框架编写,要追求各种设计和扩展性。
下面列举我觉得是清晰可维护的业务逻辑代码的一些特性。
清晰
虽然面向对象讲究内聚和封装,但是太多的子方法和类,实在是会把人绕到头晕,我推荐的做法是,方法尽量的内联,是同一个业务的就通通放到某个方法里面,如果这段逻辑实在太长,可以考虑抽取一些子方法(尽量别太多)。至于类,别动不动就来个类封装一把,要避免类膨胀。
好的命名和注释
现在网上的一些文章流行去除所有注释,通通用一个好的方法名字表达即可。这种做法我个人是很反对的。虽然方法的命名极其重要,但是写业务逻辑代码,必要的注释还是要的,另外的同事阅读代码的时候,也比较容易读懂代码的意图。
精准有意义的日志输出
如果从事过互联网项目的同学,应该有一种深深的体会,线上出现问题,除了看各种监控系统之外,就是看日志了。日志的输出必须是有意义准确的,尤其是 异常日志和业务日志。好的日志输出,可以快速定位问题并快速解决。如果解决一个问题要一个小时的话,有可能公司就损失几百万了。
代码对称性
例如:
getInputParameter();
process();
output();
这种就属于代码的对称性。
必要的设计
只是简单的根据业务场景直白的编写代码也是不可行的。必要的设计可以带来更加清晰的代码结构。
一定要有UT(单元测试)
没有UT的代码实在是太恐怖了,尤其是互联网应用的代码,稍微出点问题,公司就有可能损失一大笔钱。
编写ut的时候,至少一定要把重要的流程覆盖到,万一代码有问题了,也只是小问题。再者,由于需求的变更,原来写好的代码还需要再次改动,如果你没有ut覆盖的话,可能影响原来代码的功能。ut可以带给我们信心。另外UT也可以促进你编写清晰的代码。
(转)牛B的代码不一定是好代码的更多相关文章
- 牛客网Java刷题知识点之代码块(局部代码快、构造代码块、静态代码块)
不多说,直接上干货! 代码块包括局部代码快.构造代码块.静态代码块. 代码块,就是一段独立的代码空间. 1.局部代码快 对局部变量的生命周期进行控制. 2.构造代码块 对所有对象进行初始化. 3.静态 ...
- 每周一书-编写高质量代码:改善C程序代码的125个建议
首先说明,本周活动有效时间为2016年8月28日到2016年9月4日.本周为大家送出的书是由机械工业出版社出版,马伟编著的<编写高质量代码:改善C程序代码的125个建议>. 编辑推荐 10 ...
- C++统计代码注释行数 & 有效代码行数 & 代码注释公共行 & 函数个数
问题来源,在14年的暑假的一次小项目当中遇到了一个这样的问题,要求统计C++代码的注释行数,有效代码行数,代码注释公共行数,以及函数个数. 下面稍微解释一下问题, 1)注释行数:指有注释的行,包括有代 ...
- c代码中调用c++,c++代码中调用c代码
注意这里的c调用c++或者c++调用c的意思是.c文件中调用.cpp文件中的代码,或者相反 集成开发环境如vc++6.0或者vs都是通过文件后缀来区别当前要编译的是C代码还是C++代码,然后采用相应的 ...
- final、static、代码块、静态代码块、内部类、代码执行顺序
final final域使得确保初始化安全性(initialization safety)成为可能,初始化安全性让不可变形对象不需要同步就能自由地被访问和共享 作用在类上 ...
- 关于java构造函数,静态代码块,构造代码块,和普通代码块相关总结(一)
构造函数.构造代码块和静态代码块容易混淆,它们的执行条件和执行顺序也常常容易犯迷.这里就针对这些问题说一下我个人的一些理解,顺便对这部分内容做个小结. 一.构造函数 格式:类名(参数1,参数2,-){ ...
- 如何把if-else代码重构成高质量代码
原文:https://blog.csdn.net/qq_35440678/article/details/77939999 本文提纲: 为什么我们写的代码都是if-else? 这样的代码有什么缺点? ...
- java代码编译与C/C++代码编译的区别
Java编译原理 1.Java编译过程与c/c++编译过程不同 Java编译程序将java源程序编译成jvm可执行代码--java字节码. Java在编译过程中一般会按照以下过程进行: (1)JDK根 ...
- Swagger结合mustache模板生成后台接口代码、以及前后台建模代码
之前项目中使用的的thrift来建模,维护前后台模型以及rest接口,前台使用的是angular2: 但是使用thrift只能生成建模,后台的rest接口的Controller文件还是需要手动去写,一 ...
- .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中
不知你是否见过 try { } finally { } 代码中,try 块留空,而只往 finally 中写代码的情况呢?这种写法有其特殊的目的. 本文就来说说这种不一样的写法. 你可以点开这个链接查 ...
随机推荐
- PHP上传类 图片上传 upload class实现image crop resize 缩略图
manage uploaded files, and manipulate images in many ways through an HTML form, a Flash uploader, XM ...
- 基于WebBrowser 的爬虫程序
WebBrowser的属性和事件 WebBrowser 如何跳转页面 web.Navigate(""); WebBrowser 如何循环跳转获取页面内容 bool loading ...
- easy ui 验证框的使用
Easy ui 插件之validatebox missingMessage:未填写时显示的信息validType:验证类型见下示例invalidMessage:无效的数据类型时显示的信息require ...
- HTML5 选择前置摄像头,选择后置摄像头
最近发现我写的都是乱七八糟的,觉得应该给大家带点福利,于是写了这篇 背景:最近想做个web应用,需要用到摄像头,但是发现默认一直是前置摄像头,拍照很麻烦,于是找了很多文章,居然没有人提到,只好FQ去找 ...
- 基础-Eclipse 教程
1.Eclipse 是一个开放源代码的.基于 Java 的可扩展开发平台.2.下载地址为: https://www.eclipse.org/downloads/.3.Eclipse 修改字符集 : W ...
- 一起talk C栗子吧(第二十五回:C语言实例--二分查找)
各位看官们,大家好,上一回中咱们说的是顺序查找的样例,这一回咱们说的样例是:二分查找.闲话休 提,言归正转. 让我们一起talk C栗子吧. 看官们,我们在上一回中说了查找的相关内容,而且介绍了一种查 ...
- iOS-本地沙盒路径
沙盒几个路径: 沙盒里的文件夹包括Documents.Library.tmp.这三个文件夹的作用请点击这里.接下来我们来讲解如何获取Documents.Library.tmp的路径. 获取沙盒根目录 ...
- 66、多种多样的App主界面Tab(1)------ ViewPager实现Tab
<?xml version="1.0" encoding="utf-8"?> <!-- bottom.xml --> <Linea ...
- POJO应用框架:Spring与EJB3.0的比较
英文原文地址:http://www.onjava.com/pub/a/onjava/2005/06/29/spring-ejb3.html中文地址:http://www.matrix.org.cn/r ...
- less.js
在引入你自己的less文件的时候 <link rel="stylesheet/less" href="styles/site.less"> 之后再引 ...