软件设计不是CRUD(18):像搭积木一样搭建应用系统(上)——单个应用系统的搭建过程

news2024/12/26 10:49:42

1、概述

之前的文章本专题花了大量文字篇幅,介绍如何基于业务抽象的设计方式完成应用系统各个功能模块的设计工作。而之所以进行这样的功能模块设计无非是希望这些功能模块在具体的项目实施过程中,能够按照当时的需求快速的、简易的、稳定的、最大可能节约开发成本的形成可用的应用系统。接着,如果有必要,这些系统能够在更高的构建层面,共同形成服务平台。那么从本篇文章开始,我们就来一起讨论一下,功能模块如何以“积木搭建”的方式形成符合特定需求的系统,以及这些系统在有必要的时候,如何形成服务平台的问题。

在各个模块都完成了低耦合设计后,诸如以下形式的模块分层结构就会形成:
在这里插入图片描述

有了这些模块,我们就可以在进行某个具体项目实施时,按照最终客户的要求将这些模块正式组合起来形成可运行的应用系统。或者这样形象的理解这项工作,我们将在一个“积木底座”上,利用已有的积木搭建一个最终用户需要的乐高造型。积木就是各个模块,积木底座就是承载模块组合的运行容器(在Java生态中,典型的模块运行容器就是Spring-Boot,其中每个具体的模块实现都体现为一个Starter)。在搭建过程中设计人员会遇到很多问题,例如:不需要一些模块怎么办?一些模块需要但是功能匹配度不够又该怎么办?一些模块需要,但其下依赖的模块不需要该怎么办?等等。我们将在本文中对这些问题进行逐一讨论。
图片来源于网络
(乐高积木搭建的城堡)

2、将各个模块组合起来形成应用系统

这里讨论进行模块组合的前提是:各个模块是基于业务抽象的思想进行设计的。根据之前几篇文章介绍的内容,这种模块至少具有以下的设计特点:

  • 经过业务抽象设计的模块,从设计层面就可以将抽象的模型、抽象的行为、业务无关的控制逻辑和具体的模型、具体的行为、具体的业务逻辑隔离开。

  • 经过业务抽象设计的模块,其业务分层的位置是固定的。无论什么样的业务场景,该模块都不能被下层模块“看到”,既然无法“看到”也就谈不上被下层模块依赖。而且某个模块即使被上层模块所依赖,上层模块也只能依赖该模块的抽象模型和抽象行为。

  • 经过业务抽象设计的模块,具有很小的涟漪效应,甚至没有涟漪效应。当模块发生变化时,这个变化产生的影响被限制在该模块内,不会向上层模块或者下层模块传递这种变化产生的影响;甚至这种变化对模块内部的影响也是有限的,当模块内部的某一种具体实现发生变化时,模块内部的其它具体实现也不会受到影响。

  • 经过业务抽象设计的模块,对下层模块的依赖是有限的,且依赖链较短。这主要得益于模块固定的业务分层和只能依赖下层模块抽象模型、抽象行为的设计规则。

2.1、正常的模块组合场景

下图是一个经过业务抽象设计后,进行设计落地的典型工程结构,参与“搭积木”过程的各个模块,都以这种方式被提供给搭建积木的设计者:
在这里插入图片描述
从图中可以看出一个典型的模块结构中,设计人员将已经完成设计的抽象模型、抽象行为和控制逻辑独立出来形成一个工程结构。然后设计人员将模块的某种具体实现形成另一个工程结构,例如将基于本地数据库的默认实现形成一个工程结构,取名为X-Default-Local-Starter;将基于远程调用的具体实现形成一个工程结构,取名为X-Remote-Starter。

将各个模块组合在一起的工具,叫做模块组合器/模块组合层/应用程序启动器。整个搭建过程应该是由下及上的,也就是先确认和搭建那些和业务无关的工具性质的模块,以及那些虽然有业务性但是业务比较通用,适配度较高的功能模块;然后再搭建那些涉及业务但定制化风险不大的功能模块,最后才是那些存在较大变化风险甚至产品级别没有提供,需要项目团队完全进行定制开发的功能模块。
在这里插入图片描述

由于产品团队提供的A模块具有较强的业务性,在特定的项目中并没有这样的业务,所以项目的技术团队没有选择A模块。另外产品研发团队提供的G模块,项目的技术团队也没有选用,这也是基于项目的实际情况进行的决定。但有的读者也许会问,G模块被D模块所依赖,既然D模块都被选择

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

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

相关文章

腾讯EdgeOne产品测评体验——开启安全防护,保障数据无忧

当今时代数字化经济蓬勃发展人们的生活逐渐便利,类似线上购物、线上娱乐、线上会议等数字化的服务如雨后春笋般在全国遍地生长,在人们享受这些服务的同时也面临着各式各样的挑战,如网络数据会不稳定、个人隐私容易暴露、资产信息会被攻击等。…

RabbitMQ消息模型之Direct消息模型

Direct消息模型 * 路由模型: * 一个交换机可以绑定多个队列 * 生产者给交换机发送消息时,需要指定消息的路由键 * 消费者绑定队列到交换机时,需要指定所需要消费的信息的路由键 * 交换机会根据消息的路由键将消息转发到对应的队…

C++vector类(个人笔记)

