- 博客(197)
- 资源 (6)
- 收藏
- 关注
原创 软件设计不是CRUD(14):低耦合模块设计理论——行为抽象与设计模式(上)
行为抽象,既是基于已提取的模块业务维度、模块分层和模型,明确模块中的各个数据变化场景的过程;也是为每个数据变化场景归纳涉及的业务维度,最终分析出控制逻辑,以及控制逻辑和业务逻辑的交互设计方案的过程。
2024-03-11 09:31:09 2038 1
原创 软件设计不是CRUD(13):低耦合模块设计理论——业务抽象:抽象模型的操作
进行模型抽象是基于业务抽象的设计思想,从原始需求到模块设计落地的第三个重要步骤。进行模型抽象的工作本质就是确认“怎样最小信息量模型就是可以定义业务的模型”,其工作目标是依据已经分析得到的模块业务维度和模块分层规划,确定业务维度应归属的业务主体,以及业务维度在业务主体的体现方式。
2024-02-22 15:19:37 892
原创 软件设计不是CRUD(12):低耦合模块设计理论——业务抽象:模块分层操作
对系统中的模块分层原则和分层规划方式进行了详细描述,并使用了一个仓储管理场景演示了如何进行模块分层规划。完成了模块分层规划后,我们就可以基于前期已经提取的业务维度,以及这个刚完成的模块分层规划,进行模型抽象工作和行为抽象工作了。实际上本文在讲解分层规划方式时,已经讲解了一些模型和行为的设计要点,例如讲解了业务主体、业务主体的关联信息以及业务主体和行为的对应方式。
2024-02-22 15:14:45 3312
原创 软件设计不是CRUD(11):低耦合模块设计理论——业务抽象:规划模块分层
确认模块分层,并不是直接将需求按照用户描述的业务调用关系进行上下层确认,而是依据抽取的业务维度的复杂程度、变化风险程度进行模块分层。为了尽可能减少需求变化给整个系统带来的设计变化风险,尽可能减少需求变化带来的涟漪效果,变化风险程度越高的模块应该越位于模块分层的更上层。那些没有业务性的工具类功能模块或者业务关联性很小的功能模块,应该越位于模块分层的更下层。进行模块分层设计时,应该保证所有模块的依赖关系都是单向的,杜绝循环依赖的出现。此外,还应该尽可能减少模块的间接依赖长度。
2024-01-30 15:43:44 10059
原创 软件设计不是CRUD(10):低耦合模块设计理论——业务抽象:从需求中提取业务维度
业务抽象是一种将需求落地成模块功能的设计思想,是对业务需求和技术设计进行转换、隔离的一种分析方法。经过业务抽象后的业务模块一般具有较高的业务屈服度,能更大程度满足模块设计中的基本原则要求。进行业务抽象设计有以下几个关键工作步骤:提取业务维度、确认模块分层、抽象模型、抽象行为
2024-01-14 10:10:55 1206
原创 Apache-Common-Pool2中对象池的使用方式
Apache Common-Pool2 组件最重要的功能,就是向开发人员提供一个稳定的、高性能的对象池。我们在实际开发过程中最常用、最典型的对象池就是数据库连接池。对象池可以在数据库连接对象被调用前,预先生成和管理一批可以使用的对象,用空间换时间的方式提升应用程序对数据库的操作性能。
2024-01-14 10:13:30 869
原创 软件设计不是CRUD(9):低耦合模块设计理论——设计落地所面临的挑战
系列文章试图将模块化设计从概念到落地进行体系化的讲解。本节开始我们首先介绍应用程序设计中的模块化概念,以及落地这个概念所需要面临的一些挑战。然后本系列文章将推导这些挑战、问题的解决办法,最后进行示例实战。
2023-12-25 10:31:17 7037 1
原创 软件设计不是CRUD(8):低耦合模块设计实战——组织机构模块(下)
上文中我们介绍了如何研发一个具有较低耦合强度的组织机构模块(包括模块的SDK和模块的默认本地数据库实现),接着我们就可以在一个应用程序中使用这个组织机构模块了。实际上应用程序研发团队不只是使用这个模块,研发团队还在应用程序开发时收到了客户方的新需求。
2023-12-13 20:25:15 177
原创 软件设计不是CRUD(7):低耦合模块设计实战——组织机构模块(中)
组织机构功能是应用系统中常见的业务功能之一,但是不同性质、不同行业背景、不同使用场景的应用系统对组织机构功能的要求可能完全不一样。所以使用这样的功能对低耦合模块设计进行示例性的讲解是比较具有代表性的。在后续的几篇文章中,我们会首先进行示例的详细讲解,然后再基于这个示例进行理论讲解。
2023-12-10 13:55:31 3936
原创 软件设计不是CRUD(6):低耦合模块设计实战——组织机构模块(上)
组织机构功能是应用系统中常见的业务功能之一,但是不同性质、不同行业背景、不同使用场景的应用系统对组织机构功能的要求可能完全不一样。所以使用这样的功能对低耦合模块设计进行示例性的讲解是比较具有代表性的。在后续的几篇文章中,我们会首先进行示例的详细讲解,然后再基于这个示例进行理论讲解。
2023-11-24 11:33:45 2600
原创 软件设计不是CRUD(5):耦合度的强弱(下)
在讨论如何稳定系统内各模块的分层设计前, 本文先介绍一下目前判断各模块间耦合度强弱的度量方式。这些度量方式,在实际工作中读者应该都涉及过,只是可能没有去做详细的划分归类。
2023-11-06 17:05:13 294
原创 软件设计不是CRUD(4):耦合度的强弱(上)
在讨论如何稳定系统内各模块的分层设计前, 本文先介绍一下目前判断各模块间耦合度强弱的度量方式。这些度量方式,在实际工作中读者应该都涉及过,只是可能没有去做详细的划分归类。
2023-11-06 17:01:22 466
原创 软件设计不是CRUD(3):降低模块间耦合性——设计实战
本系列文章专注于讨论在业务系统设计时,如何降低业务系统中各个模块的耦合度,已提供更好的业务扩展性。本系列文章还会具体演示设计模式如何被用于实际的业务模块设计过程中。(注意:本系列文章会假设读者已经知晓常用的设计模式,并已经有真实的业务系统开发经历)
2023-10-19 09:45:50 437 2
原创 软件设计不是CRUD(2):降低模块间耦合性——需求场景
本系列文章专注于讨论在业务系统设计时,如何降低业务系统中各个模块的耦合度,以提供更好的业务扩展性。本系列文章还会具体演示设计模式,特别是行为模式如何被用于实际的应用系统设计过程中。(注意:本系列文章会假设读者已经知晓常用的设计模式,并已经有真实的业务系统开发经历)
2023-10-19 09:41:23 592
原创 Spring/Boot/Cloud系列知识:SpringMVC进行HTTP信息接收和发送的过程(3)
本文承接上文继续介绍Spring MVC进行HTTP请求处理的第二大步骤。
2021-09-09 22:16:51 2381 5
原创 Spring/Boot/Cloud系列知识:SpringMVC进行HTTP信息接收和发送的过程(2)
上一篇文章本专题详细分析了可能产生这些问题的场景和细节,本篇文章开始本专题将详细介绍Spring MVC组件是如何解决这些问题的。
2021-08-24 19:44:00 2353 4
原创 Spring/Boot/Cloud系列知识:SpringMVC进行HTTP信息接收和发送的过程(1)
本文透过上文讲解的使用方式,重点介绍SpringMVC是如何将HTTP/HTTPS请求映射成SpringMVC Controller层的具体方法,并完成调用的(本文基于的Spring版本为5.1.X,不同的版本对于相关实现有细微差异)。
2021-08-12 22:00:48 2504 2
原创 Spring/Boot/Cloud系列知识:HttpMessageConverter转换器使用方式
在本专题之前介绍HTTP请求传参的时候,提到了关于参数值转换的主要控制接口HttpMessageConverter,并承诺在本专题的后续内容中对HttpMessageConverter接口和其实现进行详细讲解,本文就负责完成这个工作(后续本专题的内容还会讲解工作原理)。
2021-07-29 17:28:05 3883 3
原创 应用软件设计不是CRUD:如何进行应用系统功能模块的耦合性设计
应用软件开发,就是对数据库进行增删改查操作?软件架构选型,就是选择几款流行的中间件?软件架构设计,就是把几个中间件串在一起?如果真的这么认为,那么对软件设计可能还存在理解的深度。本篇文章从应用软件的模块设计层面讲述软件设计的真正要求。
2021-07-23 21:49:02 7520 18
原创 Spring/Boot/Cloud系列知识:SpringMVC 传参详解(下)
为了便于开发人员实现更好的抽象性也便于简化取值过程,SpringMVC提供了一种基于URL匹配符的参数传递方式,示例代码如下所示:
2021-07-13 21:05:30 7265 4
原创 Spring/Boot/Cloud系列知识:SpringMVC 传参详解(上)
本文所述内容适用于Spring Boot 2.1.5(Spring 5.1.7)及以上版本。1、页面参入传入的常见情况SpringMVC组件接收参数值的方式,根据HTTP/HTTPS请求信息格式的不同而不同。而HTTP/HTTPS请求通常的值传入方式包括以下几种(本文不涉及介绍HTTP协议的基本结构,并且会默认读者已知晓这些结构):1.1、通过URL结构的Query部分进行传递以下为URL的标准格式:protocol: // hostname [:port] / path / [;paramet
2021-07-08 11:27:39 2516 5
原创 Java我的2020年终盘点
这段时间一直在忙着工作上的事情和新书的筹备。但都2021年了,怎么都应该写一点,算不上总结回顾,只能算闲聊胡扯。2020年TIOBE’s对于各种编程语言排名情况的总结是:“Python is TIOBE’s Programming Language of 2020”。这无疑是对我自己这个写了20年Java程序的老屌丝相当有震撼力的一句话,曾几何时自己调侃delphi、调侃Ruby的样子和最近些年轮着自己被调侃的样子,是不是感觉是有些五味杂陈?Python的快速发展、Java的被赶超、Ruby的夕阳余晖有
2021-01-12 15:05:34 27856 55
原创 源码阅读(40):Java中线程安全的Queue、Deque结构——LinkedTransferQueue(3)
LinkedTransferQueue是从JDK 1.7+版本开始提供的一个无界阻塞式队列,它是Java容器框架中一种比较特殊的阻塞式队列,特殊性体现在它实现的TransferQueue接口。后者的特点是可定义一种数据对象消费者和生产者的配对交换方式,保证了生产者线程和消费者线程的配对处理(注意,不是数据配对而是线程配对),这样做的好处是,可以使用CAS原理进行LinkedTransferQueue队列集合的线程安全性控制,而不是使用AQS原理。
2020-06-16 22:27:09 2879 12
原创 源码阅读(39):Java中线程安全的Queue、Deque结构——LinkedTransferQueue(2)
LinkedTransferQueue是从JDK 1.7+版本开始提供的一个无界阻塞式队列,它是Java容器框架中一种比较特殊的阻塞式队列,特殊性体现在它实现的TransferQueue接口。后者的特点是可定义一种数据对象消费者和生产者的配对交换方式,保证了生产者线程和消费者线程的配对处理(注意,不是数据配对而是线程配对),这样做的好处是,可以使用CAS原理进行LinkedTransferQueue队列集合的线程安全性控制,而不是使用AQS原理。
2020-06-16 22:24:20 2316
原创 源码阅读(38):Java中线程安全的Queue、Deque结构——LinkedTransferQueue(1)
LinkedTransferQueue是从JDK 1.7+版本开始提供的一个无界阻塞式队列,它是Java容器框架中一种比较特殊的阻塞式队列,特殊性体现在它实现的TransferQueue接口。后者的特点是可定义一种数据对象消费者和生产者的配对交换方式,保证了生产者线程和消费者线程的配对处理(注意,不是数据配对而是线程配对),这样做的好处是,可以使用CAS原理进行LinkedTransferQueue队列集合的线程安全性控制,而不是使用AQS原理。
2020-06-16 22:20:18 2748 3
原创 源码阅读(37):Java中线程安全的Queue、Deque结构——PriorityBlockingQueue
PriorityBlockingQueue是一种无界阻塞队列,其内部核心结构和我们前文中已经介绍过的PriorityQueue队列集合类似,都是基于小顶堆树进行工作。本文不会赘述介绍PriorityQueue时已经详解过的内容,例如小顶堆树的工作原理等。本文将集中精力在几个PriorityBlockingQueue队列集合的核心方法的介绍上,这些方法都是,帮助PriorityBlockingQueue队列在多线程场景下正确工作的重要方法。
2020-05-31 17:53:12 2341
原创 源码阅读(36):Java中线程安全的Queue、Deque结构——LinkedBlockingQueue(2)
之前花了大量的篇幅介绍了一个Java中线程安全的Queue结构:ArrayBlockingQueue。主要是为了归纳分类这些线程安全性的Queue、Deque结构的设计共性。实际上ArrayBlockingQueue已经拥有了其它线程安全的Queue结构的大部分处理特点。基于介绍ArrayBlockingQueue时我们描述的这些设计共性,本系列开始为读者介绍另一个重要的阻塞性队列LinkedBlockingQueue。LinkedBlockingQueue是一种内部基于链表的,使用在高并发场景下的阻塞队列
2020-05-23 08:59:20 2210
原创 源码阅读(35):Java中线程安全的Queue、Deque结构——LinkedBlockingQueue(1)
之前花了大量的篇幅介绍了一个Java中线程安全的Queue结构:ArrayBlockingQueue。主要是为了归纳分类这些线程安全性的Queue、Deque结构的设计共性。实际上ArrayBlockingQueue已经拥有了其它线程安全的Queue结构的大部分处理特点。基于介绍ArrayBlockingQueue时我们描述的这些设计共性,本系列开始为读者介绍另一个重要的阻塞性队列LinkedBlockingQueue。LinkedBlockingQueue是一种内部基于链表的,使用在高并发场景下的阻塞队列
2020-05-23 08:58:10 2263 3
原创 源码阅读(34):Java中线程安全的Queue、Deque结构——ArrayBlockingQueue(4)
继续讲解ArrayBlockingQueue中的迭代器工作细节
2020-05-23 08:56:00 2137
原创 源码阅读(33):Java中线程安全的Queue、Deque结构——ArrayBlockingQueue(3)
一旦Itr迭代器完成初始化,就可以开始使用了。而使用迭代器最常见的方法就是使用hasNext()方法和next()方法进行配合。另外从JDK 1.8+开始,还可以使用Lambda表达式进行表达,最后ArrayBlockingQueue队列集合的迭代器还支持remove()方法的使用。
2020-04-30 20:33:38 1991
原创 源码阅读(32):Java中线程安全的Queue、Deque结构——ArrayBlockingQueue(2)
本篇内容我们专门分析ArrayBlockingQueue中迭代器的工作情况,ArrayBlockingQueue迭代器非常有阅读意义,是java集合框架中比较有代表性的结构之一。
2020-04-29 18:30:52 2153
原创 源码阅读(31):Java中线程安全的Queue、Deque结构——ArrayBlockingQueue(1)
ArrayBlockingQueue是一种经常使用的线程安全的Queue结构,它是一种内部基于数组的,使用在高并发场景下的阻塞队列,也是一种容量有界的队列。该队列符合先进先出(FIFO)的工作原则,也就是说该队列头部的元素是最先进入队列集合的,也是最先被调用者取出的元素;该队列尾部的元素是最后进入队列集合的,也是按时间顺序会最后被调用者取出的元素。
2020-04-09 21:46:52 2605
原创 源码阅读(30):Java中线程安全的Queue、Deque结构——概述(1)
如果要将java.util.concurrent工具包中的各种工具类进行详细的功能分类,那么在这个工具包中可以将“队列”性质的工具类专门作为一个独立的功能分类。为了适应高并发的程序工作场景,java.util.concurrent工具提供了丰富用于高并发场景的,线程安全的Queue/Deque结构集合
2020-03-31 17:03:23 3161 2
原创 源码阅读(29):Java中线程安全的List结构——CopyOnWriteArrayList(2)
从本文开始我们将介绍多线程(高并发)场景下的多种数据结构,这些数据结构基本来源于java.util.concurrent工具包。通过后续多篇文章的讲解我们将会发现,**高并发场景下的数据结构,其关注的最优先问题往往不是数据结构的整体性能,而是数据正确性和特定使用场景下的高性能**。
2020-03-25 20:54:45 2158 1
原创 源码阅读(28):Java中线程安全的List结构——CopyOnWriteArrayList(1)
从本文开始我们将介绍多线程(高并发)场景下的多种数据结构,这些数据结构基本来源于java.util.concurrent工具包。通过后续多篇文章的讲解我们将会发现,**高并发场景下的数据结构,其关注的最优先问题往往不是数据结构的整体性能,而是数据正确性和特定使用场景下的高性能**。
2020-03-23 21:33:15 2289 1
原创 源码阅读(27):Java中主要的Set结构——LinkedHashSet、TreeSet等结构
和HashSet类似,Java中另外两个主要的Set集合结构也做了这样依赖结构,既是LinkedHashSet集合继承了HashSet,并实际应用HashSet集合中构造函数,完成实例化;TreeSet集合内部结构依赖于TreeMap集合,也就是说TreeSet内部数据结构同样是红黑树。
2020-03-15 10:15:17 1851
原创 源码阅读(26):Java中主要的Set结构——HashSet
在全面理解了HashMap结构后,理解HashSet数据结构也就足够简单了——HashSet内部就是对HashMap数据结构的依赖。HashMap结构的Key就是HashSet存储的数据,HashMap结构的Value则是一个固定对象记为“PRESENT”:
2020-03-02 19:44:41 2087 1
原创 源码阅读(25):Java中主要的Set结构——概述
而我们在介绍Set集合前,先介绍Java中多个原生的Map容器,是因为Java中多个原生的Set集合都依赖于对应的Map容器进行实现。例如后文将要介绍的HashSet集合,其内部主要依赖于HashMap进行实现,前者的子类LinkedHashSet也是如此;
2020-01-11 18:56:03 3124 1
原创 源码阅读(24):Java中其它主要的Map结构——LinkedHashMap容器(下)
LinkedHashMap容器是Java容器框架中从很早的版本就开始提供的(JDK 1.4+),该容器又被这样认为:“LinkedHashMap = HashMap + LinkedList”。
2020-01-05 18:52:44 2508
原创 源码阅读(23):Java中其它主要的Map结构——LinkedHashMap容器(上)
LinkedHashMap容器是Java容器框架中从很早的版本就开始提供的(JDK 1.4+),该容器又被这样认为:“LinkedHashMap = HashMap + LinkedList”。
2019-12-19 21:55:12 2342
使用业务抽象思想设计的具有低耦合性的组织机构模块(示例)
2023-12-11
图片服务系统工程代码
2017-01-18
自己设计ESB组件的主要代码
2016-08-11
OASIS Advanced Message Queueing Protocol (AMQP) Version 1.0
2016-03-14
zookeeper + thrift实现的RPC 服务治理框架演示
2015-11-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人