软件工程与计算总结(十三)详细设计中的模块化与信息隐藏

news2024/11/20 23:18:32

一.模块化与信息隐藏思想

1.设计质量

  • 好的设计要着重满足以下3方面:可管理性、灵活性、可理解性
  • 好的设计需要侧重于间接性和可观察性——简洁性使得系统模块易于管理(理解和分解)、开发(修改与调试)和复用。
  • 实践者都同意可理解、易修改和易复用是软件设计中比较常见和重要的质量标准~

软件的变更是不可避免的,复用则是人们在实践中提高软件生产效率最好的方式之一,因此我们在设计过程中不得不考虑以上提到的软件质量特性,以使我们的软件成为好的软件~

2.动机

模块化和信息隐藏就是为了实现上述重要的质量标准而提出的设计方法,因为他们所针对的是最为重要的软件设计标准,被视为软件设计的核心思想之一。

在分解独立模块的过程中,方法是衡量模块的内聚性和耦合性,希望分解建立高内聚、低耦合的模块~

3.发展

总的来说,模块化和信息隐藏的思想是顺着下面的路线前进的:

  • 从意识到要分解模块开始
  • 之后人们慢慢意识到要分解出高内聚和低耦合的模块,使得结构化方法慢慢盛行起来,后来意识到从数据的角度来分解实现数据的封装
  • 抽象数据类型提出之后,人们越来越意识到信息隐藏思路的重要性
  • 再加上继承、多态等思想,完善了类和对象的概念,逐步走向了面向对象方法的世界

二.模块化

1.分解与模块化

分解:将系统分为多个小模块,降低复杂度

模块:一个词汇上邻接的程序语言序列,由边界元素限制范围,有一个聚合标识符(通俗的说就是一个可通过名称调用的代码片段)

在结构化方法中,代码片段式程序设计语言中的函数、过程和模块;而在面向对象方法中,代码片段则是面向对象程序设计语言中的类、方法和模块——无论具体存在如何,模块化的原则是通用的——尤其是最重要的高内聚低耦合原则:模块内部又最大的关联,模块之间有最小的关联~

2.结构化设计中的耦合

模块之间的联系越多,联系的复杂程度越高,模块之间的关系就约为复杂。

耦合:描述两个模块关系之间的复杂程度——模块耦合性越高,模块的划分越差,越不利于软件的变更和复用~

  • 内聚耦合:最高级别的耦合,耦合性最强
  • 公共耦合:较弱于前者,但耦合性仍然很强
  • 重复耦合:非常隐蔽的耦合,往往不容易发现却危害甚大——同样的逻辑代码如果存在,在变更时就要同时修改多处
  • 控制耦合:一个模块明确控制着另一个模块的逻辑——难点是两个模块都是非独立的,他们都需要知道另一个的内部结构和逻辑
  • 印记耦合:如果把数据结构作为参数进行传输,被调用的模块只在该数据结构的个别组件上进行操作~(关键点在于共享的是数据结构)
  • 数据耦合:模块之间通过参数传递,只共享对方需要的数据

(前3种是必须消除的,数据耦合是最理想的,另外两个是可以接受的)

3.结构化设计中的内聚

内聚:表达的是一个模块内部的联系的紧密性。

内聚性越高越好,越低越不容易实现变更和复用

  • 偶然内聚:是指模块中执行的操作毫无关系,只是恰好堆砌在这个模块内。比如修车、烤蛋糕、遛狗、看电影放在一个模块内,没有任何联系。
  • 逻辑内聚:指的是模块执行一系列逻辑上相似但没有直接关联的操作。比如乘坐汽车、乘坐火车、乘坐轮船和乘坐飞机,它们都是交通方式这个系列的操作。
  • 时间类聚:也是模块中执行一系列操作,但是这些操作在同一时间段内发生。比如,我们睡觉前要把奶瓶放到门外、让猫出去溜达、关闭电视机和刷牙。这些都是在同一个时间段内完成,它们之间有时间相关性。
  • 过程内聚:是模块执行的多个操作,是解决同一个问题的不同步骤。比如保养车的过程依次为洗车、消除凹痕、打磨和上蜡。这些子过程之间是有顺序关系的。
  • 通信内聚则是模块内的操作都是针对同一数据进行的。比如查询书名、查询价格、查询出版社和查询作者。
  • 功能内聚:只执行一个单一目的的操作。比如计算平方根、计算最短路径或者压缩数据库。
  • 信息内聚:是模块内有一系列操作,每个操作都有各自的入口点和出口点,每个操作的代码相对独立,而且所有操作都是在相同的数据结构上完成,但是却形成一个抽象的整体。信息内聚的模块主要用来实现抽象的数据类型。

