系统架构19 - 面向对象

面向对象设计

  • 相关概念
  • 面向对象分析
    • 基本步骤
    • 基本原则
    • 分析模型
  • 面向对象设计
    • 设计模型
    • 类的类型
  • 面向对象编程
    • 基本特点
    • 需求建模
    • 设计原则
    • 面向对象软件测试

相关概念

  • 接口:描述对操作规范的说明,其只说明操作应该做什么,并没有定义操作如何做。
  • 消息:体现对象间的交互,通过它向目标对象发送操作请求。
  • 覆盖(重写):子类在原有父类接口的基础上,用适合于自己要求的实现去置换父类中的相应实现。即在子类中重定义-个与父类同名同参的方法
  • 函数重载:与覆盖(重写)要区分开,函数重载与子类父类无关,且函数是同名不同参数
  • 绑定:是一个把过程调用和响应调用所需要执行的代码加以结合的过程在 一般的程序设计语言中,绑定是在编译时进行的,叫作静态绑定动态绑定则是在运行时进行的,因此,一个给定的过程调用和代码的结合直到调用发生时才进行。

面向对象分析

面向对象的分析方法 (Object-Oriented Analysis, OOA),是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。
面向对象的分析是为了确定问题域,理解问题。
OOA模型由5个层次(主题层、对象类层、结构层、属性层和服务层)和5个活动(标识对象类、标识结构、定义主题、定义属性和定义服务)组成。
在这种方法中定义了两种对象类之间的结构,一种称为分类结构;另一种称为组装结构
分类结构就是所谓的一般与特殊的关系
组装结构则反映了对象之间的整体与部分的关系

基本步骤

OOA大致上遵循如下5个基本步骤。
(1)确定对象和类。这里所说的对象是对数据及其处理方式的抽象,它反映了系统保存和处理现实世界中某些事物的信息的能力。类是多个对象的共同属性和方法集合的描述,它包括如何在一个类中建立一个新对象的描述。
(2)确定结构。结构是指问题域的复杂性和连接关系。类成员结构反映了泛化-特化关系,整体-部分结构反映整体和局部之间的关系
(3)确定主题。主题是指事物的总体概貌和总体分析模型
(4)确定属性。属性就是数据元素,可用来描述对象或分类结构的实例,可在图中给出,并在对象的存储中指定。
(5)确定方法。方法是在收到消息后必须进行的一些处理方法:方法要在图中定义,并在对象的存储中指定。对于每个对象和结构来说,那些用来增加、修改、删除和选择的方法本身都是隐含的(虽然它们是要在对象的存储中定义的,但并不在图上给出),而有些则是显示的

基本原则

  • 抽象:抽象是从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质性的特征。抽象是形成概念的必须手段。抽象是面向对象方法中使用最为广泛的原则。抽象原则包括过程抽象和数据抽象两个方面。
  • 封装:封装就是把对象的属性和服务结合为一个不可分的系统单位,并尽可能隐蔽对象的内部细节。这个概念也经常用于从外部隐藏程序单元的内部表示或状态。
  • 继承:特殊类的对象拥有其对应的一般类的全部属性与服务,称作特殊类对一般类的继承。
  • 分类:就是把具有相同属性和服务的对象划分为一类,用类作为这些对象的抽象描述。分类原则实际上是抽象原则运用于对象描述时的一种表现形式
  • 聚合:又称组装,其原则是:把一个复杂的事物看成若干比较简单的事物的组装体,从而简化对复杂事物的描述
  • 关联:是思考问题时经常运用的思想方法。
  • 消息通信:要求对象之间只能通过消息进行通信,而不允许在对象之外直接地存取对象内部的属性。通过消息进行通信是由于封装原则而引起的。在OOA 中要求用消息连接表示出对象之间的动态联系
  • 粒度控制:控制自己的视野。考虑全局时,注意其大的组成部分,暂时不考虑具体的细节;考虑某部分的细节时则暂时撇开其余的部分。
  • 行为分析:由大量的事物所构成的问题域中各种行为往往相互依赖、相互交织

分析模型

分析模型主要由顶层架构图、用例与用例图、领域概念模型构成。

面向对象设计

面向对象设计方法 (Object-Oriented Design, OOD) 是 OOA 方法的延续,其基本思想包括抽象、封装和可扩展性,其中可扩展性主要通过继承和多态来实现。在OOD 中,数据结构和在数据结构上定义的操作算法封装在一个对象之中
类封装了信息和行为,是面向对象的重要组成部分,它是具有相同属性、方法和关系的对象集合的总称。

