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

news2024/11/19 10:48:33

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

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

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

目录

一.封装类的职责

1.类的职责

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

3.封装实现细节

二.为变更而设计

1.封装变更

2.多态

3.依赖倒置原则

4.总结


一.封装类的职责

1.类的职责

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

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

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

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

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

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

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

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

3.封装实现细节

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

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

二.为变更而设计

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

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

开闭原则:

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

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

2.多态

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

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

3.依赖倒置原则(DIP

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

4.总结

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

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

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

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

相关文章

MyBatisPlus(十九)自动填充

说明 自动填充指的是,当数据被 插入 或者 更新 的时候,会为指定字段进行一些默认的数据填充。 比如,插入时,会自动填充数据的创建时间和更新时间;更新时,会自动填充数据的更新时间。 实现方式 配置处理器…

python--短路运算,把0、空字符串和None看成 False,其他数值和非空字符串都看成 True

代码 print(3 and 4 and 5) # 5 print(5 and 6 or 7) # 6 4 > 3 and print(‘hello world’) # 输出hello world 注释: 在逻辑运算中,不一定逻辑运算符的两边都是纯表达式。也可以是数值类型的数据。 Python把0、空字符串和None看成 False&#xff…

字节码进阶之Lombok底层原理

字节码进阶之Lombok底层原理 文章目录 前言lombok 原理Lombok工作原理 举个简单的例子 前言 例如,我们经常在Java代码中为类的属性生成getter和setter方法,这是一种重复且繁琐的工作。使用Lombok可以极大地简化这个过程。 假设我们有如下的Java类&…

微软AutoGen框架:让聊天解决问题成为一种“酷”体验!

今天要给大家介绍一款在人工智能领域引起巨大轰动的产品——微软AutoGen框架。这款框架的出现,让多个LLM智能体通过聊天来解决任务成为可能,令人激动不已! 首先,我们先来了解一下LLM智能体。LLM代表"Language Learning Mode…

【MySQL】索引的增删查

上篇博客讲解了索引的底层结构 本篇介绍索引的使用 文章目录 一. 主键索引二. 唯一键索引三. 普通索引四. 全文索引五. 查询索引六. 删除索引结束语 一. 主键索引 MySQL默认会按照主键索引进行排序 关键字:primary key 即使建表时没有指明主键,MySQL也会…

25.0 MySQL 数据库概述

1. 数据库介绍 1.1 简介 数据库是用于存储, 管理和组织数据的一种技术.使用数据库有以下几个重要的原因: * 1. 数据的持久化存储: 数据库可以将数据持久地保存在磁盘上, 确保数据在计算机系统关闭或发生故障时不会丢失.这样可以保证数据的安全性和可靠性.* 2. 数据共享和协作…

excel+requests管理测试用例接口自动化框架

背景: 某项目有多个接口,之前使用的unittest框架来管理测试用例,将每个接口的用例封装成一个py文件,接口有数据或者字段变动后,需要去每个py文件中找出变动的接口测试用例,维护起来不方便,为了…

记IIS升级迁移之旅

场景 有一台Windows Server 2008机器,因为操作系统更新的原因,需要升级到 2022, 这台机器上原先部署了IIS 应用, 所以需要一并迁移。 旧机器: Windows Server 2008 , IIS7 ,.NET 版本v4.0新机…

qt笔记之qml下拉标签组合框增加发送按钮发送标签内容

qt笔记之qml下拉标签组合框增加发送按钮发送标签内容 code review! 文章目录 qt笔记之qml下拉标签组合框增加发送按钮发送标签内容1.运行2.文件结构3.main.qml4.main.cc5.MyClass.h6.MyClass.cc7.CMakeLists.txt8.ComboBox.pro9.qml.qrc 1.运行 2.文件结构 3.main.qml 代码 …

Android自定义AppGlideModule,DataFetcher ,ModelLoaderFactory,ModelLoader,Kotlin(1)

Android自定义AppGlideModule,DataFetcher ,ModelLoaderFactory,ModelLoader,Kotlin(1) 假设实现一个简单的功能,对传入要加载的path路径增加一定的筛选、容错或“重定向”,需要自定义一个模型,基于这个模型,让Glide自动匹配模型…

logback服务器日志删除原理分析

查看以下的logback官方文档 Chapter 4: Appendershttps://logback.qos.ch/manual/appenders.html 按文档说明,maxHistory是设置保存归档日志的最大数量,该数量的单位受到fileNamePattern里的值%d控制,如果有多个%d,只能有一个主%d&#xff0…

ArcGIS笔记8_测量得到的距离单位不是米?一经度一纬度换算为多少米?

本文目录 前言Step 1 遇到测量结果以度为单位的情况Step 2 简单的笨办法转换为以米为单位Step 3 拓展:一经度一纬度换算为多少米 前言 有时我们会遇到这种情况,想在ArcGIS中使用测量工具测量一下某一段距离,但显示的测量结果却是某某度&…

Linux操作系统的基础知识

在操作系统中,进程的执行也需要分配 CPU 进行执行,也就是按照程序里面的二进制代码一行一行地执行。于是,为了管理进程,我们还需要一个进程管理子系统(Process Management Subsystem)。如果运行的进程很多&…

java基础练习,九九乘法表(java版),计算器

简介 对于有了解,但是了解不深的同学,学习Java总是感觉一看就会,一些就废。往往需要一些实操练习,来夯实我们的学习结果。九九乘法表和计算器都是在编程学习领域比较经典的案例。本文为大家讲解一下两个基础练习涉及到一些基础知…

VS2010 C语言内嵌汇编语言程序

VS2010 C语言内嵌汇编语言程序 2021年7月28日席锦 在visual studio 2010中C语言使用内联汇编写代码 ,它的格式有两种, 一种是__asm 直接接汇编指令语句,比如:__asm int 3 // 软件中断 另一种是加上花括号,类似于一个函数&…

Python库学习(十):Matplotlib绘画库

1. 介绍 Matplotlib 是一个用于绘制图表和可视化数据的 Python 库。它提供了丰富的绘图工具,可以用于生成各种静态、交互式和动画图表。Matplotlib 是数据科学、机器学习和科学计算领域中最流行的绘图库之一。 1.1 关键特性 以下是 Matplotlib 的一些关键特性&…

23基于MATLAB的小波降噪,默认阈值消噪,强制消噪,给定软阈值消噪方法,数据直接替换后就可以跑。

基于MATLAB的小波降噪,默认阈值消噪,强制消噪,给定软阈值消噪方法,数据直接替换后就可以跑。 https://www.xiaohongshu.com/explore/652d57c600000

Leetcode刷题解析——904. 水果成篮

1. 题目链接:904. 水果成篮 2. 题目描述: 你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而,农场的主…

vue 拿到数据后,没有重新渲染视图,nuxt.js拿到数据后,没有重新渲染视图,强制更新视图

以下为Vue2的解决方案 一、 Vue.set() 问:什么情况下使用? 答:如果你向响应式数据添加新的“属性”,理论上,一般情况下是没问题的,但是,如果你的级别比较深,又…

Py之trl:trl(一款采用强化学习训练Transformer语言模型和稳定扩散模型的全栈库)的简介、安装、使用方法之详细攻略

Py之trl:trl(一款采用强化学习训练Transformer语言模型和稳定扩散模型的全栈库)的简介、安装、使用方法之详细攻略 目录 trl的简介 1、亮点 2、PPO是如何工作的:PPO对语言模型微调三步骤,Rollout→Evaluation→Optimization trl的安装 t…