当前位置: 首页 > news >正文

软件工程与计算总结(十五)详细设计中面向对象方法下的信息隐藏

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

之前的博客中,模块需要隐藏的决策主要由“职责的实现”and“实现的变更”两类,在面向对象方法中,需要做到的就是:

  • 封装类的职责,隐藏职责的实现
  • 预计将会发生的变更,抽象它的接口,隐藏它的内部机制

目录

一.封装类的职责

1.类的职责

2.封装——分离接口与实现

3.封装实现细节

二.为变更而设计

1.封装变更

2.多态

3.依赖倒置原则

4.总结


一.封装类的职责

1.类的职责

职责是指类或者对象维护一定的状态信息,并基于状态履行行为职能的能力,类与对象的职责是来源于需求的,否则就不会产生对系统的共线,就没有存在的必要~

按照信息隐藏的思想,一个模块应该通过稳定的接口对外表现其所承载的需求,而隐藏它对需求的内部实现细节。那么类就应该通过接口对外表现它直接和间接承载的需求,而隐藏类内部的构造原理,这恰恰是“封装”想要达到的~

2.封装——分离接口与实现

封装通常由两方面的含义:

  • 将数据和行为同时包含在类中:不仅仅是简单地将成员变量声明代码与方法代码拼接到一个类中了事,而是需要集中数据与行为,数据与行为需要相互支撑、紧密联系
  • 分离对外接口与内部实现:接口描述了类的职责,需要对外公布。供外界调用,以帮助系统满足最终需求;实现是类的内部实现机制,不需要对外公开,外界也不应该知道他的具体细节~

在面向对象方法中,接口通常描述以下几个内容:

  • 对象之间交互的消息(方法名)
  • 消息中的参数
  • 消息返回结果的类型
  • 与状态无关的不变量
  • 需要处理的异常

 插播一条关于接口的定义:接口是一种规范,用于定义软件系统中各个组件之间的通信方式和数据交换格式。它定义了一组方法、属性和参数,以及它们之间的关系和约束条件,使得不同的组件可以相互协作,实现特定的功能。

3.封装实现细节

对封装的简单理解是隐藏类的属性和数据信息,但这是远远不够的,封装需要隐藏接口之外所有的实现细节:

  • 封装数据和行为:封装要保护数据和行为,成员方法和成员变量都设置了不同的可见性
  • 封装内部结构:实现中使用的复杂数据结构是需要重点封装的,因为程序设计语言目前在程序调用时还无法做到对复杂数据结构进行值传递,而他们使用的引用传递是破坏封装的
  • 封装其他对象的引用:有时,一个对象所持有的其他对象的引用也是需要隐藏起来的。
  • 封装类型信息:在多种子类型因为具备一些共性而被视作一种类型就加以使用时,应该隐藏其具体子类型的类别
  • 封装潜在变更:信息隐藏需要隐藏变更

二.为变更而设计

1.封装变更(开闭原则)

变更是软件开发面临的最大挑战,也是软件维护成本远高于软件开发成本的主要原因,因此如何在开发阶段就为将来可能得变更进行预啊合计以减少维护成本就成为设计师必须考虑的问题~

开闭原则:

  • 好的设计应该对扩展开放
  • 好的设计应该对修改关闭

简单来说,开闭原则是指,在发生变更时,好的世界只需要添加新的代码而不需要修改原有的代码,就能实现变更~

2.多态

  • 语义:多态指的是不同类型的值能够通过统一的接口来操纵,表现为不论实际类型为何,直接调用该统一接口,这样系统就可以根据实际类型的不同表现出不同行为~
  • 实现:存在如下分类

(不同语言中的实现有所不同,例如C++使用模版机制、java则使用泛化机制)

