
工作积累
文章平均质量分 83
记录一些工作中积累的内容
大·风
想起来什么就写点什么。
展开
-
聊一聊代码重构——封装集合和替换算法的代码实践
正常业务中,即使逻辑分支不同,但是其需要经历的流程大多是类似的,这个时候我们使用一些系列公共逻辑将其抽象。但是这些内容有可能并不是最好的方式,在原先的做法之外,可能存在更简单的解决方案,此时在重构代码时需要尝试对原来算法进行重构。很多时候我们封装了对象属性的访问,这能提供属性的安全性,但是对于集合,我们一般会将集合作为一个整体来控制。如果一个系统中是通过优惠标记来进行产品折扣的,那么这种固定产品ID进行折扣的方式,显然和产品正常涉及的逻辑不相符合。将正常的代码逻辑和特殊的代码逻辑隔离出来。原创 2023-03-12 20:30:27 · 671 阅读 · 1 评论 -
聊一聊代码重构——存在继承关系类上的代码实践
当一个子类继承了超类的很多方法,但是只使用其中的几个方法,而且这些方法并不是在子类中实现的,此时就可以考虑使用使用委托关系取代父类重构手法。如果一个字段或者方法在多个子类中使用,但是子类中它们所代表的含义和用法完全脱离的父类的约定,两者仅仅是使用相同的名称。需要注意的是将子类构造方法提升到父类后,这些构造方法会被所有子类使用,如果不仔细考虑代码中可能存在的细微差异,这个重构技巧可能会导致一些潜在的问题。需要注意的是,如果抽取到父类中的字段名称,和某些子类的变量重名时,要注意修改子类变量名,避免混淆。原创 2023-03-12 19:57:01 · 449 阅读 · 0 评论 -
聊一聊代码重构——程序方法和类上的代码实践
将存在的多个参数整合成一个对象进行传递,他带来的不仅仅是方法可读性的提高。更重要的一点是,构造方法的名称被严格限制,我们无法根据不同的构造方法来分析初始化的用途,但是使用工厂方法,我们可以通过参数名称、或者初始化方法的名称了解到对应方法解释初始化对象的用途。另外一种情况是,当一组方法使用相同的上下文的时候,我们可以为这些方法和上下文设置单独的类,将执行序列中的方法,作为类自身属性。并且需要修改的数据作为命令对象共享的字段,在不同处理方法中,不再需要设置繁琐的参数,所有的字段数据在调用方法后被实时更新。原创 2023-03-06 00:12:32 · 541 阅读 · 0 评论 -
聊一聊代码重构——程序方法上的代码实践
修改方法名称,一个好的方法名,让我们第一时间了解到方法的在业务中的作用,让我们更快的理解业务逻辑。而移除标记参数就是为了解决这些情况,将代码逻辑根据标记参数对分支的控制,创建对应的方法,每个方法执行对应逻辑分支内的逻辑,在传递标记参数的地方就直接调用对应的方法即可。当方法涉及的业务发生变化,内部逻辑出现调整的时候就需要考虑,方法名称是否可以被修改的前提,仔细了解方法内容,只有明白方法里面到底做了什么,才清楚方法的名称是否正常。在方法中不需要考虑标记方法的含义,因为方法中只存在单一场景的逻辑。原创 2023-03-05 21:54:55 · 539 阅读 · 0 评论 -
聊一聊代码重构——关于条件表达式的代码实践
和方法分解类似,如果有大的表达式,我们可以将其根据业务场景、数据模型等区分方式进行归类整理,类似的判断独立成一个方法,为其提供一个可以被理解的名称。一层一层嵌套的判断,加上复杂的逻辑,在看这些代码的时候只要分神,我们可能都无法确认当前逻辑存在的层级。很多时候即使将多个简单的表达式合并为一个复杂的表达式,最终的表达式依旧是个容易识别的表达式时,将他们合并起来是个好的方法。很多时候业务中的判断是分层的,我们需要判断上层内容然后再去进行下一层代码的判断,随着参数众多层级众多,我们的判断代码可能成为这个样子。原创 2023-03-05 00:04:30 · 495 阅读 · 0 评论 -
聊一聊代码重构——关于循环逻辑的代码实践
如果循环中的数据存在互相影响和依赖的情况,这会导致尝试理解循环中的代码所实现的目的变的更加困难。另外当多个业务共用一个循环时,如果不同的业务操作迭代范围不同,则需要在循环中添加各种不同的控制语句,会进一步降低代码的可读性。循环中存在另外一个问题就是多层循环,当多个循环在一起出现的时候,尝试阅读每层循环的逻辑会被其他循环所干扰,在理解当前循环内容时容易产生混淆。的核心是对数据的流式操作,它可以让我们通过流水线式的操作来处理数据,而不必编写冗长的循环和条件判断语句。是Java 8引入的一个强大的数据处理工具。原创 2023-03-04 23:48:29 · 675 阅读 · 0 评论 -
聊一聊代码重构——关于变量的代码实践
当一个表达式被赋值给一个变量后,在后续使用的时候,如果这段逻辑参与了后续的代码业务时,可以使用变量来替代,从而提高了代码复用程度。除了这种情况以外,有些时候变量完成初始化后,在后来的某处代码中会对变量再次进行了赋值,这种赋值有时候代表着变量的职责或者当时的数据状态发生了变化。虽然看起来变量增多了,但是在后续调用的时候可以清晰的理解,这两个变量内容是不一致的,而不至于调用的时候产生混乱。在上面例子中,除了可以将变量封装在对象中使用,部分基于变量的表达式,也可以作为对象自身的特性,作为对象的内部方法进行实现。原创 2023-03-04 23:35:11 · 709 阅读 · 0 评论 -
聊一聊代码重构——代码中究竟存在哪些坏代码
如果计划重构代码,那么首先要做的是发现坏的代码。坏的代码会导致可读性、可维护性都变的很差。原创 2023-03-03 23:46:17 · 604 阅读 · 0 评论 -
聊一聊代码重构——我们为什么要代码重构
简单谈一谈重构的内容原创 2023-03-03 23:35:04 · 917 阅读 · 0 评论 -
工作积累——JPA事务中数据更新后查询结果为旧数据的问题
工作积累——JPA事务中数据更新后查询结果为更新前的问题原创 2022-11-24 23:39:56 · 3332 阅读 · 0 评论 -
工作积累——几种常用的限流方式
目前主要使用的限流方式主要是:计数器、滑动窗口、漏桶和令牌桶限流。原创 2022-10-17 00:13:10 · 752 阅读 · 0 评论 -
配置NTP服务器进行时间同步
配置NTP服务器进行时间同步原创 2022-09-16 21:45:00 · 2977 阅读 · 0 评论 -
多个服务器之间免密登录
服务器直接使用ssh免密登录原创 2022-09-16 20:00:00 · 552 阅读 · 0 评论 -
工作积累——Web请求中使用ThreadLocal遇见的问题
Web请求中使用ThreadLocal遇见的问题原创 2022-06-23 22:00:30 · 664 阅读 · 0 评论 -
工作积累——stream().toMap 空指针异常解决问题时发现的小坑
引子今天测试环境一处代码使用toMap出现了空指针异常,看了下其实很多经常使用lambda表达式进行转换的开发大多遇见过这种问题,本来这个也没什么研究了,现成的解决方案,但是大概就是好久没写东西了,天天忙的焦头烂额的时候突然想写点啥,于是在看到所有文章给出了一个几乎一样的解决方案时,想看看源码是否有其他方案。问题问题很简单就是List转换为Map的时候空指针报错了。大概是一段这样的逻辑,使用toMap的三个参数:键映射、值映射、冲突解决逻辑 public static void m原创 2022-04-24 23:56:22 · 5803 阅读 · 0 评论 -
扩展JPA对数组字段的支持(postgresql数据库)
扩展JPA对postgresql数据库数组字段的支持postgresql虽然支持数组字段,但是Hibernate却不支持,这里需要特殊处理直接使用三方依赖直接引入Hibernate大佬Vlad Mihalcea自己写的开源库,轻松愉快引入依赖<dependency> <groupId>com.vladmihalcea</groupId> <artifactId>hibernate-types-52</artifactId&g原创 2021-05-30 15:01:16 · 3464 阅读 · 0 评论 -
JPA中使用自定义数据类型
JPA中使用自定义类型此内容代码并未完全贴出来,代码码云地址:https://gitee.com/daifylearn/postgresql使用Convert转换器hibernate提供了一个Convert注解,其配置在字段属性上,参数中可以指定一个类型转换器,通过此类型转换器实现JAVA数据存在到DB中以及DB中数据读取到JAVA的过程中的解析。@Convert 中需要指定一个转换器类,此类需要实现了@AttributeConverter接口示例针对实体类中某个参数是一个嵌套对象@Data原创 2021-05-30 15:01:02 · 2827 阅读 · 0 评论 -
日常工作——TransactionSynchronizationManager.registerSynchronization使用中事务传播产生的问题
主要是今天遇见使用TransactionSynchronizationManager出现的事务问题TransactionSynchronizationManager是一个事务管理的核心类,通过TransactionSynchronizationManager我们可以管理当前线程的事务。而很多时候我们使用这个类是为了方便我们在事务结束或者开始之前实现一些自己的逻辑。类似下面的逻辑我们希望在事务结束后再执行某些业务。所以可以使用TransactionSynchronizationManager.reg.原创 2021-01-05 23:51:31 · 19976 阅读 · 13 评论 -
ThreadPoolExecutor学习——线程池逻辑简单分析
ThreadPoolExecutor 一些操作的分析严格来说此内容并不是一个源码解读,只是在最近使用线程池的时候发现了一些之前认识误区的地方。和源码相比更关注一些方法使用的反馈,所以会显得比较简陋这里主要是介绍下面内容线程池使用哪个参数记录线程数和线程状态线程池状态以及互相装换线程创建的时机线程关闭的时机shutdown和shutdownNow的区别线程池使用哪个参数记录线程数和线程状态线程数的参数ThreadPoolExecutor要确定线程池中线程数需要三个参数privat原创 2020-11-22 00:45:01 · 514 阅读 · 0 评论 -
JAVA中如何处理金额类数据
由闲鱼的转账BUG引起的思考想写这一篇文章主要是前两天看到了一个闲鱼的BUG,而且自己也复现了这个问题。在使用闲鱼的时候当我向好友转账2.1的时候,最终支付宝显示的却只有2.09(前天出现的问题,目前闲鱼已经修复了这个问题)。作为一个消费者这只是一个BUG,但是作为一个JAVA开发,就让我思考到假如这个金额的数据是需要服务端进行处理?JAVA要如何处理这些数据。我的一分钱呢??????这从未设想的问题啊,所以这里就整理下对于服务端 的开发,对于金额的处理、储存和传输应该如何操作JAVA原创 2020-07-04 21:22:48 · 6916 阅读 · 0 评论 -
Mongodb——使用Mongodb对字段中字符串内容进行截取,并进行分组统计
最近忙的厉害,除了发一发之前写的存货只能写一些简单的东西了。这里就简单分享下最近遇见针对数据进行指标统计遇见的问题。针对字段中某部分内容的指标统计在使用mongodb进行指标统计的时候可能遇见下面的数据结构/* 1 */{ "_id" : ObjectId("5edf4b5c64574814bc8ae4ae"), "address" : "河南,信阳", "state" : 0, "remark" : "发送成功", "createAt" : Numbe.原创 2020-06-11 22:13:00 · 10745 阅读 · 3 评论 -
各大洲时区以及Linux环境下修改时区
时区整个地球被分为二十四时区,每个时区都有自己的本地时间。为了克服时间上的混乱,1884年在华盛顿召开的一次国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东、西各12个时区)。使用一个统一的时间, 称为通用协调时(UTC, Universal Time Coordinated)。UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地...原创 2019-12-09 21:03:55 · 11538 阅读 · 2 评论 -
Linux禁用内存交换
Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区。Swap分区在系统的物理内存(这里应该是运行内存)不够用的时候,把物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。查看swap的使用情况free ...原创 2019-11-24 20:53:16 · 7279 阅读 · 0 评论 -
JAVA学习——Buffer
Buffer定义Buffer 在java.nio包中实现,被定义成抽象类Buffer的实现类关系:创建Buffer创建Buffer的方法(以ByteBuffer为例)主要是allocate public static ByteBuffer allocate(int capacity) { if (capacity < ...原创 2019-03-01 14:50:57 · 318 阅读 · 0 评论 -
日常学习——记使用POI多线程写Excel数据(续)
前几天看到有人问到我之前写的一篇博客的中的内容:记使用POI多线程写Excel数据的过程和收获,存在部分疑问原本那边博客只是一时兴起写的东西,有头没尾,其实到最后只是知道错了,但是不知道哪里错了。两个月过去了,经过两个人硬刚了一大堆源代码后,看到有人问起以前的东西,突然想回过头看看能否有新的收获。问题首先还是之前的代码 public void setWorkbookData(XSS...原创 2019-05-28 00:13:46 · 2370 阅读 · 5 评论 -
工作笔记——JAVA:函数式接口学习(::语法、双冒号语法)
一个絮叨的工作笔记,不想看废话的直接从 自定义@FunctionalInterface 往下看吧起因最近在学习spring-boot源码的时候发现了一个特殊的语法。 private org.springframework.boot.web.servlet.ServletContextInitializer getSelfInitializer() { // 获得 Servlet...原创 2019-05-21 21:29:05 · 987 阅读 · 0 评论 -
日常学习(2019.03.22)——记使用POI多线程写Excel数据的过程和收获,存在部分疑问
周五的时候,同事突然问我有没有做过多线程写Excel的数据,看我一时没理解,同事说就是多线程往workbook中写数据。说起来Excel的操作之前做的很多了,但是重来没考虑过这么做,不过既然提起了,而且网上也有相关内容,何不自己尝试一下?于是自己便尝试用自己微薄的技术水平来实现下这个逻辑。首先考虑需要哪些东西:首先我们需要一个生成和处理数据的类:WriteDataUtils;pa...原创 2019-03-24 14:17:12 · 2905 阅读 · 6 评论