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

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

1.设计质量

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

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

2.动机

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

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

3.发展

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

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

二.模块化

1.分解与模块化

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

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

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

2.结构化设计中的耦合

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

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

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

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

3.结构化设计中的内聚

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

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

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

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

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

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

三.信息隐藏

1.抽象信息与隐藏

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

2.信息与隐藏

模块的秘密:

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

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

3.模块说明

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

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

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

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

相关文章

BI零售数据分析:以自身视角展开分析

随着零售业务不断扩展,市场竞争不断加剧,各层级的销售管理人员都急需一张能快速查看销售数据分析报表,能从中知道自己管辖内的业务最近或过去的情况,并依次为依据科学优化销售管理措施。这就要求零售数据分析报表信息足够多、数据…

Mac硬盘检测工具

Mac硬盘检测软件是一款用于检测和诊断Mac硬盘健康状态的工具,帮助用户及时发现潜在的硬盘问题,避免数据丢失和系统故障。通过全面的检测和报告功能,用户可以更好地了解自己的硬盘状况,确保数据的安全和可靠。给大家介绍几款好用的…

PhotoShop批量压缩图片

打开photoshop,在顶部的菜单栏选择文件》脚本》图像处理器。 选择合适的参数,运行即可。

postman请求400错误-日期LocalData

错误日志参考 [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type java.lang.String to required type java.time.LocalDate; neste…

电脑D盘文件凭空消失了?切记3招,轻松恢复文件!

“由于我c盘内存不够了,我就将部分重要的文件保存到了d盘,今天打开d盘后才发现我这些文件凭空消失了。这究竟是什么呀?还有机会找回这些消失的d盘文件吗?” D盘作为电脑中一个重要的磁盘,很多电脑用户也会选择将文件保…

6.(vue3.x+vite)路由传参query与params区别

前端技术社区总目录(订阅之前请先查看该博客) 效果截图 一:路由传参有两种方式:params与query params与query区别 1:param,路由带“/”,query带“?” 2:query传过来的参数会显示到地址栏中 而params传过来的参数可以显示参数或隐藏参数到地址栏中(vue-router 4.1.4不…

Flutter笔记:发布一个电商中文货币显示插件Money Display

Flutter笔记 电商中文货币显示插件 Money Display 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/1338…

【性能测试】使用JMeter对code论坛进行压力测试

1.项目介绍 项目简介 code 论坛是一个技术交流社区。主要功能有发布帖子,查看帖子,评价帖子,删除帖子,点赞帖子,站内信,个人中心,修改个人信息等。是一个基于 Spring 的前后端分离项目。 项目链…

分享一下微信小程序怎么添加成绩查询插件

微信小程序如何添加成绩查询插件 一、引言 微信小程序是一种方便快捷的应用程序,可以在微信中使用。随着教育的不断发展,学校和家长对于学生的成绩查询需求也越来越高。通过在微信小程序中添加成绩查询插件,可以为学生和家长提供更加便捷的…

微信小程序获取手机号(2023年10月 python版)[无需订阅]

技术栈: 1. 微信开发者工具中的调试基础库版本:3.1.2。 2. 后台:django。 步骤: 1. 首先在后台django项目的定时任务中增加一个下载access_token函数,并把得到的access_token保存在数据库中(其实随便哪里…

正向代理——流量代理

文章目录 流量代理1. 正向代理2. 反向代理3. 流量转发工具4. 实验4.1 实验环境4.2 reGeorg工具 流量代理 1. 正向代理 正向代理是客户端和其他所有服务器(重点:所有)的代理者 2. 反向代理 反向代理是客户端和所要代理的服务器之间的代理。…

嵌入式和 Java选哪个?

今日话题,嵌入式和 Java 走哪个?对于嵌入式领域有浓厚兴趣的人,并不会比Java行业薪资低,处于上中游水平。特别是从2020年开始,嵌入式领域受益于芯片产业的兴起,表现出了强劲的增长势头。薪资水平受多方面因素影响。以…

7款最佳的图片编辑App

无论你是设计师需要调整界面图片大小,还是摄影师需要剪图片,追求完美的比例,还是日常照片,需要P图片,或多或少会有剪图片的需求,如何选择一个简单和轻的剪图软件应用程序,不是一件容易的事情。本…

【Hello Algorithm】暴力递归到动态规划(三)

暴力递归到动态规划(三) 最长公共子序列递归版本动态规划 最长回文串子序列方法一方法二递归版本动态规划 象棋问题递归版本动态规划 咖啡机问题递归版本动态规划 最长公共子序列 这是leetcode上的一道原题 题目连接如下 最长公共子序列 题目描述如下…

kafka安装和使用的入门教程

这篇文章简单介绍如何在ubuntu上安装kafka,并使用kafka完成消息的发送和接收。 一、安装kafka 访问kafka官网Apache Kafka,然后点击快速开始 紧接着,点击Download 最后点击下载链接下载安装包 如果下载缓慢,博主已经把安装包上传…

旧手机热点机改造成服务器方案

如果你也跟我一样有这种想法, 那真的太酷了!!! ok,前提是得有root,不然体验大打折扣 目录 目录 1.做一个能爬墙能走百度直连的热点机(做热点机用) 2.做emby视频服务器 3.做文件服务, 存取文件 4.装青龙面板,跑一些定时任务 5.做远程摄像头监控 6.做web服务器 7.内网穿…

基于springboot的高校科研管理系统(源码+调试+LW)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据你想解决的问题,今天给…

2023年全网最新 Windows10 搭建 Python 环境教程

目录 一、查看计算机操作系统的位数二、安装Python2.1 下载Python安装包2.2 在Windows 64位系统中安装Python2.3 测试Python是否安装成功 三、Windows环境下安装第2个Python(不同版本) ----不需要安装多个Python版本的读者此小节可以忽略 一、查看计算机操作系统的位数 目前&a…

手机通过WiFi连接调试UR机器人

1.测试物料 1.1ur机器人 https://item.taobao.com/item.htm?spma1z10.1-c.w4004-25069442759.18.2ff56d6bmuxX0Z&id740002623764 1.2 路由器(TPLINK) https://detail.tmall.com/item.htm?abbucket7&id548610924784&ns1&spma21n57.1.…

基于Java的留学生交流互动论坛系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…