3.依赖倒置原则(DIP

  • 抽象不应该依赖于细节,细节应该依赖于抽象,因为抽象是稳定的,细节是不稳定的
  • 高层模块不应该依赖于低层模块,而是双方都依赖于抽象,因为抽象是稳定,而高层模块和低层模块都可能是不稳定的

4.总结

按照信息隐藏思想,类要封装潜在的变更,但是实践经验表面,仅仅封装变更是不够的,还需要使用多态或者DIP的方法实现符合OCP的变更,以减少变更带来的幅面影响~

如果在软件开发时未能预计到变更的发生,那么在维护阶段遇到变更时可以使用多态手段,保证OCP满足~

相关文章:

软件工程与计算总结(十五)详细设计中面向对象方法下的信息隐藏

软件工程与计算总结(十三)详细设计中的模块化与信息隐藏 之前的博客中,模块需要隐藏的决策主要由“职责的实现”and“实现的变更”两类,在面向对象方法中,需要做到的就是: 封装类的职责,隐藏职…...

鸿蒙初体验

下载与安装DevEco Studio 在HarmonyOS应用开发学习之前,需要进行一些准备工作,首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网,单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和…...

hive复合类型的数据查询

hive数据表创建-CSDN博客 --第一个名字以M开头的 访问数组array 数组( array) 引用方式 列名 [ 元素索引 _ 以 0 开始 ] select * from emp where emp_name[0] rlike "^M"; -- 出生日期是在 5 几年 访问 Map map 引用方式 列名 ["Key"] selec…...

Notes/Domino 14 Early Access Drop3发布

大家好,才是真的好。 其实上周,就是国庆假期的时候,HCL Notes/Domino 14 Early Access Drop3(以下简称EA3)就已经发布,而且和传说中的一样,带来了数项惊人的新特性。 我们先讲讲这一版本新特性…...

前端、后端开发者常用到的免费API整理

以下是我整理的前端、后端工程师在开发中经常使用到的API接口,希望能帮到大家~ 手机号码归属地:可根据手机号码查询其省市区、运营商区号行政区划代码等信息。 上亿条数据囊括最新的170、166、147等号段,更新及时、准确度高。空号检测&#…...

【LeetCode高频SQL50题-基础版】打卡第9天:第46~50题

文章目录 【LeetCode高频SQL50题-基础版】打卡第9天:第46~50题⛅前言患某种疾病的患者🔒题目🔑题解 第二高的薪水🔒题目🔑题解 按日期分组销售产品🔒题目🔑题解 列出指定时间段内所有的下单产品…...

中断机制-通过volatile实现线程中断停止

4.1.4 大厂面试题中断机制考点 如何停止中断运行中的线程? 通过一个volatile变量实现 package com.nanjing.gulimall.zhouyimo.test;import java.util.concurrent.TimeUnit;/*** author zhou* version 1.0* date 2023/10/15 2:34 下午*/ public class InterruptD…...

Elasticsearch 8.11 中的合并更少,摄取更快

作者:ADRIEN GRAND Elasticsearch 8.11 改进了管理索引缓存的方式,从而减少了段合并。 我们对 Elasticsearch 8.11 从索引缓存回收内存的方式进行了重大更改,这有助于减少合并开销,从而加快索引速度。 使用我们的日志跟踪&#x…...

算法村开篇

大家好我是苏麟从今天开始我将带来算法的一些习题和心得体会等等...... 算法村介绍 我们一步步地学习算法本专栏会以闯关的方式来学习算法 循序渐进地系统的学习算法并掌握大部分面试知识 , 期待和大家一起进步 . 索大祝大家学有所成 , 前程似锦....

Leetcode—136.只出现一次的数字【简单】

2023每日刷题&#xff08;二&#xff09; Leetcode—136.只出现一次的数字 位运算法 实现代码 int singleNumber(int* nums, int numsSize){int i 0;int res 0;for(; i < numsSize; i) {res ^ nums[i];}return res; }运行结果 之后我会持续更新&#xff0c;如果喜欢我的…...

关于RNNoise、webrtc_ns、三角带通滤波器、对数能量

语音特征参数MFCC提取过程详解 其中讲解了&#xff1a;三角带通滤波器 、计算每个滤波器组输出的对数能量、对数能量、经离散余弦变换&#xff08;DCT&#xff09;得到MFCC系数 推荐阅读某乎这位大佬的全部文章&#xff1a; 下面是几篇出自这位大佬的很好的文章&#xff1a; …...

c语言练习89:链表的使用

链表的使用 虽然有这么多的链表的结构&#xff0c;但是我们实际中最常⽤还是两种结构&#xff1a; 单链表 和 双向带头循环链表 1. ⽆头单向⾮循环链表&#xff1a;结构简单&#xff0c;⼀般不会单独⽤来存数据。实际中更多是作为其他数据结 构的⼦结构&#xff0c;如哈希桶、…...

ArkTS及openHarmony

补充 padding&#xff1a;内边距&#xff0c;也就是盒子边和盒子内部的距离 margin&#xff1a;外边距&#xff0c;也就是盒子和盒子的距离 openHarmony应用开发及UI界面 常用布局 Row 水平线性布局核心代码 子控件会共享同一行&#xff0c;也就是都在同一行内 Preview C…...

Idea怎么配置Maven才能优先从本地仓库获取依赖

网上的方法 : 在设置中搜索 Runner ,在VM Option中设置参数 -DarchetypeCataloginternal删除 解压后的依赖包中的 _remote.repositories m2e-lastUpdated.properties *.lastUpdated 文件。 上边都没有效果 最终的解决方法&#xff0c;修改maven配置文件settings.xml 主要两个…...

聊聊HttpClient的DnsResolver

序 本文主要研究一下HttpClient的DnsResolver DnsResolver org/apache/http/conn/DnsResolver.java /*** Users may implement this interface to override the normal DNS lookup offered* by the OS.** since 4.2*/ public interface DnsResolver {/*** Returns the IP a…...

剑指智能驾驶,智己LS6胜算几何?

监制 | 何玺 排版 | 叶媛 10月12日&#xff0c;IM智己旗下的新车智己LS6宣布上市。 新车型搭载尖端科技多项&#xff0c;其中以“全画幅数字驾舱屏”、和城市高阶智能辅助驾驶为核心的智驾技术&#xff0c;更是引来众多用户关注。 01 新能源新卷王智己LS6 智己LS6一发布就…...

网络工程师知识点5

71、什么是FTP&#xff1f; FTP是文件传输协议。 FTP传输数据时支持两种传输模式&#xff1a;ASCII模式和二进制模式。 需要TCP的21号端口来建立控制连接 需要TCP的20号端口来建立数据连接 72、什么是telnet&#xff1f; Telnet提供了一个交互式操作界面&#xff0c;允许终端远…...

未来展望:大型语言模型与 SQL 数据库集成的前景与挑战

一、前言 随着 GPT-3、PaLM 和 Anthropic 的 Claude 等大型语言模型 (LLM) 的出现引发了自然语言在人工智能领域的一场革命。这些模型可以理解复杂的语言、推理概念并生成连贯的文本。这使得各种应用程序都能够使用对话界面。然而&#xff0c;绝大多数企业数据都存储在结构化 …...

SpringCloud-Hystrix

一、介绍 &#xff08;1&#xff09;避免单个服务出现故障导致整个应用崩溃。 &#xff08;2&#xff09;服务降级&#xff1a;服务超时、服务异常、服务宕机时&#xff0c;执行定义好的方法。&#xff08;做别的&#xff09; &#xff08;3&#xff09;服务熔断&#xff1a;达…...

Ansible脚本进阶---playbook

目录 一、playbooks的组成 二、案例 2.1 在webservers主机组中执行一系列任务&#xff0c;包括禁用SELinux、停止防火墙服务、安装httpd软件包、复制配置文件和启动httpd服务。 2.2 在名为dbservers的主机组中创建一个用户组&#xff08;mysql&#xff09;和一个用户&#x…...

SDMatte边缘精修效果展示:发丝级分离、玻璃折射保留、薄纱纹理还原等高清案例图集

SDMatte边缘精修效果展示&#xff1a;发丝级分离、玻璃折射保留、薄纱纹理还原等高清案例图集 1. 惊艳效果预览 SDMatte作为专业级AI抠图工具&#xff0c;在处理复杂边缘和透明物体方面展现出惊人的能力。下面我们通过一组真实案例&#xff0c;展示它在不同场景下的表现。 1…...

37 Python 时序和文本:词袋模型 BoW 和 TF-IDF 到底怎么理解?

Python 文本分析入门&#xff1a;词袋模型 BoW 和 TF-IDF 到底怎么理解&#xff1f; 上一篇主要解决了两个基础问题&#xff1a; 为什么中文文本通常要先分词&#xff1f;为什么分词之后还要做停用词过滤&#xff1f; 但文本清洗完成之后&#xff0c;新的问题很快就会出现&…...

MangoHud资源占用实时监控:图表工具终极指南

MangoHud资源占用实时监控&#xff1a;图表工具终极指南 【免费下载链接】MangoHud A Vulkan and OpenGL overlay for monitoring FPS, temperatures, CPU/GPU load and more. Discord: https://discordapp.com/invite/Gj5YmBb 项目地址: https://gitcode.com/gh_mirrors/ma/…...

关于腾讯广告算法大赛2025项目分析1 - dataset.py

把原始 jsonl 用户行为序列&#xff0c;转成模型能直接吃的张量tensor和特征字典 一、整体定位 MyDataset 读取训练数据&#xff0c;产出: 用户序列 seq正样本 pos负样本 negtoken 类型各类特征时间特征相关原始时间戳 MyTestDataset 读取测试/推理数据&#xff0c;产出 用户序…...

浏览器兼容性问题汇总

1.IE10版本以上浏览器input标签后面自带一个X问题IE10&#xff0c;IE11浏览器当点击input text文本框时&#xff0c;输入文本后出现一个删除功能的X按钮IE浏览器效果&#xff0c;而谷歌浏览器没有解决方案&#xff1a;给input添加如下CSS样式 input::-ms-clear{display:none;}2…...

别再手动对齐了!Excel双坐标折线图保姆级教程,5分钟搞定销售与成本对比分析

Excel双坐标折线图实战&#xff1a;销售与成本可视化分析的进阶技巧 当市场专员小林第一次尝试将季度销售额&#xff08;单位&#xff1a;万元&#xff09;和成本率&#xff08;单位&#xff1a;百分比&#xff09;放在同一张图表时&#xff0c;她发现了一个尴尬的现象——代表…...

ChezScheme测试性能优化:从53分钟到8分钟的效率跃迁

ChezScheme测试性能优化&#xff1a;从53分钟到8分钟的效率跃迁 【免费下载链接】ChezScheme Chez Scheme 项目地址: https://gitcode.com/gh_mirrors/ch/ChezScheme 一、痛点分析&#xff1a;串行测试的性能瓶颈 识别测试效率问题 在软件开发迭代过程中&#xff0c;…...

ROS2 MoveIt2实战:如何让虚拟机械臂‘看懂’并抓取YOLOv8 OBB识别的物体?

ROS2 MoveIt2与YOLOv8 OBB深度集成&#xff1a;构建高精度虚拟抓取系统的核心技术解析 当机械臂遇上计算机视觉&#xff0c;一场关于精准控制的交响乐就此展开。本文将带您深入探索如何利用YOLOv8 OBB&#xff08;Oriented Bounding Box&#xff09;的朝向感知能力&#xff0c;…...

最完整的llm-graph-builder入门指南:从安装到知识图谱可视化

最完整的llm-graph-builder入门指南&#xff1a;从安装到知识图谱可视化 【免费下载链接】llm-graph-builder Neo4j graph construction from unstructured data 项目地址: https://gitcode.com/GitHub_Trending/ll/llm-graph-builder 你还在为非结构化数据转化为结构化…...

突破性AI音乐创作革新:腾讯SongGeneration开源项目全解析

突破性AI音乐创作革新&#xff1a;腾讯SongGeneration开源项目全解析 【免费下载链接】SongGeneration 腾讯开源SongGeneration项目&#xff0c;基于LeVo架构实现高品质AI歌曲生成。它采用混合音轨与双轨并行建模技术&#xff0c;既能融合人声与伴奏达到和谐统一&#xff0c;也…...