往期热门文章:
1、是怎么样的SQL优化能做到 900W+数据,从17s到300ms?
2、再见 BeanUtils!对比 12 种 Bean 自动映射工具,就它性能最拉跨!
3、暴力拒绝白嫖,著名开源项目作者删库跑路,数千个应用程序无限输出乱码
4、两天两夜,1M图片优化到100kb!
5、12 个顶级 Bug 跟踪工具

一、前言

我们不一样,就你没对象! 对,你是面向过程编程的!

我说的,绝大多数码农没日没夜被需求憋着肝出来的代码,无论有多么的吭哧瘪肚,都不可能有重构,只有重新写。为什么?因为重新写所花的时间成本,远比重构一份已经烂成团的代码,要节省时间。但谁又不敢保证重写完的代码,就比之前能好多少,况且还要承担着重写后的代码事故风险和几乎体现不出来的业务价值

虽然代码是给机器运行的,但同样也是给人看的,并且随着每次需求的迭代、变更、升级,都需要研发人员对同一份代码进行多次开发和上线,那么这里就会涉及到可维护易扩展好交接的特点。

而那些不合理分层实现代码逻辑、不写代码注释、不按规范提交、不做格式化、命名随意甚至把 queryBatch 写成 queryBitch 的,都会造成后续代码没法重构的问题。那么接下来我们就分别介绍下,开发好能重构的代码,都要怎么干!

二、代码优化

1. 约定规范

# 提交:主要 type
feat:     增加新功能
fix:      修复bug# 提交:特殊 type
docs:     只改动了文档相关的内容
style:    不影响代码含义的改动,例如去掉空格、改变缩进、增删分号
build:    构造工具的或者外部依赖的改动,例如webpack,npm
refactor: 代码重构时使用
revert:   执行git revert打印的message# 提交:暂不使用type
test:     添加测试或者修改现有测试
perf:     提高性能的改动
ci:       与CI(持续集成服务)有关的改动
chore:    不修改src或者test的其余修改,例如构建过程或辅助工具的变动# 注释:类注释配置
/**
* @description:
* @author: ${USER}
* @date: ${DATE}
*/
  • 分支:开发前提前约定好拉分支的规范,比如日期_用户_用途,210905_xfg_updateRuleLogic

  • 提交作者,type: desc 如:小傅哥,fix:更新规则逻辑问题 参考Commit message 规范

  • 注释:包括类注释、方法注释、属性注释,在 IDEA 中可以设置类注释的头信息 Editor -> File and Code Templates -> File Header 推荐下载安装 IDEA P3C 插件 Alibaba Java Coding Guidelines,统一标准化编码方式。

2. 接口标准

在编写 RPC 接口的时候,返回的结果中一定要包含明确的Code码Info描述,否则使用方很难知道这个接口是否调用成功还是异常,以及是什么情况的异常。

定义 Result

public class Result implements java.io.Serializable {private static final long serialVersionUID = 752386055478765987L;/** 返回结果码 */private String code;/** 返回结果信息 */private String info;public Result() {}public Result(String code, String info) {this.code = code;this.info = info;}public static Result buildSuccessResult() {Result result = new Result();result.setCode(Constants.ResponseCode.SUCCESS.getCode());result.setInfo(Constants.ResponseCode.SUCCESS.getInfo());return result;}// ...get/set
}

返回结果包装:继承

public class RuleResult extends Result {private String ruleId;private String ruleDesc;public RuleResult(String code, String info) {super(code, info);}// ...get/set
}// 使用
public RuleResult execRule(DecisionMatter request) {return new RuleResult(Constants.ResponseCode.SUCCESS.getCode(), Constants.ResponseCode.SUCCESS.getInfo());
}

返回结果包装:泛型

public class ResultData<T> implements Serializable {private Result result;private T data;public ResultData(Result result, T data) {this.result = result;this.data = data;}   // ...get/set
}  // 使用
public ResultData<Rule> execRule(DecisionMatter request) {return new ResultData<Rule>(Result.buildSuccessResult(), new Rule());
}
  • 两种接口返回结果的包装定义,都可以规范返回结果。在这样的方式包装后,使用方就可以用统一的方式来判断Code码并做出相应的处理。

3. 库表设计

三范式:是数据库的规范化的内容,所谓的数据库三范式通俗的讲就是设计数据库表所应该遵守的一套规范,如果不遵守就会造成设计的数据库不规范,出现数据库字段冗余,数据的查询,插入等操作等问题。

数据库不仅仅只有三范式(1NF/2NF/3NF),还有BCNF、4NF、5NF…,不过在实际的数据库设计时,遵守前三个范式就足够了。再向下就会造成设计的数据库产生过多不必要的约束。

0NF

  • 第零范式是指没有使用任何范式,数据存放冗余大量表字段,而且这样的表结构非常难以维护。

1NF

  • 第一范式是在第零范式冗余字段上的改进,把重复字段抽离出来,设计成一个冗余数据较少便于存储和读取的表结构。

  • 同时在第一范式中也指出,表中的所有字段都应该是原子的、不可再分割的,例如:你不能把公司雇员表的部门名称和职责存放到一个字段。需要确保每列保持原子性

2NF

  • 满足1NF后,要求表中的列,都必须依赖主键,确保每个列都和主键列之间联系,而不能间接联系,也就是一个表只能描述一件事情。需要确保表中的每列都和主键相关。

3NF

  • 不能存在依赖关系,学号、姓名,到院系,院系到宿舍,需要确保每列都和主键列直接相关,而不是间接相关。

反三范式

