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

本文主要是介绍软件设计不是CRUD(18):像搭积木一样搭建应用系统(上)——单个应用系统的搭建过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、概述

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

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

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

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

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

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

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

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

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

2.1、正常的模块组合场景

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

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

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

这篇关于软件设计不是CRUD(18):像搭积木一样搭建应用系统(上)——单个应用系统的搭建过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907217

相关文章

JAVA SpringBoot集成Jasypt进行加密、解密的详细过程

《JAVASpringBoot集成Jasypt进行加密、解密的详细过程》文章详细介绍了如何在SpringBoot项目中集成Jasypt进行加密和解密,包括Jasypt简介、如何添加依赖、配置加密密钥... 目录Java (SpringBoot) 集成 Jasypt 进行加密、解密 - 详细教程一、Jasyp

Nginx内置变量应用场景分析

《Nginx内置变量应用场景分析》Nginx内置变量速查表,涵盖请求URI、客户端信息、服务器信息、文件路径、响应与性能等类别,这篇文章给大家介绍Nginx内置变量应用场景分析,感兴趣的朋友跟随小编一... 目录1. Nginx 内置变量速查表2. 核心变量详解与应用场景3. 实际应用举例4. 注意事项Ng

Java通过ServerSocket与Socket实现通信过程

《Java通过ServerSocket与Socket实现通信过程》本文介绍了Java中的ServerSocket和Socket类,详细讲解了它们的构造方法和使用场景,并通过一个简单的通信示例展示了如何... 目录1 ServerSocket2 Socket3 服务器端4 客户端5 运行结果6 设置超时总结1

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

MongoDB搭建过程及单机版部署方法

《MongoDB搭建过程及单机版部署方法》MongoDB是一个灵活、高性能的NoSQL数据库,特别适合快速开发和大规模分布式系统,本文给大家介绍MongoDB搭建过程及单机版部署方法,感兴趣的朋友跟随... 目录前言1️⃣ 核心特点1、文档存储2、无模式(Schema-less)3、高性能4、水平扩展(Sh

MySQL中存储过程(procedure)的使用及说明

《MySQL中存储过程(procedure)的使用及说明》存储过程是预先定义的SQL语句集合,可在数据库中重复调用,它们提供事务性、高效性和安全性,MySQL和Java中均可创建和调用存储过程,示例展... 目录概念示例1示例2总结概念存储过程:在数据库中预先定义好一组SQL语句,可以被程序反复调用。

MySQL存储过程实践(in、out、inout)

《MySQL存储过程实践(in、out、inout)》文章介绍了数据库中的存储过程,包括其定义、优缺点、性能调校与撰写,以及创建和调用方法,还详细说明了存储过程的参数类型,包括IN、OUT和INOUT... 目录简述存储过程存储过程的优缺点优点缺点存储过程的创建和调用mysql 存储过程中的关键语法案例存储

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多