软件设计不是CRUD(9):低耦合模块设计理论——设计落地所面临的挑战

应用程序的模块化设计是我们开始接触到应用程序设计时就立即会接触的概念。本系列文章试图将模块化设计从概念到落地进行体系化的讲解。本节开始我们首先介绍应用程序设计中的模块化概念,以及落地这个概念所需要面临的一些挑战。然后本系列文章将推导这些挑战、问题的解决办法,最后进行示例实战。当然最后示例实战的复杂度肯定比前置展示的组织机构模块示例的复杂度要高得多。

1、 应用程序模块化设计原则概要

模块是一组模型和行为的集合。 模型定义了模块的业务面,行为则驱动模块产生数据变化。

在这里插入图片描述
为了保证读者对后续内容的理解能够保持一致,本节内容试图拉平模块化设计的一些基本原则,包括:

  • 单一职责原则
  • 开闭原则
  • 依赖倒转原则
  • 接口隔离原则
  • 迪米特依赖原则

遵循这些原则进行模块设计的工作,我们最终将可以得到一个高内聚-低耦合的功能模块。换句话说这些原则都是为设计出高内聚-低耦合的功能模块而服务的。事实上要遵循这些模块设计原则是需要较高的设计能力——至少这些设计原则并没有从表面文字上看到的那么简单。

1.1、单一职责原则与确认模块边界的挑战

单一职责原则是指一个模块只负责一件明确的事情,并且负责做好这件事。例如组织机构模块只负责组织机构信息的维护,并不负责用户基本信息的维护。单一职责原则属于这几种设计原则中的前提性原则。用一个更好理解说法进行表述就是,模块功能的边界感
在这里插入图片描述
上图中表达了组织机构模块的边界感,在边界内的模型和行为属于组织机构模块的业务范围,在边界外的模型和行为不属于组织机构模型的业务范围。但真的能这么简单的理解吗?实际上有很多因素会影响模块确认“哪些模型和行为在边界内,哪些在边界外”。举个例子,我们多次讲到“组织机构模块只负责组织机构信息的维护,并不负责用户基本信息的维护”,那么维护用户和组织机构的关联信息,在不在组织机构模块边界范围内呢?

如果说属于,那么就意味着组织机构模块需要明确知晓系统中有哪些用户类型需要和组织机构信息进行关联,并且每新增一种新的用户类型或者每减少一种已有的用户类型,都需要对组织机构模块的业务逻辑进行修改;如果说不属于,那么组织机构没有这些关联信息,就无法再组织机构内构建完整的组织树结构。

在这里插入图片描述
再举一个例子,订单功能是应用系统中最常见的一种业务功能,其主要核心就是对订单进行创建、修改、状态维护;那么通知发货模块进行发货处理是否属于订单应该做的事情? 注意,这里说的通知发货而不是发货本身。

要知道通知发货一定是在订单信息满足某种条件后(例如订单金额己经支付,并且本地仓库存在库存),由订单进行触发的下一步业务过程。换句话说,在代码实现的时候就需要订单模块调用发货模块提供的功能;但是如果需求发生变化了呢?如果后续的需求要求订单不止要通知发货模块、还要通知到货模块、还要通知短信模块该怎么办?难道每次有新的模块需要进行通知都对订单模块的功能进行修改吗?现在读者感觉是不是哪里不对了,貌似通知某些后续的具体模块并不应该是订单模块的职责。
在这里插入图片描述

1.2、开闭原则与模块重用的挑战

开闭原则(Open-Closed Principle,OCP)是在说:模块内部的功能应该对扩展开放、对修改关闭(不允许修改)。这里所说的修改很容易理解,就是需求变化后使用修改代码的方式对现有业务逻辑进行调整,以便兼容原有业务逻辑和新的业务逻辑。但这里说的扩展包括的含义就比较多了,以下调整方式都属于扩展方式:

  • 新增:保留模块现有的代码,在模块内增加新的业务代码来满足新的需求。注意,这里说的新

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

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

相关文章

