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

1、概述

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

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

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

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

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

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

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

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

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

2.1、正常的模块组合场景

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

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

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

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

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

相关文章

设计模式之观察者模式(上)

观察者模式 1)概述 1.定义 定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。 观察者模式的别名包括发布-订阅(Publish/Subscribe)模式、模型-视图&#…

PCB整理

1.加工工艺流程: 开料磨边 、烘板、内光成像、内层腐刻、内层AOI、内层黑化、层压、钻孔、沉铜加厚、外光成像、外层腐刻、外层AOI、印阻焊、阻焊成像、丝印字符、涂覆保护层、二次钻孔、外形加工、电测试、烘板包装。 2.层叠结构: 3.基材:覆…

开源模型应用落地-chatglm3-6b-gradio-入门篇(七)

一、前言 早前的文章,我们都是通过输入命令的方式来使用Chatglm3-6b模型。现在,我们可以通过使用gradio,通过一个界面与模型进行交互。这样做可以减少重复加载模型和修改代码的麻烦, 让我们更方便地体验模型的效果。 二、术语 2.…

2024蓝桥A组E题

成绩统计 问题描述格式输入格式输出样例输入样例输出评测用例规模与约定解析参考程序难度等级 问题描述 题目有问题方差定义那加平方(vi-v) 格式输入 输入的第一行包含三个正整数n,k,T ,相邻整数之间使用一个空格分隔。 第二行包含n个正整数…

Kubernetes(k8s)集群搭建部署,master节点配置

目录 1.切换为root用户 2.关闭防火墙,关闭swap分区和禁用SElinux 3.安装docker 4.更改daemon.json文件,指定 Docker 守护进程使用的 cgroup 驱动程序 5.重启docker服务 6.配置kubernetes.repo 7.安装Kubelet、Kubeadm、Kubectl 8.设置开机自启 …

【数据结构|C语言版】单链表应用

前言1. 基于单链表实现通讯录1.1 知识要求1.2 功能要求 2. 代码总结2.1 SeqList.h2.2 SeqList.c2.3 Contact.h2.4 Contact.c2.5 test.c 后言 上期回顾:【数据结构|C语言版】单链表 前言 各位小伙伴大家好!上期小编讲解了单链表相关知识,在此…

【Go】原子并发操作

目录 一、基本概念 支持的数据类型 主要函数 使用场景 二、基础代码实例 开协程给原子变量做加法 统计多个变量 原子标志判断 三、并发日志记录器 四、并发计数器与性能监控 五、优雅的停止并发任务 worker函数 Main函数 应用价值 Go语言中,原子并发操…

【Linux】Linux基础与常用指令大全

文章目录 操作系统是什么?1. Linux家族介绍2. Linux的安装方式3. 常用指令3.1 ls [选项] [目录/文件](显示目录或文件信息)3.2 pwd(显示当前所在目录)3.3 任意指令加上 --help(查看指令的用法)3…

ThinkPHP V5.1框架源码

源码下载地址:ThinkPHP V5.1.zip www WEB部署目录(或者子目录) ├─application 应用目录 │ ├─common 公共模块目录(可以更改) │ ├─module_name 模块目录 │ │ ├─common.php 模块函数文件 │ │ ├─controll…

一文掌握 React 开发中的 JavaScript 基础知识

前端开发中JavaScript是基石。在 React 开发中掌握掌握基础的 JavaScript 方法将有助于编写出更加高效、可维护的 React 应用程序。 在 React 开发中使用 ES6 语法可以带来更简洁、可读性更强、功能更丰富,以及更好性能和社区支持等诸多好处。这有助于提高开发效率,并构建出更…

线性表概念及顺序表的实现

文章目录 前言一、线性表1.定义2.特点3.一般线性表的抽象数据类型定义 二、线性表的顺序存储(顺序表)1.基本概念2.数组实现顺序表3.顺序表中基本操作的具体实现4.顺序表总结 总结 前言 T_T此专栏用于记录数据结构及算法的(痛苦)学…

MyBatis 源码分析系列文章导读

1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章。本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说明和演…

记一次对某高校微信小程序的漏洞挖掘

挖掘目标的部署在微信的资产(减少信息的收集,毕竟一般web站点没有账号密码不好进入后台,挖掘功能点少) 寻找目标的微信小程序(非原图) 招生小程序打不开,只能挖掘管理系统 进入后发现存在上报安全隐患功能,可以上传图片 准备上传…

【面经】操作系统/Linux

1、计算机的五大单元 电脑的五大单元包括:输入单元、输出单元、控制单元、算数逻辑单元、存储单元五大部分。其中CPU占有控制、算术逻辑单元,存储单元又包含内存与辅助内存; 2、什么是操作系统 操作系统:负责管理协调我们计算机…

Qt QStyle详解

1.简介 QStyle类是 Qt 框架中用于控制应用程序界面元素外观的一个抽象基类。这个类提供了一种方式来定制窗口部件(widgets)的绘制和行为,可以通过改变主题或风格来更改应用程序的外观,而无需修改窗口部件本身的代码。 Qt包含一组…

python爬虫------- Selenium下篇(二十三天)

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…

CAN帧中的ACK位

1:先看官方文档对ACK的解释 All nodes that have received the matching CRC sequence (and, in FD Frames the matching stuff count) shall send an ACK within the ACK slot by overwriting the recessive bit of the transmitter by a dominant bit (they send…

求圆、圆球和圆柱的面积和体积(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> //定义π常量的值&#xff1b; # define π 3.141526int main() {//初始化变量值&#xff1b;float r, h, S1, S2, P1, V1, V2;int judge 0;//提示用户&#x…

Python基于flask的豆瓣电影分析可视化系统

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

mid_360建图和定位

录制数据 roslaunch livox_ros_driver2 msg_MID360.launch使用fast-lio 建图 https://github.com/hku-mars/FAST_LIO.git 建图效果 使用python做显示 https://gitee.com/linjiey11/mid360/blob/master/show_pcd.py 使用 point_lio建图 https://github.com/hku-mars/Point…