你具备抽离与封装的思想吗?

news2024/11/24 17:27:40

笔者最近思考了自己参与的分布式系统业务的架构小细节,虽然笔者每天做的是实现部分需求与业务,但是笔者还是拥有很多时间去读底层源码的,加之笔者自身的思考与实践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;

    @Override
    public 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、直接导入就可以了:

 

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/426182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx编译安装及配置文件详解

写在前面 Centos版本:Centos 7.6 - 64bit Nginx版本:1.20.2 一、什么是Nginx Nginx (engine x) 是一款轻量级的Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。 二、Nginx用在哪些地方 2.1 静态资源服务 动静…

mkv视频文件怎么转成mp4,这3个方法很好用

对于那些电脑不是很精通的小伙伴来说, mkv视频文件怎么转成mp4?小编先来介绍一下mkv视频格式,mkv是一种开放标准的自由的容器和文件格式,是一种多媒体封装格式,能够在一个文件中容纳无限数量的视频、音频、图片或字幕轨…

MVCC底层原理

目录说明MVCC的底层原理隐藏字段undo logRead View说明 在被面试官问面试题的时候,首先它问了Mysql的事务的隔离级别有几种?默认是哪种?他们分别解决了什么问题? 我在一顿回答“巴巴巴巴。。。。”之后,它又继续问题…

追踪项目进展常用的衡量方法

作为项目管理活动,项目中的进度跟踪可以帮助你了解项目实时的完成状态。有了正确的方法、项目管理工具和指标,项目跟踪可以指导你的团队的行动,甚至在问题出现之前向你发出预警。 项目经理使用各种方法、工具和指标来跟踪进度。其中最常见的…

自然语言处理(Natural Language Processing,NLP)简要

自然语言处理(Natural Language Processing,NLP)简要一、发展状况二、发展优势三、发展瓶颈四、具体研究方向五、自然语言处理工具六、未来发展方向自然语言处理(Natural Language Processing,NLP)是计算机…

(原创)Flutter基础入门:各种常用容器类组件

前言 上篇博客主要讲了Flutter的Shape实现 Flutter基础入门:实现各种Shape效果 今天主要讲下Flutter中常用的一些容器组件 Flutter中组件数量很多,分类方式也各有不同 比如可以分为有态组价和无态组件 又可以分为容器组件、功能组件等 拿功能组件来说 有…

docker网络详解,自定义docker网络

文章目录一、初识docker网络1、docker0虚拟网桥2、docker网络常用基本命令3、docker网络可以解决的问题二、docker网络模式1、四种网络模式2、容器实例内默认网络IP生产规则3、bridge模式4、host模式5、none模式6、container模式五、自定义网络模式1、过时的docker link2、使用…

【英语】大学英语CET考试,词汇语法导学方法论笔记(50h+)

文章目录1、谭剑波-词汇直播课1-2(词汇学习3个关键)1.1 看不懂句子的原因(词汇的重要性)1.2 记不住单词的原因(死记硬背70%)1.3 理解单词的本质(词根词缀,26字母,联想辅助…

D3D11和D3D12共享资源

最近碰到个伪需求: 游戏串流。 游戏引擎用D3D12渲染, 再把游戏画面做视频编码, 通过网络发送到远端做解码显示。 第一反应就是走全GPU的流程, 不要用CPU把显存里的数据拷来拷去。 所以先获取渲染完的D3D12的frame buffer, 然后送给…

进程管理 - 银行家算法

文章目录1 概述2 银行家算法2.1 原理2.2 例题1 概述 #mermaid-svg-7QKAqjQpckpStO9Q {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7QKAqjQpckpStO9Q .error-icon{fill:#552222;}#mermaid-svg-7QKAqjQpckpStO9Q .e…

android framework-PackageManagerService(PKMS)包管理服务

一、概述 Android系统启动过程中,会启动一个包管理服务PackageManagerService(PKMS),这个服务主要负责扫描系统中指定目录,找出里面以apk结尾的文件,通过对这些文件进行解析,得到应用程序的所有信息并完成应用程序的安…

算法学习day59

算法学习day591.力扣503.下一个更大元素II1.1 题目描述1.2 分析1.3代码2.力扣42. 接雨水2.1 题目描述2.2 分析2.3 代码3.参考资料1.力扣503.下一个更大元素II 1.1 题目描述 题目描述: 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素&a…

【大数据Hadoop】HDFS3.3.1-Namenode-租约管理

租约管理前言LeaseManager.LeaseLeaseManager添加租约 - addLease租约检查 - FsNamesystem.checkLease租约更新 - renewLease删除租约 - removeLease租约检查 - Monitor 线程租约恢复 - Monitor 线程发起租约恢复 - 其他方式发起前言 我们知道 HDFS 文件是 write-once-read-man…

CloudCompare插件开发之点云如何创建、保存并显示?

文章目录0.引言1.创建插件工程2.代码编写3.显示点云4.保存点云0.引言 CloudCompaer是一款优秀的开源软件,在点云处理时可以根据实际要求开发合适的插件,在实际使用中,创建点云、保存点云、显示点云的操作较为基础,为了使这些操作得…

施工组织设计合集

34-6 施工组织设计02017-年亲曼旗大镇市政道路及广场公园园林绿化工程(第一.A1-1五中教学楼施工组织设计A2施工组织设计(方案) 报审表hasuploaded-中建施|组织设计 (22P)安徽大包庄125万吨疏铁矿斜坡道施工组织设计 (修改)宝山万科四季花城施T组织设计 (126P)对税信息培训中心装…

软件测试,月薪还没过万的进来看

目录 前言 一、技能提升 二、多语言掌握 三、团队协作 四、持续学习 五、提高测试效率 六、质量保障 七、职业发展 八、总结 前言 在当今IT行业中,软件测试是一个不可或缺的环节。随着互联网和移动应用的发展,对软件质量的要求也越来越高。因此…

前后端分离架构

前后端分离架构介绍 前后端分离已成为互联网项目开发的业界标准使用方式,将前端和后端的开发进行解耦。并且前后端分离会为以后的大型分布式架构、微服务架构、多端化服务(各种客户端,比如浏览器、车载终端、安卓、IOS等)打下坚实…

[Netty] FastThreadLocal (十四)

文章目录1.FastThreadLocal介绍2.FastThreadLocal分析3.FastThreadLocal结构分析4.FastThreadLocal方法分析4.1 FastThreadLocal.get()4.2 FastThreadLocal.set()1.FastThreadLocal介绍 FastThreadLocal是Netty中常用的一个工具类, FastThreadLocal所使用的InternalThreadLoca…

[架构之路-159]-《软考-系统分析师》-10-系统分析-6-现有业务流程分析, 系统分析最核心的任务

目录 第 10章 现有系统 分 析 1 0 . 6 现有业务流程分析 10.6.1 业务流程分析槪述 1 . 业务流程分析的步骤 2 . 业务流程分析的方法 10.6.2 业务-流程图TFD 1. T F D 的基本符号 2. TFD的绘制 10.6.3 业务 - 活动图 10.6.4 业务流程建模BPM 1. B P M 概述 2 . 标杆…

Pytest自动化测试框架一些常见的插件

Pytest拥有丰富的插件架构,超过800个以上的外部插件和活跃的社区,在PyPI项目中以“ pytest- *”为标识。 本篇将列举github标星超过两百的一些插件进行实战演示。 插件库地址:http://plugincompat.herokuapp.com/ 1、pytest-html&#xff1…