在上述各种内聚类型中,功能内聚和信息内聚是最好的两种,而且这两者的出发点不同,一个完全以功能(行为)为依据进行模块分解,一个以数据与功能间的相互支撑为依据进行模块分解,不可相互比较。一般而言,函数与过程应该是功能内的(信息内不适用于函数与过程),模块应该是信息内聚或功能内聚的,面向对象方法中的类应该是信息内聚与功能内聚兼顾的。

偶然内聚与逻辑内聚是不能接受的,如果软件中出现这两类内聚,一定要进行优化。

通信内聚、过程内聚、时间内聚这3种类型的内聚也是各自具有不同的出发点(一个是相同的数据;一个是相同的问题;一个是相同的时间),无法相互比较。这3种类型的内聚都是可以接受而且不可避免的。

三.信息隐藏

1.抽象信息与隐藏

  • 抽象的本质就是总结提炼本质特征,消除非本质的细节,从而使得人们可以聚焦在本质上,降低认知的复杂性~
  • 信息隐藏:本质上是利用了抽象的方法,抽象出每个类的关键细节,也就是模块的职责——什么是公开给其他人的,什么事隐藏在自己模块中的
  • 换句话说,抽象出来的就是接口,隐藏的就是实现,他们共同体现了模块的职责——体现了抽象可以让面向对象方法拥有更好的效率和更多的灵活性~
  • 核心设计思路:每个模块都隐藏一个重要的设计决策——对外表现为一份契约,并在这份契约之下隐藏着只有这个模块知道的设计决策或者秘密,决策实现的细节只有模块自己知道

2.信息与隐藏

模块的秘密:

  • 根据需求分配的职责
  • 内部实现机制

职责就是用一定的方式把模块的信息、秘密等隐藏起来~(隐藏独立变化的系统细节,分隔不一致变化的模块,只暴露出不容易变化的接口)

3.模块说明

即,用文档化的方式总结模块的设计决策,内容如下:

  • 主要秘密:实现的用户需求
  • 次要秘密:所设计的关键实现细节
  • 角色:角色、作用、关系
  • 对外接口:提供给别的模块

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

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

相关文章

基于适应度相关优化的BP神经网络(分类应用) - 附代码

基于适应度相关优化的BP神经网络(分类应用) - 附代码 文章目录 基于适应度相关优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.适应度相关优化BP神经网络3.1 BP神经网络参数设置3.2 适应度相关算法应用 4…

【软考】9.2 串/数组/矩阵/广义表/树

《字符串》 一种特殊的线性表,数据元素都为字符模式匹配:寻找子串第一次在主串出现的位置 模式匹配算法 1. 暴力破解法(布鲁特-福斯算法) 主串与子串一个个匹配效率低 2. KMP算法 主串后缀和子串前缀能否找到一样的元素&#xf…

轻量化Backbone | ShuffleNet+ViT结合让ViT也能有ShuffleNet轻量化的优秀能力

视觉Transformer(ViTs)在各种计算机视觉任务中表现出卓越的性能。然而,高计算复杂性阻碍了ViTs在内存和计算资源有限的设备上的适用性。尽管某些研究已经深入探讨了卷积层与自注意力机制的融合,以增强ViTs的效率,但在纯…

KOSMOS系列

Overview 总览摘要1 引言2 KOSMOS-2.52.1 Model Architecture2.1 Image and Text Representations2.3 Pre-training Data2.4 Data Processing2.5 Filtering and Quality Control 3 Experiments3.1 Evaluation3.2 Implementation Details3.3 Results3.4 Discussion 4 Related Wo…

车载多源融合定位

终端硬件由两部分组成,组合导航处理板和地磁导航处理板。 组合导航处理板负责采集加速度计、陀螺、GNSS和轮速计等数据进行组合导航解算,差分数据通过6Q主板获取到后通过串口发送至组合导航处理板。地磁导航处理板负责地磁数据采集,保存至数…

嵌入式实时操作系统的设计与开发 (启动过程学习)

b Reset; b Undef; b SWI; b PreAbort; b DataAbort; b . ;保留 b IRQ; b FIQ;建立异常向量表的过程,其中第一个指令通常都是存放在主存的零地址的。 异常向量表存放的全是汇编跳转指令,这些指令从主存的零地址(0x0)开始连续存储在…

Ubuntu下vscode dotNet downloading的问题(Cmake代码高亮)

问题描述:使用Cmake Language Support插件需要安装dotnet的支持库,我原本已经使用apt的方式安装了,但是进入vscode依旧要我下载。尝试按网上的方法修改为我指定的路径: "dotnetAcquisitionExtension.existingDotnetPath&quo…

Vsftp安装配置(超详细版)