三大范式是设计数据库表结构的规则约束,但是在实际开发中允许局部变通:

  1. 有时候为了便于查询,会在如订单表冗余上当时用户的快照信息,比如用户下单时候的一些设置信息。

  2. 单列列表数据汇总到总表中一个数量值,便于查询的时候可以避免列表汇总操作。

  3. 可以在设计表的时候冗余一些字段,避免因业务发展情况多变,考虑不周导致该表繁琐的问题。

4. 算法逻辑

通常在我们实际的业务功能逻辑开发中,为了能满足一些高并发的场景,是不可能对数据库表上锁扣减库存、也不能直接for循环大量轮训操作的,通常需要考虑

还重构?就这代码只能铲了重写!相关推荐

  1. 还重构?就你那代码只能铲了重写!

    作者:小傅哥 博客:https://bugstack.cn 一.前言 我们不一样,就你没对象! 对,你是面向过程编程的! 我说的,绝大多数码农没日没夜被需求憋着肝出来的代码,无论有多么的吭哧瘪肚,都不 ...

  2. 系统重构的原则代码重构的原则

    作者:[美]马丁•福勒(Martin Fowler) 译者:熊节, 林从羽 前一章所举的例子应该已经让你对重构有了一个良好的感觉.现在,我们应该回头看看重构的一些大原则. ##2.1 何谓重构 一线的 ...

  3. 如何重构“箭头型”代码

    本文主要起因是,一次在微博上和朋友关于嵌套好几层的if-else语句的代码重构的讨论(微博原文),在微博上大家有各式各样的问题和想法.按道理来说这些都是编程的基本功,似乎不太值得写一篇文章,不过我觉得 ...

  4. 手把手教你重构乱糟糟的代码

    来 源:www.jianshu.com/p/3f04b6aebad2 作者:小村医 重构不止是代码整理,它提供了一种高效且受控的代码整理技术. (一)重构原则 1.何谓重构 对软件内部结构的一种调整, ...

  5. 用VS.NET 2005重构你的代码

    引:作为程序员,我们都在编写各种各样的代码,然而有些程序员编写的代码则更为优秀些.差别是显然的.编写好的代码并不是所有的开发者都能够掌握的技巧.但是,这也意味着,这种技巧能够被改进.这种技能之一就包括 ...

  6. php代码重构,Shell在代码重构中的应用了解下

    代码重构(Code refactoring)有时是很枯燥的,字符串替换之类的操作不仅乏味,而且还容易出错,好在有一些工具可用,以PHP为例,如:Rephactor,Scisr等等,不过现成的工具往往意 ...

  7. 偿还技术债 - 通过重构拯救老代码

    偿还技术债 - 通过重构拯救老代码 尝试去接管一个陈旧的代码库使他成为达成一个可控的状态?这几年的大型的旧web应用程序开发给了我们如下这些建议. 通过重构去拯救旧代码 松鼠会因为忘记自己把松果放在那 ...

  8. 无码系列5.1 代码重构 消除重复代码

    1 前言 本文可以视为对ThoughtWorks高级顾问yuanyingjie关于"正交四原则"策略"消除重复"的"个人解读". 如有谬误, ...

  9. 程序员离职原因的最佳回答_员工离职了还将公司的代码盗走做开发!还挖走程序员!...

    原标题:员工离职了还将公司的代码盗走做开发!还挖走程序员! 换工作是我们经常都会遇到的事情,大家离职的原因是大小不一的,最近长胜看到了一则新闻就是跟这个离职的有关的,看完之后只能说这个离职的小伙伴是个 ...

最新文章

  1. 苹果2010新品发布会图文实录
  2. Ubuntu下 ssh : connect to host localhost port 22:Connection refused
  3. 坡道行驶电动小车_基于动力性指标的纯电动汽车电机参数设计
  4. 我如何在20小时内为AWS ML专业课程做好准备并进行破解
  5. [css] flex与其他有什么不同,用它有什么好处?
  6. 使用Spring Secuirty Oauth2实现SSO单点登录
  7. [转]英特尔为什么能在CPU方面领跑?
  8. 笨办法学Python,其实一点都不笨
  9. guice依赖注入_Guice依赖注入
  10. 黑马2021最新版 SpringCloud基础篇全技术栈导学(RabbitMQ+Docker+Redis+搜索+分布式)
  11. 直流电机驱动c语言程序,单片机PWM控制直流电机驱动程序+仿真+报告
  12. 有没有中文域名SSL证书?如何申请
  13. yolov5facce-landmarks(98点)
  14. RAM和ROM存储空间的混合
  15. python打包android的app,出现 Could not load the Qt platform plugin “xcb“的解决方法
  16. 亚古兽的进化之路——从Model_Builder,工具箱到python工具箱
  17. Linux驱动学习笔记之触摸屏驱动
  18. 李宏毅老师机器学习选择题解析
  19. java 不能反序列化_java – Hibernate:无法反序列化 – 无效的...
  20. NLP.TM[38] | 对话系统经典:检索式对话

热门文章

  1. 【北京迅为】i.MX6ULL终结者内核-Logo 修改使用文档生成 PPM 文件
  2. SIP DTMF telephone-event
  3. OneNote 2016无法登陆
  4. 分享13个自学编程的优质网站
  5. 软件进度管理的基本原则和进度安排
  6. 时间序列 :ARIMA模型-原理
  7. Python算法练习(五)// 算法:KMeans,数据集:标准普尔500指数
  8. Barracuda WSF v4.x - Bypass Persistent Vulnerabilities
  9. 给我讲解一下傅里叶变换与衍射的关系
  10. 坐标转换(空间直角坐标系与大地坐标系)