【GoLang】Go语言几种标准库介绍(一)

你见过哪些令你膛目结舌的代码技巧? 文章目录 你见过哪些令你膛目结舌的代码技巧?前言几种库bufio(带缓冲的 I/O 操作)特性示例 bytes (实现字节操作)特性示例 总结专栏集锦写在最后 前言 随着计算机科学的迅猛发展,编…

第十四章 集合(List)

一、集合框架体系 集合: (1)可以动态保存任意多个对象。 (2)提供了一系列方便的操作对象的方法:add、remove、set、get等。 二、Collection 1. Collection 接口常用方法 (1)add&a…

Pytorch,16个超强转换函数全总结!!

哈喽,这些天无论是社群还是私信,很多人希望看到更多关于深度学习基础内容,这篇文章想要分享的是关于pytorch的转换函数。 建议大家一定要好好看看这部分,在平常的使用中,既多又重要!! 当然在 P…

ros2 基础学习11-参数的定义及示例

话题、服务、动作,不知道这三种通信机制大家是否已经了解清楚,本节我们再来介绍一种ROS系统中常用的数据传输方式——参数。 类似C编程中的全局变量,可以便于在多个程序中共享某些数据,参数是ROS机器人系统中的全局字典&#xff…

小区物业大数据监控服务平台(PSD文件资料)

现分享简约物业大数据平台页面、小区物业大数据监控服务平台模版的UI源文件,供设计师们快速获取PS源文件完成工作。 若需 更多行业 相关的大屏,请移步小7的另一篇文章:200套精选数据可视化大屏,大屏PSD设计(各行业大屏…

孔夫子二手书采集

文章目录 项目演示软件采集单本数据网页搜索数据对比 使用场景概述部分核心逻辑Vb工程图数据导入与读取下拉框选择参数设置线程 使用方法下载软件授权导入文件预览处理后的数据 项目结构附件说明 项目演示 操作视频详见演示视频,以下为图文演示 软件采集单本数据 …

Hypothesis, 一个很少人会用的Python测试库

在软件开发中,测试是保证代码质量和功能正确性的重要环节。为了提高测试的覆盖率和效率,开发者们创造了许多测试框架和工具。其中 Hypothesis 是一个强大且受欢迎的 Python 测试库,它利用属性基测试的思想,可以自动生成测试数据并…

akka-Cluster在k8s部署

akka-Cluster:k8s部署 背景:在 Spring Boot 中整合akka集群。现在需要将其部署在k8s中。 以下仅是一个节点的配置过程。若存在多个节点,则需要配置多次。 假设当前项目为3个akka节点。则在kubernetes中结构为: 代码层面&#…

【python】Ubuntu下安装spyder及matplotlib中文显示

一、查看Ubuntu版本 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy尝试用cat /etc/debian_version命令,竟然可以显示出来Debian的版本。 $ cat /etc/debian_version …

fastadmin 跳转到输入的指定页面

fastadmin 跳转到输入的指定页面 实现效果&#xff1a; table.on(load-success.bs.table, function (e, tabledata) {var html<li class"jumpto"><input type"text" class"form-control"><button class"btn btn-default&q…

《LIO-SAM阅读笔记》1.IMU预积分模块

前言&#xff1a; LIO-SAM是一个多传感器融合的紧耦合SLAM框架&#xff0c;融合的传感器类型有雷达、IMU和GPS&#xff0c;其中雷达和IMU在LIO-SAM框架中必须使用的。LIO-SAM的优化策略采用了GTSAM库&#xff0c;GTSAM库采用了因子图的优化方法&#xff0c;其提供了一些列C的外…

SpringSecurity安全框架 ——认证与授权

目录 一、简介 1.1 什么是Spring Security 1.2 工作原理 1.3 为什么选择Spring Security 1.4 HttpSecurity 介绍&#x1f31f; 二、用户认证 2.1 导入依赖与配置 2.2 用户对象UserDetails 2.3 业务对象UserDetailsService 2.4 SecurityConfig配置 2.4.1 BCryptPasswo…