目录 1 FTP、Vsftp介绍 1.1 FTP介绍 1.2 Vsftp介绍 1.3 Vsftp的登录类型 2 Vsftp安装配置 2.1 更换源 2.2 安装epel源 2.3 安装Vsftpd及相关依赖 2.4 vsftpd配置文件说明 2.5 vsftpd 配置详解 2.6 备份配置文件 3 vsftpd 配置匿名用户 3.1 编辑配置文件 3.2 常用的匿名FTP配置…

传输层 | UDP协议、TCP协议

之前讲过的http与https都是应用层协议,当应用层协议将报文构建好之后就要将报文往下层传输层进行传递,而传输层就是负责将数据能够从发送端传到接收端。 再谈端口号 端口号(port)标识了一个主机上进行通信的不同的应用程序,在TCP/IP协议中&…

让你的服务器变成游戏世界:打造游戏化在线社区的“秘诀”

引言 假如我有一台服务器,我希望打造一款游戏化的在线社区。那么,如何打造这样一个社区程序并成功运营呢?让我们一起来畅想吧! 一、确定社区的主题和目标群体 打造一款游戏化的在线社区,首先,我们需要明确…

【Android 性能优化:内存篇】——WebView 内存泄露治理

背景:笔者在公司项目中优化内存泄露时发现WebView 相关的内存泄露问题非常经典,一个 Fragment 页面使用的 WebView 有多条泄露路径,故记录下。 Fragment、Activity 使用WebView不释放 项目中一个Fragment 使用 Webview,在 Fragm…

区块链(12):java区块链项目之集群部署

选择3台服务器进行区块链项目部署 1 nginx部署页面 1.1 部署静态页面 1.2 nginx 反向代理的配置 修改nginx.conf文件 nginx 默认端口是http 80或者https443 将80代理到8080 location /blockchain {proxy_pass http://localhost:8080/blockchain;proxy_redirect default; …

深度学习-卷积神经网络

文章目录 应用卷积神经网络卷积处理分类问题 应用 图片分类图片检索图片分割图片风格迁移姿态估计OCR等 卷积神经网络 核概念计算机视觉中处理图片的核大小是通过经验得来的,而深度学习中的权重大小是自己学习出的。卷积VS神经网络:一个是局部观察一个…

进阶JAVA篇- LocalDate 类与 LocalTime 类、LocalDateTime 类的常用API(六)

目录 API 1.0 LocalDate 类与 LocalTime 类、LocalDateTime 类的API说明 1.1 如何创建LocalDate 类与 LocalTime 类、LocalDateTime 类的对象 1.2 LocalDate 类与 LocalTime 类、LocalDateTime 类中的以 get 开头实例方法 1.3 LocalDateTime 类中的 toLocalDat…

【Android】VirtualDisplay创建流程及原理

Android VirtualDisplay创建流程及原理 Android DisplayManager提供了createVirtualDisplay接口,用于创建虚拟屏。虚拟屏可用于录屏(网上很多资料说这个功能),分屏幕(比如一块很长的屏幕,通过虚拟屏分出不…

Windows服务器安装php+mysql环境的经验分享

php mysql环境 下载IIS Php Mysql环境集成包,集成包下载地址: 1、Windows Server 2008 一键安装Web环境包 x64 适用64位操作系统服务器:下载地址:链接: https://pan.baidu.com/s/1MMOOLGll4D7Eb5tBrdTQZw 提取码: btnx 2、Windows Server 2008 一键安装Web环境包 32 适…

【开篇】汇编语言之基础知识篇

文章目录 📋前言一. ⛳️机器语言二. ⛳️汇编语言的产生三. ⛳️汇编语言的组成四. ⛳️存储器五. ⛳️指令和数据六. ⛳️存储单元七. ⛳️CPU 对存储器的读写7.1 地址总线7.2 数据总线7.3 控制总线 📝总结 📋前言 🏠 个人主页&…

OOA/D 时统一过程(UP)中的 迭代、 进化 和 敏捷

一、迭代和进化式开发的优势 相对于顺序或“瀑布”软件开发模型,迭代和进化式开发(iterative and evolutionary development )对部分系统及早地引入了编程和测试,并重复这一循环。这种方式通常会还没有详细定义所有需求的情况下假…

阿里云易立:以云原生之力,实现大模型时代基础设施能力跃升 | KubeCon 主论坛分享

今天,由云原生计算基金会 CNCF 主办的 KubeConCloudNativeConOpenSourceSummit China 2023 主论坛在上海举办。阿里云容器服务负责人易立在主论坛发表演讲,介绍阿里云为大模型提供的基础设施能力,以及通过云原生 AI 的方式助力大模型普惠提效…

【Eclipse】设置自动提示

前言: eclipse默认有个快捷键:alt /就可以弹出自动提示,但是这样也太麻烦啦!每次都需要手动按这个快捷键,下面给大家介绍的是:如何设置敲的过程中就会出现自动提示的教程! 先按路线找到需要的页…