设计模型

包含以包图表示的软件体系结构图、以交互图表示的用例实现图完整精确的类图、针对复杂对象的状态图和用以描述流程化处理过程的活动图

类的类型

在OOD 中,类可以分为3种类型:实体类、控制类和边界类。
(1)实体类
实体类映射需求中的每个实体,是指实体类保存需要存储在永久存储体中的信息。实体类通常都是永久性的,它们所具有的属性和关系是长期需要的,有时甚至在系统的整个生存期都需要。通常情况下,实体类一定有属性,但不一定有操作
(2)控制类
控制类是用于控制用例工作的类。控制类用于对一个或几个用例所特有的控制行为进行建模,控制对象(控制类的实例)通常控制其他对象,因此,它们的行为具有协调性。控制类将用例的特有行为进行封装,控制对象的行为与特定用例的实现密切相关,当系统执行用例的时候,就产生了一个控制对象,控制对象经常在其对应的用例执行完毕后消亡。通常情况下,控制类没有属性,但一定有方法
(3)边界类
边界类用于封装在用例内、外流动的信息或数据流。边界类位于系统与外界的交接处。检查用例模型,每个参与者和用例交互至少要有一个边界类,边界类使参与者能与系统交互。边界类是一种用于对系统外部环境与其内部运作之间的交互进行建模的类。边界类用于系统接口与系统外部进行交互,边界对象将系统与其外部环境的变更分隔开。通常情况下,边界类可以既有属性也有方法

面向对象编程

面向对象程序设计 (Object Oriented Programming, OOP) 是一种计算机编程架构
OOP的一条基本原则是计算机程序由单个能够起到子程序作用的单元或对象组合而成。 OOP 达到了软件工程的3个主要目标:重用性、灵活性和扩展性。** OOP= 对象+类+继承+多态+消息**,其中核心概念是类和对象
面向对象程序设计以对象为核心,该方法认为程序由一系列对象组成类是对现实世界的抽象,包括表示静态属性的数据和对数据的操作,对象是类的实例化。对象间通过消息传递相互通信,来模拟现实世界中不同实体间的联系。在OOP中,对象是组成程序的基本模块

基本特点

  • 封装:封装是指将一个计算机系统中的数据以及与这个数据相关的一切操作语言(即描述每一个对象的属性以及其行为的程序代码)组装到一起,一并封装在一个有机的实体中,把它们封装在一个“模块”中,也就是一个类中,为软件结构的相关部件所具有的模块性提供良好的基础。在面向对象技术的相关原理以及程序语言中,封装的最基本单位是对象,而使得软件结构的相关部件的实现“高内聚、低耦合”的“最佳状态”便是面向对象技术的封装性所需要实现的最基本的目标。对于用户来说,对象是如何对各种行为进行操作、运行、实现等细节是不需要了解清楚的,用户只需要通过封装外的通道对计算机进行相关方面的操作即可。
  • 继承:主要指的是两种或者两种以上的类之间的联系与区别。在面向对象技术中,继承是指一个对象针对于另一个对象的某些独有的特点、能力进行复制或者延续。如果按照继承源进行划分,则可以分为单继承(一个对象仅仅从另外一个对象中继承其相应的特点)与多继承(一个对象可以同时从另外两个或者两个以上的对象中继承所需要的特点与能力,并且不会发生冲突等现象):如果从继承中包含的内容进行划分,则继承可以分为4类,分别为取代继承(一个对象在继承另一个对象的能力与特点之后将父对象进行取代)、包含继承(一个对象在将另一个对象的能力与特点进行完全的继承之后,又继承了其他对象所包含的相应内容,结果导致这个对象所具有的能力与特点大于等于父对象,实现了对于父对象的包含)、受限继承特化继承
  • 多态:从宏观的角度来讲,多态是指在面向对象技术中,当不同的多个对象同时接收到同一个完全相同的消息之后,所表现出来的动作是各不相同的,具有多种形态;从微观的角度来讲,多态是指在一组对象的一个类中,面向对象技术可以使用相同的调用方式来对相同的函数名进行调用,即便这若干个具有相同函数名的函数所执行的动作是不同的。

需求建模

面向对象建模

