软件工程与计算总结(十三)详细设计中的模块化与信息隐藏
一.模块化与信息隐藏思想
1.设计质量
- 好的设计要着重满足以下3方面:可管理性、灵活性、可理解性
- 好的设计需要侧重于间接性和可观察性——简洁性使得系统模块易于管理(理解和分解)、开发(修改与调试)和复用。
- 实践者都同意可理解、易修改和易复用是软件设计中比较常见和重要的质量标准~
软件的变更是不可避免的,复用则是人们在实践中提高软件生产效率最好的方式之一,因此我们在设计过程中不得不考虑以上提到的软件质量特性,以使我们的软件成为好的软件~
2.动机
模块化和信息隐藏就是为了实现上述重要的质量标准而提出的设计方法,因为他们所针对的是最为重要的软件设计标准,被视为软件设计的核心思想之一。
在分解独立模块的过程中,方法是衡量模块的内聚性和耦合性,希望分解建立高内聚、低耦合的模块~
3.发展
总的来说,模块化和信息隐藏的思想是顺着下面的路线前进的:
- 从意识到要分解模块开始
- 之后人们慢慢意识到要分解出高内聚和低耦合的模块,使得结构化方法慢慢盛行起来,后来意识到从数据的角度来分解实现数据的封装
- 抽象数据类型提出之后,人们越来越意识到信息隐藏思路的重要性
- 再加上继承、多态等思想,完善了类和对象的概念,逐步走向了面向对象方法的世界
二.模块化
1.分解与模块化
分解:将系统分为多个小模块,降低复杂度
模块:一个词汇上邻接的程序语言序列,由边界元素限制范围,有一个聚合标识符(通俗的说就是一个可通过名称调用的代码片段)
在结构化方法中,代码片段式程序设计语言中的函数、过程和模块;而在面向对象方法中,代码片段则是面向对象程序设计语言中的类、方法和模块——无论具体存在如何,模块化的原则是通用的——尤其是最重要的高内聚低耦合原则:模块内部又最大的关联,模块之间有最小的关联~
2.结构化设计中的耦合
模块之间的联系越多,联系的复杂程度越高,模块之间的关系就约为复杂。
耦合:描述两个模块关系之间的复杂程度——模块耦合性越高,模块的划分越差,越不利于软件的变更和复用~
- 内聚耦合:最高级别的耦合,耦合性最强
- 公共耦合:较弱于前者,但耦合性仍然很强
- 重复耦合:非常隐蔽的耦合,往往不容易发现却危害甚大——同样的逻辑代码如果存在,在变更时就要同时修改多处
- 控制耦合:一个模块明确控制着另一个模块的逻辑——难点是两个模块都是非独立的,他们都需要知道另一个的内部结构和逻辑
- 印记耦合:如果把数据结构作为参数进行传输,被调用的模块只在该数据结构的个别组件上进行操作~(关键点在于共享的是数据结构)
- 数据耦合:模块之间通过参数传递,只共享对方需要的数据
(前3种是必须消除的,数据耦合是最理想的,另外两个是可以接受的)
3.结构化设计中的内聚
内聚:表达的是一个模块内部的联系的紧密性。
内聚性越高越好,越低越不容易实现变更和复用
- 偶然内聚:是指模块中执行的操作毫无关系,只是恰好堆砌在这个模块内。比如修车、烤蛋糕、遛狗、看电影放在一个模块内,没有任何联系。
- 逻辑内聚:指的是模块执行一系列逻辑上相似但没有直接关联的操作。比如乘坐汽车、乘坐火车、乘坐轮船和乘坐飞机,它们都是交通方式这个系列的操作。
- 时间类聚:也是模块中执行一系列操作,但是这些操作在同一时间段内发生。比如,我们睡觉前要把奶瓶放到门外、让猫出去溜达、关闭电视机和刷牙。这些都是在同一个时间段内完成,它们之间有时间相关性。
- 过程内聚:是模块执行的多个操作,是解决同一个问题的不同步骤。比如保养车的过程依次为洗车、消除凹痕、打磨和上蜡。这些子过程之间是有顺序关系的。
- 通信内聚则是模块内的操作都是针对同一数据进行的。比如查询书名、查询价格、查询出版社和查询作者。
- 功能内聚:只执行一个单一目的的操作。比如计算平方根、计算最短路径或者压缩数据库。
- 信息内聚:是模块内有一系列操作,每个操作都有各自的入口点和出口点,每个操作的代码相对独立,而且所有操作都是在相同的数据结构上完成,但是却形成一个抽象的整体。信息内聚的模块主要用来实现抽象的数据类型。
在上述各种内聚类型中,功能内聚和信息内聚是最好的两种,而且这两者的出发点不同,一个完全以功能(行为)为依据进行模块分解,一个以数据与功能间的相互支撑为依据进行模块分解,不可相互比较。一般而言,函数与过程应该是功能内的(信息内不适用于函数与过程),模块应该是信息内聚或功能内聚的,面向对象方法中的类应该是信息内聚与功能内聚兼顾的。
偶然内聚与逻辑内聚是不能接受的,如果软件中出现这两类内聚,一定要进行优化。
通信内聚、过程内聚、时间内聚这3种类型的内聚也是各自具有不同的出发点(一个是相同的数据;一个是相同的问题;一个是相同的时间),无法相互比较。这3种类型的内聚都是可以接受而且不可避免的。
三.信息隐藏
1.抽象信息与隐藏
- 抽象的本质就是总结提炼本质特征,消除非本质的细节,从而使得人们可以聚焦在本质上,降低认知的复杂性~
- 信息隐藏:本质上是利用了抽象的方法,抽象出每个类的关键细节,也就是模块的职责——什么是公开给其他人的,什么事隐藏在自己模块中的
- 换句话说,抽象出来的就是接口,隐藏的就是实现,他们共同体现了模块的职责——体现了抽象可以让面向对象方法拥有更好的效率和更多的灵活性~
- 核心设计思路:每个模块都隐藏一个重要的设计决策——对外表现为一份契约,并在这份契约之下隐藏着只有这个模块知道的设计决策或者秘密,决策实现的细节只有模块自己知道
2.信息与隐藏
模块的秘密:
- 根据需求分配的职责
- 内部实现机制
职责就是用一定的方式把模块的信息、秘密等隐藏起来~(隐藏独立变化的系统细节,分隔不一致变化的模块,只暴露出不容易变化的接口)
3.模块说明
即,用文档化的方式总结模块的设计决策,内容如下:
- 主要秘密:实现的用户需求
- 次要秘密:所设计的关键实现细节
- 角色:角色、作用、关系
- 对外接口:提供给别的模块
相关文章:
软件工程与计算总结(十三)详细设计中的模块化与信息隐藏
一.模块化与信息隐藏思想 1.设计质量 好的设计要着重满足以下3方面:可管理性、灵活性、可理解性好的设计需要侧重于间接性和可观察性——简洁性使得系统模块易于管理(理解和分解)、开发(修改与调试)和复用。实践者都…...
RF学习——器件的非线性失真分析
在大信号激励下的射频系统 在电路中,如果激励信号的幅度不可忽视,那么就会产生非线性失真。如二极管,晶体管等电路元件的特性在大信号激励下回变得非线性,输入和输出的形状不同,产生失真。 在功率放大器PA中,随着传输给负载的功率增大而迅速增大,传递功率的规格要始终考…...
SUB-1G SOC芯片DP4306F 32 位 ARM Cortex-M0+内核替代CMT2380F32
DP4306F是一款高性能低功耗的单片集成收发机,集成MO核MCU,工作频率可覆盖200MHiz^ 1000MHz。 支持230/408/433/470/868/915频段。该芯片集成了射频接收器、射频发射器、频率综合器、GFSK调制器、GFSK解调器等功能模块。通过SPI接口可以对输出功率、频道选…...
接收请求地址下载并输出文件流实现
代码: import httpxfrom datetime import datetime from io import BytesIO from fastapi.responses import StreamingResponse@router.get("/download", tags=["下载"]) async...
【iOS】——用单例类封装网络请求
文章目录 一、JSONModel1.JSONModel的简单介绍2.JSONModel的使用 二、单例类和Block传值 一、JSONModel 1.JSONModel的简单介绍 JSONModel一个第三方库,这个库用来将网络请求到的JSON格式的数据转化成Foundation框架下的Model类的属性,这样我们就可以直…...
再学Blazor——概述
简介 Blazor 是一种 .NET 前端 Web 框架,同时支持服务器端呈现和客户端交互性。 使用 C# 语言创建丰富的交互式 UI共享前后端应用逻辑可以生成混合桌面和移动应用受益于 .NET 的性能、可靠性和安全性需要有 HTML、CSS、JS 相关基础(开发 UI 框架的话&a…...
Ceph运维笔记
Ceph运维笔记 一、基本操作 ceph osd tree //查看所有osd情况 其中里面的weight就是CRUSH算法要使用的weight,越大代表之后PG选择该osd的概率就越大 ceph -s //查看整体ceph情况 health_ok才是正常的 ceph osd out osd.1 //将osd.1踢出集群 ceph osd i…...
RTSP协议
1 前言 RTSP协议作为音视频实时监控一个非常重要的协议,具有非常广泛的应用。RTSP由RFC 2326规范化,它允许客户端通过请求不同的媒体资源来控制流媒体服务器。RTSP是一种应用层协议,通常基于TCP连接,用于建立和控制媒体会话。这使…...
Maven系列第6篇:生命周期和插件详解?
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能。 这是maven系列第6篇。 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。 前面我们使用maven…...
【通义千问】大模型Qwen GitHub开源工程学习笔记(4)-- 模型的量化与离线部署
摘要: 量化方案基于AutoGPTQ,提供了Int4量化模型,其中包括Qwen-7B-Chat和Qwen-14B-Chat。更新承诺在模型评估效果几乎没有损失的情况下,降低存储要求并提高推理速度。量化是指将模型权重和激活的精度降低以节省存储空间并提高推理速度的过程。AutoGPTQ是一种专有量化工具。…...
2022最新版-李宏毅机器学习深度学习课程-P23 为什么用了验证集结果还是过拟合
用了验证集还有可能会过拟合 这个片段可以从理论上证明这一点 以上整个挑选模型的过程也可以想象为一种训练。 把三个模型导出的最小损失公式看成一个集合,现在要做的就是在这个集合中找到某个h(此处可以视为训练),使得在验证集…...
Spring Cloud Alibaba—Sentinel 控制台安装
1、Sentinel 控制台包含如下功能: 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。 监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最…...
基于动物迁徙优化的BP神经网络(分类应用) - 附代码
基于动物迁徙优化的BP神经网络(分类应用) - 附代码 文章目录 基于动物迁徙优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.动物迁徙优化BP神经网络3.1 BP神经网络参数设置3.2 动物迁徙算法应用 4.测试结果…...
一键搞定!黑群晖虚拟机+内网穿透实现校园公网访问攻略!
文章目录 前言本教程解决的问题是:按照本教程方法操作后,达到的效果是前排提醒: 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机:1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…...
【C语言】——通讯录(静态-动态增长-文件储存)
目录 前言: 一:整体框架 关于通讯录结构体的创建 二:通讯录的功能实现(静态) 2.1初始化通讯录 2.2增加联系人 2.3打印通讯录 2.4删除联系人 2.5 查找联系人 2.6修改联系人 2.7排序联系人 三:通…...
win10安装nginx及简单使用(命令)
下载 下载地址:http://nginx.org/en/download.html 使用 解压 更改配置 conf目录下nginx.conf 修改为未被占用的端口,地址改成你的地址 server {# 监听端口 listen 9010;# 地址 server_name 127.0.0.1;# 静态资源location / {root html;i…...
【农业生产系统模型】基于R语言APSIM模型进阶应用与参数优化、批量模拟实践技术
随着数字农业和智慧农业的发展,基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…...
金融数学方法:梯度下降法
1.算法介绍 梯度下降法是一种常用的优化算法,其通过沿着梯度下降的方向迭代寻找局部极小值。如果沿着梯度上升的方向迭代,就可以找到极大值。 在梯度下降法中,我们首先需要选择一个初始点 x 0 x_0 x0作为起始位置,然后计算当前位…...
1031 查验身份证
一.问题: 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4…...
如何共享 Android 不同模块的构建配置
最近想重新梳理学习一遍 Android 的各个知识点,于是新建了一个 AndroidStudy 项目仓库,打算每个知识块新建 1 个 module。 类似这样: AndroidStudy (Root Project) ├─app (Module0) ├─CustomView (Module1) ├─KotlinCoroutines (Modul…...
atlas运维中遇到的问题
1、java.lang.NoClassDefFoundError:javax/ws/rs/core/Link$Builder 主要原因:jsr311-api包中javax.ws.rs.core包中没有Link类,而Atlas以HBase作为元数据存储,HBase本身使用的为javax.ws.rs-api包中的core包,其中有Lin…...
06-React的路由
06-React的路由 1.相关理解 1).SPA的理解 单页Web应用(single page web application,SPA)。整个应用只有一个完整的页面。点击页面中的链接不会刷新页面,只会做页面的局部更新。数据都需要通过ajax请求获取, 并在前端异步展现。…...
虹科方案 | 加州理工学院利用HK-TrueNAS开展地震研究
一、客户背景 加州理工学院(CalTech)是世界顶尖的理工类科学研究型学府之一。加州理工学院地震实验室是加州理工学院地质与行星科学部(GPS)的一个分支机构,成立于1921年,自20年代以来一直是世界地震学研究中心,并且几十年来一直是媒体对大地…...
宝塔面板部署express以及MySql项目
第一次在宝塔面板上部署express和MySql项目,部署过程一直跑不通接口,特此记录一下。 在部署的时候,建议第一步把数据库MySql给跑通,中间好多原因是由于数据库的原因给引起的。 一.连接数据库 (1)在宝塔面…...
联盟链学习笔记-网络的创建
联盟链学习笔记 初始网络 下图是初始网络网络N的参考图 排序服务 在定义 网络 N 的时候,第一件事情就是定义一个 排序服务O4。O4 最初被配置并且由组织 R4 的一个管理员来启动,并且由 R4 管理。配置 NC4 包含了描述网络管理能力初始集合的规则。最初在…...
System.Drawing.Common.Bitmap跨平台的替代方案
使用SkiaSharp SkiaSharp是Skia Graphics Library的.Net跨平台实现,它可以在Windows,macOS,Linux,iOS,Android和其他平台上使用。 例如需要Linux版,则安装第一个和第四个: 以下是使用SkiaShar…...
深入理解 Java 泛型
没有泛型是怎样的 了解点 Java 历史的都知道,泛型是从 JDK 1.5 版本添加的特性,在 JDK1.5 之前,Java 很多特性都是没有的例如:泛型、注解、自动装箱和拆箱、可变参数。在介绍泛型之前,我们先来看看,如果没有泛型的世界是怎么样的。 假设有一个 List,我只想把 String 类…...
【基础篇】七、Flink核心概念
文章目录 1、并行度2、并行度的设置3、算子链4、禁用算子链5、任务槽6、任务槽和并行度的关系 1、并行度 要处理的数据量很多时,可以把一个算子的操作(比如前面demo里的flatMap、sum),"复制"多份到多个节点,…...
06-Scala面向对象
面向对象编程 Scala是一门完全面向对象的语言,摒弃了Java中很多不是面向对象的语法。 虽然如此,但其面向对象思想和 Java的面向对象思想还是一致的 Scala包 1)基本语法 Scala中基本的package包语法和 Java 完全一致 例如…...
【设计模式】单例模式、“多例模式”的实现以及对单例的一些思考
文章目录 1.概述2.单例模式实现代码2.1.饿汉式单例2.2.懒汉式单例2.3.双检锁单例2.4.静态内部类单例2.5.枚举单例 3.对单例的一些思考3.1.是否需要严格的禁止单例被破坏?3.2.懒汉式真的比饿汉式更佳吗?3.3.单例存在的问题 4.其他作用范围的单例模式4.1.线…...
济宁网站建设 果壳科技/seo优化工具
在说优化之前需要先GET到以下知识点,这样便于后续的分析。看完这篇文章不仅要会如何优化,还要搞懂为什么这样优化。半双工通信:MySQL的数据传输采用的是半双工通信,同一时间要么是客户端向服务端发送数据,要么是服务端…...
wordpress插件域名限制/企业网站如何优化
原文链接:Generative Learning Algorithm in Chinese最新的版本在原文链接里可以找到。原博客会不断更新。这篇笔记主要梳理了吴恩达教授在斯坦福的CS229课程的内容,并结合了哥伦比亚大学几个教授相关笔记内容一并总结。请注意: 本文是翻译的一份学习资料…...
wordpress 语言设置中文/郑州百度seo排名公司
我是一名即将毕业的计算机专业毕业生,大四的时候去一个软件公司实习(规模600人左右),做了一年的javaEE开发,实实在在地干活,也确实入了java的门,加上大学期间的学习,感觉对于java领域…...
做网站 域名如何要回/代运营哪家公司最靠谱
python导出pdf,参考诸多资料,发现pdfkit是效果比较好的。故下载后进行了实现,多次失败后终于成功了,现将其中经验总结如下: """ 需要安装pdfkit,另外需要安装可执行文件wkhtmltopdf.exe&a…...
中国诗歌网个人网页/东莞seo优化推广
由于注释表明您希望使用初始化程序和initargs参数传递featureVector.在Unix类型的系统上,这将导致大量的性能提升(即使selLabel中只有1个项目),因为该值将使用os.fork基本上免费传递给子进程.否则,每次调用foo时,featureVector都将被父进程pickle,通过管道传递并由子进程进行un…...
如何做网络网站推广/推广文案范例
最近一个项目要用到ActiveMq,并且需要最大程度的保证消息不丢失。以前对activeMq不是很熟悉,完全是摸着石头过河,目前基 本配置都搞定了。只是对于它的自动重连一直找不到好的解决办法,我希望的效果是当一个broker(假设…...