vector类 1.熟悉vector接口以及使用1.1vector的定义1.2vector迭代器使用1.3vector空间增长1.4vector增删查改1.5vector迭代器失效问题(重点) 2.vector的一些笔试题3.模拟实现vector 1.熟悉vector接口以及使用 vector的C官网文档 1.1vector的定义 (con…

基于Python的卷积网络的车牌识别系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

深入剖析Tomcat(二) 实现一个简单的Servlet容器

现在开始《深入剖析Tomcat》第二章的内容,第一章中,我们编码实现了一个能正常接收HTTP请求并返回静态资源的Web容器,这一章开始引入Servlet的概念,使我们的服务能根据请求动态返回内容。 Servlet是什么? 这是首先要弄…

FFmpeg: 自实现ijkplayer播放器--04消息队列设计

文章目录 播放器状态转换图播放器状态对应的消息: 消息对象消息队列消息队列api插入消息获取消息初始化消息插入消息加锁初始化消息设置消息参数消息队列初始化清空消息销毁消息启动消息队列终止消息队列删除消息 消息队列,用于发送,设置播放…

docker-compose yaml指定具体容器网桥ip网段subnet;docker创建即指定subnet;docker取消自启动

1、docker-compose yaml指定具体容器网桥ip网段subnet docker-compose 启动yaml有时可能的容器网段与宿主机的ip冲突导致宿主机上不了网,这时候可以更改yaml指定subnet 宿主机内网一般是192**,这时候容器可以指定172* version: 3.9 services:coredns:…

内网渗透-域环境的搭建

域环境的搭建 文章目录 域环境的搭建前言一、什么是域环境 什么是域内网基础知识点 二、域环境的搭建 1. 部署域结构2.如何加入域3.SRV出错及解决办法4.SRV记录注册不成功的可能原因 禁用域中的账户将计算机退出域添加域用户总结 前言 一、什么是域环境 什么是域 域是一种管…

盘点2024年最新可用免费云服务器

随着云计算技术的快速发展,越来越多的企业和个人开始使用云服务器来满足各种业务需求。云服务器作为云计算的核心服务之一,以其弹性扩展、按需付费等特点受到广泛关注。本文将为大家盘点2024年最新可用免费云服务器,助力大家轻松上云&#xf…

浏览器工作原理与实践--CSRF攻击:陌生链接不要随便点

在上一篇文章中我们讲到了XSS攻击,XSS 的攻击方式是黑客往用户的页面中注入恶意脚本,然后再通过恶意脚本将用户页面的数据上传到黑客的服务器上,最后黑客再利用这些数据进行一些恶意操作。XSS攻击能够带来很大的破坏性,不过另外一…

量子飞跃:从根本上改变复杂问题的解决方式

内容来源:量子前哨(ID:Qforepost) 编辑丨王珩 编译/排版丨沛贤 深度好文:1000字丨5分钟阅读 利用多功能量子比特的量子计算机已处于解决复杂优化问题的最前沿,例如旅行商问题,这是一个典型的…

Python实现时间序列ARIMA模型(附带超详细理论知识和完整代码实现)

文章目录 0 结果1 介绍2 建模2.1 预备知识2.1.1 ADF检验结果(单位根检验统计量)2.1.2 差分序列的白噪声检验(这里使用Ljung-Box检验)2.1.3 ARIMA模型(差分整合移动平均自回归模型)的三个参数:p,…

探索分布式技术--------------注册中心zookeeper

目录 一、ZooKeeper是什么 二、ZooKeeper的工作机制 三、ZooKeeper特点 四、ZooKeeper数据结构 五、ZooKeeper应用场景 5.1统一命名服务 5.2统一配置管理 5.3统一集群管理 5.4服务器动态上下线 5.5软负载均衡 六、ZooKeeper的选举机制 6.1第一次启动选举机制 6.2非…

家居网购项目(Ajax验证用户名+上传图片)

文章目录 1.Ajax验证用户名1.程序框架图2.修改MemberServlet3.修改login.jsp4.结果展示 2.Ajax判断验证码是否输入正确1.修改MemberServlet2.修改login.jsp3.结果展示 3.Ajax添加购物车1.程序框架图2.修改CartServlet2.修改index.jsp3.解决问题—未登录直接添加购物车&#xff…

Excel文件解析

在此模块的学习中,我们需要一个新的开源类库---Apahche POI开源类库。这个类库的用途是:解析并生成Excel文件(Word、ppt)。Apahche POI基于DOM方式进行解析,将文件直接加载到内存,所以速度比较快,适合Excel文件数据量不…

没有算法大佬,都是草台班子

没有算法大佬,都是草台班子。 最近除了工作之外,还有一些时间在和加我微信的小伙伴沟通,聊的内容大部分集中在如何快速有效的学习人工智能、入门人工智能的技巧。 其中,一个知乎过来加我微信的小伙伴的经历更是让我感触很深。 …

eclipse导入maven项目与配置使用本地仓库

前言 本人润国外了,发现不能用收费软件IDEA了,需要使用eclipse,这个免费。 但是早忘了怎么用了,在此总结下。 一、eclipse导入本地项目 1.选这个:open projects from file system… 2.找到项目文件夹,…

树莓派点亮双色LED

双色LED灯准确来说叫双基色LED灯,是指模块只能显示2种颜色,一般是红色和绿色,可以有三种状态 :灭,颜色1亮,颜色2亮,根据颜色组合的不同,分为红蓝双色,黄蓝双色,红绿双色等等。 接线:将引脚S(绿色)和中间引脚(红色)连接到Raspberry Pi的GPIO接口上,对Raspberry…

《QT实用小工具·二十六》运行时间记录

1、概述 源码放在文章末尾 运行时间记录,包含如下功能: 可以启动和停止服务,在需要的时候启动。 可以指定日志文件存放目录。 可以指定时间日志输出间隔。 可以单独追加一条记录到日志文件。 日志为文本格式,清晰明了。 软…

JavaScript排序大揭秘:手绘图解6大常见排序算法,一网打尽

前言 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步! 🍅 个人主页:南木元元 本文用图解总结梳理了6种常见的排序算法 ,如下👇&#xff1…