设计原则

  • 单一责任原则:就一个类而言,应该仅有 一个引起它变化的原因。即,当需要修改某个类的时候原因有且只有 一 个,让 一 个类只做 一 种类型责任。
  • 开放-封闭原则:软件实体(类、块、函数等)应该是可以扩展的,即开放的;但是不可修改的,即封闭的。
  • 里氏替换原则:子类型必须能够替换掉他们的基类型。即,在任何父类可以出现的地方都可以用子类的实例来赋值给父类型的引用。
  • 依赖倒置原则:抽象不应该依赖于细节,细节应该依赖于抽象。即,高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
  • 接口分离原则:不应该强迫客户依赖于不用的方法。接口属于客户,不属于它所在的类层次结构。即: 依赖于抽象,不要依赖于具体,同时在抽象级别不应该有对于细节的依赖。这样做的好处就在于可以最大限度地应对可能的变化。

面向对象软件测试

  • 算法层。测试类中定义的每个方法,基本上相当于传统软件测试中的单元测试。
  • 类层。测试封装在同一个类中的所有方法与属性之间的相互作用。在向面对象软件中类是基本模块,因此可以认为这是面向对象测试中所特有的模块测试。
  • 模板层。测试一组协同工作的类之间的相互作用,大体上相当于传统软件测试中的集成测试,但是也有面向对象软件的特点。
  • 系统层。把各个子系统组装成完整的面向对象软件系统,在组装过程中后时进行测试。

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

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

相关文章

C与C++相互调用的“底层原理“

在你的C语言代码中,不知能否看到类似下面的代码: 这好像没有什么问题,你应该还会想:“嗯⋯是啊,我们的代码都是这样写的,从来没有因此碰到过什么麻烦啊~”。 你说的没错,如果你的头…

ES6理论及方法

一、基础知识 1.不可枚举就是不可遍历。 2.数据代理:通过一个对象代理对另一个对象中属性的操作(读/写) 二、方法 1.一个字符串是否包含在另一个字符串中 includes():返回布尔值,表示是否找到了参数字符串。 starts…

Excel中将16进制数转化成10进制(有/无符号)

Excel中将16进制数转化成10进制(有/无符号) Excel或者matlab中常用XXX2XXX进行不同进制的转换 16进制转10进制(无符号数):HEX2DEC 16进制转10进制(有符号数): FA46为例&#xff0c…

看到小米SU7这顶配价格 全都坐不住了

文 | AUTO芯球 作者 | 李诞 果然被我猜中了吗? 我是真的猜中了吗 之前我的视频里说 小米SU7这技术、这车 绝对值35万 今天爆出来 小米汽车上牌售价 保险费用显示顶配36.14万 难怪雷总说 这是按照Dream Car的标准来设计的 投入百亿 雷总这点是真没骗人 …

架构整洁之道-价值维度与编程范式

1 设计与架构究竟是什么 结论:二者没有任何区别,一丁点区别都没有。 架构图里实际上包含了所有底层设计细节,这些细节信息共同支撑了顶层的架构设计,底层设计信息和顶层架构设计共同组成了整个架构文档。底层设计细节和高层架构信…

Matplotlib应用-股票技术分析实战

MACD Moving Average Convergence/Divergence,意为异同移动平均线。它刻画的是股价变化的速度 MACD算法 指标含义公式短期EMA短期收盘价指数移动均线(12天)前一日EMA(12)11/13 今日收盘价2/13长期EMA长期收盘价指数移动均线(26天)前一日EMA(26)25/27 今日收盘价2…

数据结构——并查集

