笔者最近思考了自己参与的分布式系统业务的架构小细节,虽然笔者每天做的是实现部分需求与业务,但是笔者还是拥有很多时间去读底层源码的,加之笔者自身的思考与实践demo的总结,笔者将在本篇文章中提出笔者自己对“抽离”与“封装”思想的感悟,以及实际代码引发的思考过程,以供您的理解,如有不当之处,大可相互讨论,集思广益。

关于抽离与封装

以下内容是笔者的个人见解,并没有百度找寻资料进行印证,各位读者要怀着辩证的角度思考。

抽离思想是封装的前置,我们通常会在 当多个方法或者类都用到相同代码段或者实例对象时 将公用的重复段进行抽取,分离,封装成新的方法或者组件进行重复调用,达到解耦合,易维护,省资源的意图,但是我们通常也只具备将代码重复的段进行封装抽离的意识,下意识觉得这么做会使自己的代码变得简洁优雅。

笔者这里要告诉大家的是,真作为一个善于思考,致力于优雅编程的技术人员,我们不仅仅要将方法,实例中的重复代码拎出来封装,还要多观察,例如业务中重复的逻辑,运行过程中可以整合的机制,实体的同名字段等等。而封装思想更是造轮子时必不可少的意识之一,容器固然是给我们造轮子带来了巨大的帮助,但是当笔者阅读spring源码,捋顺容器加载过程中历经的流水线式操作,结合jvm虚拟机中类的加载机制,对象的实例化过程,笔者更加深刻的认识到,一个经得住考验的技术,势必是把代码做到了极度优雅的,举个例子,他们封装了一个个工厂,采用各种设计模式到容器中去实现生产,我们能在各种工厂的背影下总结出,好像各担其责,并没有繁复的判断逻辑。

设计模式也没有银弹,都是根据合适的场景去采用合适的设计模式,但是设计模式就默认实现了抽离与封装。

触发笔者写这篇文章的契机

笔者前段时间实现了一个基本没有冗余逻辑的平台,复现了笔者公司采用的部分架构细节,但是笔者发现基本每一个数据库表都能发现一些冗余字段,比如最后一次修改人,最后一次操作时间等记录性字段,当然记录性字段也有它存在的意义,比如数据错乱可以看到谁修改了,可以复现问题,便于修理bug,也可以追责。

那各位读者,我们假如使用mybatisPlus框架进行开发,现在给你商品实体与商品表,订单实体与订单表,两张表里都含有相同的字段updateLastTime(datetime)与updateLastPerson(varchar(32)),你该如何设计实体与表的映射关系呢?

传统的B站网课做法就不说了,mybatisX生成代码?@TableField与@TableId、@TableName注解建立映射?

这里笔者尝试使用抽离的思想实现:

1、将公共的字段抽离出来作为父类:

@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@Data
@SuperBuilder(toBuilder = true)
public class BaseModel {@TableField(value = "updateTime", fill = FieldFill.INSERT)@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime updateTime;@TableField(value = "updatePersonName")private String updatePersonName;
}

2、子类建立传统的实体字段映射:

@EqualsAndHashCode(callSuper = true)
@Getter
@Setter
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
@TableName("tb_products")
public class Product extends BaseModel {@TableId(value = "Id", type = IdType.AUTO)private Integer id;@TableField("productName")private String productName;@TableField("status")private Integer status;@TableField("price")private BigDecimal price;@TableField("productDesc")private String productDesc;@TableField("inventory")private int inventory;@Overridepublic String toString() {return "Product{" +"id=" + id +", productName='" + productName + '\'' +", status=" + status +", price=" + price +", productDesc='" + productDesc + '\'' +", inventory=" + inventory + '\'' +", updateTime='" + getUpdateTime() + '\'' +", updatePersonTime='" + getUpdatePersonName() + '\'' +'}';}
}

这里有经验的读者会感觉这不是很常见的吗?用lombok注解@SuperBuilder使子类可以直接解析父类的属性(注意子父类都需要打上注解@SuperBuilder且给toBulider值为true),那这里读者们注意没注意这么做就是抽离的一种实现呢?笔者只是因这里的抽离产生了思考,并不是上述代码多么的优雅。

对于上述代码,笔者需要补充的是@EqualsAndHashCode(callSuper = true)这个注解的作用,它其实是为了使得两个继承了同一个父类的子类实例对比时(属性值对比),子类的全部属性都一致,这时要求他俩比较继承父类时产生的HashCode值,以此来实现父类属性的比较。

用Maven实现独特抽离: 打出本地依赖jar包并导入

这里很多读者会觉得不是有远程maven仓库了吗?阿里云的仓库下载速度快,为什么要使用自己本地的jar包呢?

笔者提出一个实际需求:当我们想造轮子,抽离优质逻辑并在日后的项目中都用到呢?我们肯定不会一味的复制粘贴吧?这里何不尝试使用maven的install与远程deploy呢?本地仓库下载依赖包与远程仓库上传更新依赖包。

那么笔者这里就给读者做一个简单的spring boot demo打到仓库变成依赖并使用新的demo导入它的步骤分享:

1、去掉没有用处的文件(starter类,resourse包,test包等与抽离无关的都可以丢弃),注意我们打成jar依赖的demo是不能自己启动的(读者也可以带着启动类打成依赖,笔者见过启动依赖里的应用程序的个案):

2、点击maven的install进行编译打包并进入本地仓库:

在此之前你可以自定义一些配置,仓库位置,包名,全路径等于你建立项目时的组名:

你的依赖信息打成包之后在仓库的位置就是com下的hlc下的hlc-parent中:

3、去仓库查看这个文件:

4、直接导入就可以了:

那么看到这儿,又能有多少读者能实际在自己的造轮子之旅上用到呢?

笔者也是个笨蛋,一个不会哭的笨蛋,硬着头皮在繁华中游泳,被浪花洗涤,被美丽的鱼儿咬破皮,被巨大的礁石威吓,但是笔者不想上船,离开了海洋,笔者也就成为了不想成为的自己。

你具备抽离与封装的思想吗?相关推荐

  1. 用原生js封装的思想写一个购物车

    1 根据原型写出静态页面 <div class="car"><div class="left"> <ul><li cl ...

  2. java实现奥特曼打小怪兽,用封装的思想

    1.先创建一个奥特曼类 //设置奥特曼类 public class AutoMan {     //设置属性     private int blood;     private String nam ...

  3. 基于px2rpx-loader,探讨一下loader的封装思想

    本文以px2rpx-loader的源码为学习对象,了解其工作机制以及loader封装的思想. 1.前言 最近在了解mpvue框架的时候,对于其能够实现一套代码兼容web和微信小程序(以下简称小程序)的 ...

  4. 浅析jQuery原理并仿写封装一个自己的库

    [前言]最近项目忙的脚不沾地,刚刚结束,准备整理一下以前写的一些学习笔记和技术文章.本文原是很久之前看jq源码时写的片段,隔了很久再看都忘得差不多了.简单整理出来,做个记录. 作为一名前端工程师,jQ ...

  5. 杨校老师课堂之Java类与对象、封装、构造方法

    杨校老师课堂之Java类与对象.封装.构造方法 本篇文章内容如下: 面向对象 类与对象 三大特征--封装 构造方法 教学目标 能够理解面向对象的思想 能够明确类与对象关系 能够掌握类的定义格式 能够掌 ...

  6. 面向对象之三大特性:继承,封装,多态

    python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分 ...

  7. 面向对象学习笔记——封装、继承、多态

    文章目录 一.面向对象的编程 1.三大特征 2.五大原则(了解即可) 二.封装 三.继承 四.多态 1.先描述一下转型 2.接下来是抽象类 (abstract) 3.接口(interface) 一.面 ...

  8. Android拍照相册裁剪封装

    Android拍照相册裁剪封装 先列出来需要解决问题 展示效果 注意事项 代码 参考资料 最近用到从相机/相册选择图片的功能,这个功能虽然不复杂,网上的代码也一大堆,但是考虑到可能以后别的地方也会用到 ...

  9. Java编程思想日志

    Thinking In Java的作者是大牛!做事要站在巨人的肩膀上有助于提高效率和开阔眼界!建议学习java的小伙伴儿有时间可以抽空了解一下,以下内容为读书笔记,比较杂乱,仅供参考,推荐阅读原著: ...

最新文章

  1. PE文件结构及其加载机制(三)
  2. 2017-2018-1 《信息安全系统设计基础》实验三报告
  3. java 爬虫框架_不知道Python爬虫?这篇文章丢给他(内含框架结构)
  4. GDCM:ReadSelectedPrivateGroups的测试程序
  5. 50多种在Photoshop中删除图像背景的工具和技术,第3页
  6. 计算机考研文章精选[转载]
  7. JSP实例-定时刷新页面
  8. 自制胎教音乐---太阳当头照
  9. Java集合框架HashMap和ConcurrentHashMap实现分析
  10. URAL 1001 Reverse root
  11. opera官方教程 团队
  12. 瀚高数据库迁移工具常见问题
  13. 【自走棋】地图格子高亮效果
  14. ios html自动进入app,iOS 通过浏览器打开app
  15. 用循环模拟的简单文字拳皇对战
  16. Chrome+selenium+headless报错无法加载插件
  17. 你还不了解的OKRs-E是什么?
  18. git切换分支、push或pull指定分支
  19. 顺丰速运和顺丰快递_携手快递外卖小哥,石浦交警送上“安全大礼包”
  20. python鸢尾花分类_基于python的鸢尾花二分类

热门文章

  1. SMT Solver-Z3入手教程
  2. 【SEO优化】专业人员选择关键词的标准和原则
  3. mysql连接查询 内连接查询 外连接查询
  4. “中央处理器(CPU)”学习提纲
  5. AirPods 2/Pro 使用方法
  6. 【微信小程序】知乎小demo
  7. 第七篇:HTML文字与图片属性
  8. 按照规定尺寸裁剪图片
  9. JS的超干货笔记(第二弹)
  10. 高通最新处理器,骁龙855芯片参数介绍