软件工程与计算(十四)详细设计中面向对象方法下的模块化

一.面向对象中的模块
1.类
模块化是消除软件复杂度的一个重要方法,每个代码片段相互独立,这样能够提高可维护性。在面向对象方法中,代码片段最重要的类,整个类的所有代码联合起来构成独立的代码片段。
模块化希望代码片段由两部分组成:接口和实现~
- 接口:代码片段之间用来交互的协议,包括供接口(供给比人使用的契约)和需接口(需要使用别人的契约)
- 实现:该协议的具体实施
对于类来说,类的供接口是所有公共成员变量和成员方法的声明,这些都是可以被别的类直接访问的,代表了类愿意与他人协作的一个协议;类的需接口则是在其实现中使用到的其他类及其相关协议~
2.类之间的联系
耦合是代码片段之间的联系。在面向对象中,对象之间也会发生调用,调用时客户对象向服务对象发送某个消息,从而完成对服务对象的共有成员方法和共有成员变量的访问~
在方法调用方面,两个类的方法之间存在的耦合关系与结构化方法基本一致:数据耦合是最好的,内容耦合、重复耦合和公共耦合是不允许的,控制耦合与印记耦合是可以接受的~
在面向对象方法中,类与类之间还会存在其他复杂的关系:
- 关联:如果某个类关联另一个类,那么它就持有另一个类的引用,则这个类所有的对象都具有向另一个类的对象发送消息的能力~
- 继承:子类可以访问父类的成员方法和成员变量~
二.访问耦合
1.访问耦合的分析
如果类A拥有对类B的引用,则A可以访问B。这就是所谓的访问耦合~

衡量两个类之间的耦合度,除了看它们之间存在的访问耦合关系的复杂度,还得看存在具体访问的次数。访问的次数多,则耦合强,访问的次数少,则耦合相对弱~
在几种访问耦合关系中,隐式访问时需要避免的,例外情况是使用标准库时允许出现级联访问,实现访问是可以接受的,也是必要的,毕竟不可能将所有使用的其他类都作为成员变量或者写为方法的参数~
2.降低访问耦合的方法
- 针对接口编程:一方面要求只访问对方的接口,另一方面要避免隐式访问
- 接口最小化/接口分离原则:将一个统一的接口匹配为多个更独立的接口
- 访问耦合的合理范围/迪米特法则:又被称为最小知识原则具体内容包括:每个单元对于其他的单元只能拥有有限的知识,知识与当前单元紧密联系的单元,每个单元只能和他的朋友交谈,不能和陌生单元交谈;另外,只能和自己的朋友交谈~


三.继承耦合
1.继承耦合的分析
在面向对象方法中,由于又继承关系,父类和子类之间也存在耦合~

膝盖规格、修改实现、精化规格三种类型是不可接受的,精化是心爱是可以接受的也是经常被使用的,扩展是最好的继承耦合,但并非每个继承关系都能达到只扩展不调整的程度~
2.降低继承耦合的方法
- Liskov替换原则:又被称为里氏替换原则,内容为子类型必须能够替换带哦类型而起到同样的作用
- 使用组合替代继承:又被称为合成复用原则,既能复用代码,又能保持接口的灵活性
四.内聚
1.面向对象中的内聚
- 方法的内聚
- 类的内聚
- 子类与父类的继承内聚
方法内聚和结构化中的函数内聚一致,主要是体现方法实现时语句之间的内聚性,内聚性由高到底分为:功能内聚、通信内聚、过程内聚、时间内聚、逻辑内聚、偶然内聚
类的内聚主要是衡量类的成员变量和方法之间的内聚,简单地说,类既应该是信息内聚的,又应该是功能内聚的~


2.提高内聚的方法
- 集中信息与行为:高内聚的类应该是信息内聚的,也就是说类的信息应该和访问这些信息的行为放在一个类中
- 单一职责原则:一个高内聚的类不仅要是信息内聚的,还应该是功能内聚的
五.耦合与内聚的度量
为了利用模块化的思想评价设计质量,人们定义了一些量化指标,进行面向对象方法的耦合与内聚的度量
1.耦合的度量
- 方法调用耦合:包括该类调用其他类的成员方法的数量,以及其他类访问这个类的成员方法的数量
- 访问耦合:同济一个类包含的其他类的实力的数量,不包括继承关系带来的实例引用。
- 继承耦合:统计直接所属的子类的数目
2.内聚的度量
LCOM法,计算方式如下:

相关文章:
软件工程与计算(十四)详细设计中面向对象方法下的模块化
一.面向对象中的模块 1.类 模块化是消除软件复杂度的一个重要方法,每个代码片段相互独立,这样能够提高可维护性。在面向对象方法中,代码片段最重要的类,整个类的所有代码联合起来构成独立的代码片段。 模块化希望代码片段由两部…...
商城免费搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c
1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…...
python教程:selenium WebDriver 中的几种等待
嗨喽,大家好呀~这里是爱看美女的茜茜呐 强制等待:sleep() import time sleep(5) #等待5秒设置固定休眠时间,单位为秒。 由python的time包提供, 导入 time 包后就可以使用。 缺点: 不智能,使用太多的sleep会影响脚本运行速度。…...
【MATLAB源码-第49期】基于蚁群算法(ACO)算法的栅格路径规划,输出最佳路径图和算法收敛曲线图。
操作环境: MATLAB 2022a 1、算法描述 蚁群算法是一种模拟自然界蚂蚁觅食行为的启发式优化算法。在蚁群系统中,通过模拟蚂蚁之间通过信息素沟通的方式来寻找最短路径。 在栅格路径规划中,蚁群算法的基本步骤如下: 1. 初始化: …...
LabVIEW生产者消费者架构
LabVIEW生产者消费者架构 生产者/消费者模式可以轻松地同时处理多个进程,同时还能以不同速率迭代。 缓冲通信 当多个进程以不同速度运行时,就适合采用进程间缓冲通信。有了足够大的缓冲区后,生产者循环可以以快于消费者循环的速度运行&…...
成都瀚网科技:如何有效运营抖店来客呢?
随着电子商务的快速发展和移动互联网的普及,越来越多的企业开始将目光转向线上销售渠道。其中,抖音成为备受关注的平台。作为中国最大的短视频社交平台之一,抖音每天吸引数亿用户,这也为企业提供了巨大的商机。那么,如…...
iMazing2.17.3免费苹果手机备份还原助手
强大的 iOS 设备管理软件不管是 iPhone、iPad 或 iPod Touch 设备,只要将 iOS 设备连接到计算机,就可以处理不同类型的数据。iMazing 功能强大、易于使用,可以帮助您安全备份任何 iPhone、iPad 或 iPod Touch,备受用户信赖。 现在…...
sql查询到了数据但是实体类个别字段为null(映射失败)
参考博客: sql查询到了数据但是实体类个别字段为null(映射失败)_sql语句查到值,加字段!null没值-CSDN博客 问题描述: 1.SQL查询到了数据,在idea调试output控制台窗口打印出SQL语句,字段有值; 2.接收实体对象字段无…...
配置VScode开发环境-CUDA编程
如果觉得本篇文章对您的学习起到帮助作用,请 点赞 关注 评论 ,留下您的足迹💪💪💪 本文主要介绍VScode下的CUDA编程配置,因此记录以备日后查看,同时,如果能够帮助到更多人…...
openGauss学习笔记-101 openGauss 数据库管理-管理数据库安全-客户端接入之用SSH隧道进行安全的TCP/IP连接
文章目录 openGauss学习笔记-101 openGauss 数据库管理-管理数据库安全-客户端接入之用SSH隧道进行安全的TCP/IP连接101.1 背景信息101.2 前提条件101.3 操作步骤 openGauss学习笔记-101 openGauss 数据库管理-管理数据库安全-客户端接入之用SSH隧道进行安全的TCP/IP连接 101.…...
STM32如何使用中断?
一:EXTI 简介 STM32F10x 外部中断/事件控制器(EXTI)包含多达 20 个用于产生事件/中断请求的边沿检测器。 EXTI 的每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升 沿触…...
用于物体识别和跟踪的下游任务自监督学习-2-(计算机视觉中的距离度量+损失函数)
2.4 计算机视觉中的距离度量 在深度学习和计算机视觉中,距离度量通常用于比较图像、视频或其他数据的特征或嵌入。根据具体任务和数据属性,可以使用不同类型的距离度量。下面介绍了深度学习和计算机视觉中使用的一些常见类型的距离度量。 余弦相似性距…...
热成像仪的工作原理及在工业设备状态监测中的应用
前面我们介绍过>>热分析技术在工业设备状态监测中的应用,下面我们将深入探讨热成像仪的工作原理及在工业设备状态监测中的应用。 近年来,热成像仪作为一种先进的检测工具,在工业设备状态监测领域得到了广泛的应用。热成像仪能够通过探测…...
什么是库存管理?无需Excel,2023年这几款大热库存管理软件你get了吗?
什么是库存管理?库存管理是什么意思?都有哪些好用的库存管理系统?相信这些都是大家非常关注的话题,这篇就跟大家详细唠唠什么是库存管理,都用什么系统可以进行库存管理,并且为大家盘点2023年这几款大热库存…...
c# xml 参数配置表的使用
使用简介 实际使用界面 配置表管理界面 进入 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;…...
ubuntu20.04 nerf Instant-ngp
Instant-ngp linux ubuntu 20.04 GPU RTX3050Ti Instant-ngp官方文档地址 https://github.com/NVlabs/instant-ngp 参考链接Instant-ngp linux部署及使用 - 简书 Ubuntu20.04复现instant-ngp,自建数据集,导出mesh_XINYU W的博客-CSDN博客 步骤 安装基…...
隐写术--python隐写
0x00 背景 何为隐写术? 隐写术是一类可以隐藏自己写的一些东西的方法,是一门关于信息隐藏的技巧与科学。指的是采取一些不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容的方法。 可参考 一文让你完全弄懂Stegosaurus - 知乎 本文要…...
MySQL的InnoDB存储引擎中的自适应哈希索引技术
一、自适应哈希索引的工作机制与优化策略 MySQL的InnoDB存储引擎使用了一种叫做自适应哈希索引(Adaptive Hash Indexes)的技术。在某些索引值被频繁访问的情况下,InnoDB会自动在内存中为这些值建立哈希索引,以加速查询操作。 何…...
交互设计主要做什么?新手入门必读
什么是交互设计?它涉及哪些内容?交互设计师是什么样的人群?他们到底是做什么的?他们身怀什么技能?他们工作的价值在哪里?交互设计行业的现状是怎样的?工作前景又是如何的? 如果你心…...
【深度学习实验】循环神经网络(三):门控制——自定义循环神经网络LSTM(长短期记忆网络)模型
目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. LSTM类 a.__init__(初始化) b. init_state(初始化隐藏状态) c. forward(前向传播) 2. RNNModel类 a.__init__&am…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