1.并查集的定义 并查集其实也是一种树形结构,在使用中通常用森林的方式来表示 并查集的逻辑结构其实就是集合 并查集一般可以通过双亲写法(顺序结构)来完成,即通过一个数组存储父亲结点的下标 int s[10005]; int main() {for(…

深入了解Yum:Linux系统的软件包管理利器

目录 软件包 软件包的来源 关于yum yum是什么 yum的相关操作 介绍rzsz rz(从Windows本地传到Linux服务器) sz(从Linux服务器传到Windows本地) 注意事项 查看软件包 安装软件 卸载软件 yum的本地配置 为什么要进行配置…

《基于“源启+”的应用重构白皮书》

当前,行业数字化转型驶入“深水区”,全新的市场竞争格局对行业发展提出更高的要求,企业高质量发展需要借助新架构新应用重新定义数字生产力,重塑商业模式与市场核心竞争力。 在中国电子主办,中电金信承办的“数字原生向…

Git学习笔记(第10章):自建代码托管中心GitLab

目录 10.1 简介 10.2 安装 10.2.1 准备服务器 10.2.2 准备安装包 10.2.3 编写安装脚本 10.2.4 初始化GitLab服务 10.2.5 启动GitLab服务 10.2.6 使用浏览器访问GitLab 10.3 创建远程库 10.4 本地库推送到远程库 10.1 简介 GitLab是由GitLab Inc.开发,使用…

Nacos服务注册源码:客户端

入口 我们就拿nacos自己example下的NamingExample来做测试 public class NamingExample {public static void main(String[] args) throws NacosException, InterruptedException {Properties properties new Properties();properties.setProperty("serverAddr", …

39、FlatFormer:MIT+交大+清华共同提出,更加高效的Transformer[无绳蹦极第一人!]

本文由麻省理工学院、上海交通大学、清华大学于2023年7月14日发表于Arxiv的<Computer Science> 论文&#xff1a; [2301.08739] FlatFormer: Flattened Window Attention for Efficient Point Cloud Transformer (arxiv.org) 代码&#xff1a; github.com Abstract&a…

接续奋斗四十载 勇毅前行向未来 2024食品产业高质量发展论坛暨《中国食品报》创刊40周年研讨会在京举行

四十年春华秋实&#xff0c;四十年砥砺奋进。《中国食品报》从改革开放之初的春天里走来&#xff0c;以笔为媒&#xff0c;勇担道义&#xff0c;从拯救中华传统老字号品牌开始&#xff0c;为我国食品产业发展奔走疾呼&#xff0c;为提升我国食品企业融入国际化潮流、提升国际竞…

联合 Maxlinear 迈凌 与 Elitestek 易灵思 - WPI 世平推出基于 FPGA 芯片的好用高效电源解决方案

近期 WPI 世平公司联合 Maxlinear 迈凌电源产品搭配 Elitestek 易灵思 FPGA 共同合作推出基于 FPGA 芯片的好用高效电源解决方案。 Elitestek 易灵思 FPGA 核心产品有 2 大系列 : Trion 系列与钛金系列。Trion 系列主要特点是 : 1. 40nm 工艺 2. 超低功耗 ( 可低至竞争对手的 …

[ESXi 8]安装centos7

文章目录 创建虚拟机创建虚拟机选择centos7选择存储选择镜像文件上传ios镜像文件 安装即将完成 启动虚拟机自动获取ip设置root密码安装成功 创建虚拟机 创建虚拟机 选择centos7 选择存储 选择镜像文件 上传ios镜像文件 如图显示上传进度&#xff0c;上传完毕之后&#xff0c;将…

网络协议与攻击模拟_11DHCP欺骗防护

开启DHCP 监听 ip dhcp snooping 指定监听vlan ip dhcp snooping vlan 1 由于开启监听后&#xff0c;交换机上的接口就全部变成非信任端口&#xff0c; 非信任端口会拒绝DHCP报文&#xff0c;会造成正常的DHCP请求和响应都无法完成。 现在是请求不到IP地址的&#xff0c;…

JS图片二维码识别

前言 js识别QR图片&#xff0c;基于jsQR.js 代码 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title>图片二维码识别</title><script src"https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js">…

vector(顺序表)

vector容器就相当于一个顺序表&#xff0c;只不过他把一些功能分装到了容器里 常用接口及语法 构造&#xff1a;vectro<数据类型> 对象名 输出&#xff1a;和顺序表一样我们需要遍历打印&#xff0c;而不能直接用cout打印 对象.push_back () 尾插 对象.pop_back() 尾删…

【Java-JDK】JDK 的安装与环境变量的配置:Windows Linux

【Java-JDK】JDK的安装与环境变量的配置&#xff1a;Windows & Linux 1&#xff09;Windows安装JDK1.1.下载JDK1.1.安装JDK1.2.JDK环境配置1.3.验证环境变量是否配置成功 2&#xff09;Linux安装JDK2.1.下载JDK2.2.安装JDK2.3.JDK环境配置2.4.验证环境变量配置是否成功 1&a…

Java-并发高频面试题

1.说一下你对Java内存模型&#xff08;JMM&#xff09;的理解&#xff1f; 其实java内存模型是一种抽象的模型&#xff0c;具体来看可以分为工作内存和主内存。 JMM规定所有的变量都会存储再主内存当中&#xff0c;再操作的时候需要从主内存中复制一份到本地内存&#xff08;c…