实践中的面向对象的例子

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 【7月更文挑战第1天】本文介绍面向对象编程注重代码的可理解性、重用和维护。例如,设计一个显示时间、温度等的设备,用户无需关心内部工作,这就是封装;如果需要多个设备,可通过多态创建不同实例;而继承则允许共享通用功能,如所有时钟都继承自计时器基类。

0 简介

面向对象的实践中,通过步骤如用例、类和属性建模来分析问题。
设计工具包括使用UML或sysML建模语言有助于设计,遵循SOLID原则保证代码质量。

核心特性包括封装(隐藏实现细节)、继承(减少重复代码)和多态(允许不同对象响应相同消息)。

mandala曼德罗符号.png

1 实际中的面向对象

虽然现实场景往往比预想的要复杂得多。但是由于面向对象提供易理解可重用,可维护性,使代码更易于其他开发人员理解和维护,面向对象方法正变得越来越流行。

即使如此要成功实践该方法并不是一件容易的事情,这里先简单介绍执行的步骤,然后通过一个时钟的案例说明如何在实际场景匹配面向对象的特性。

最后强调命名对重用和维护的重要性,并提供三种命名方式,并简单说明OO的优缺点。

2 执行步骤的分歧

面向对象分析 Object-Oriented Analysis经典OOA 由三个步骤组成

– 1 用例建模
– 2 类建模
– 3 属性方法建模

当代OOA 有五个步骤

① 确认对象和类。
② 确认结构。
结构是指问题域的复杂性和连接关系。类成员结构反映了泛化-特化关系,整体-部分结构反映整体和局部之间的关系。
③ 确认主题。主题是指事物的总体概貌和总体分析模型。
④ 确认属性。
⑤ 确认方法。
  • 综合以上,避开陷阱的方式如下:

首先要清楚地了解您要解决的问题。这将帮助您识别关键对象及其关系。

其次使用 UML或者sysML3(建模语言)创建表示对象及其关系的关系图。这可以帮助您可视化系统并识别任何潜在的设计问题。

再次遵循标准设计模式和原则(如SOLID),以确保代码是模块化的、可扩展的和可重用的。

最后彻底测试您的代码,以确保其正常运行并满足系统的要求

3 使用OO分析面向对象特性:封装,继承,多态

假设我们所在工厂需要设计一个设备,需要该设备告诉您时间、温度、压力和湿度。

而你正好负责该设备的设计。该设备告诉用户时间、温度、压力和湿度,当完成设备生产时,用户会看到四个仪表告知四条数据。

用户不会知道设备里面有什么,或者显示的数字是如何确定的。
获取此数据的实现是封装的。
用户所看到的(以及用户想要/需要看到的)就是界面。

有朝一日,设计师可能会改变一种仪表,使其更准确或更便宜。
而你不必更改界面,用户也永远不会知道发生了更改。

4 多态的例子

如果用户想要两个天气时钟,一个用于客厅,一个用于厨房怎么办?
只需再购买一个漂亮的时钟设备实例——拥有两个时钟。

但是它们是不同的,显示不同的数据,在不同的地方,具有不同的身份,做同一件事,一个可以现实天气温湿度的时钟。
仅仅因为用户需要拥有其中两个,并不意味着工厂必须重新发明一个新的天气时钟。

工厂只需为用户生产了另一个。由于市面上的用户已经拥有一个,在厨房中使用新的很容易-因为界面是相同的。实现是一样的吗?

如果用户转而回到市场上并购买数字手表怎么办?
假设工厂为了省钱,在手表和天气时钟中使用相同的计时机制和界面。

5 继承的例子

我们可以通过识别它们相似的原因来对这些设备进行分类:它们都是钟表类型。
数字手表只有时间功能。天气时钟会做更多的事情,但它也会保留和显示时间。

用户认为工厂喜欢为这两款产品重新设计计时机制的想法吗?当然不,所以你只需重复使用该部分。

我们在 OO 中通过形成继承层次结构来做到这一点。
可能有读者听说过这个层次结构的术语“isa”,因为我们可以说天气时钟是一个计时器( Time Piece)(请注意,在这种情况下,最好说天气时钟至少是一类计时器).

        计时器 TimePiece 
        /      \
DigtalWatch   WeatherCiock
数字时钟        天气时钟

上图展示了计时器,数字时钟,天气时钟 的继承层次结构,那么问题来了

计时器TimePiece中需要有什么?
数字时钟DigitalWatch 中需要有什么?
天气时钟WeatherClock 中需要有什么?

6 封装的例子

有人会购买计时器产品吗?
假设您有一个连接到设备的串行接口。您想从他们那里获取当前时间。

在面向对象方法OO中,你发送了一条消息。消息需要不同吗?不需要,当它要求提供相同的信息时,为什么要这样发不同消息?

假设你可以生产气压计和湿度计。如果重新发明轮子并拥有两个气压计,一个用于独立使用,一个嵌入天气时钟,这不是很麻烦吗?

我们可以通过继承来避免这种情况吗?不,我们需要另一种手段:封装。我们可以在另一个对象中嵌入、包含或组合一个对象。

经过一番分析后,可以得到基本的用例图。

目录
相关文章
|
8天前
|
Kubernetes 安全 测试技术
多环境镜像晋级/复用最佳实践
本文介绍了在应用研发场景中,如何通过阿里云服务实现镜像构建部署的高效和安全。主要关注两个实践方法来确保“所发即所测”。
45556 9
|
8天前
|
SQL 存储 NoSQL
贝壳找房基于Flink+Paimon进行全量数据实时分组排序的实践
本文投稿自贝壳家装数仓团队,在结合家装业务场景下所探索出的一种基于 Flink+Paimon 的排序方案。这种方案可以在实时环境对全量数据进行准确的分组排序,同时减少对内存资源的消耗。在这一方案中,引入了“事件时间分段”的概念,以避免 Flink State 中冗余数据对排序结果的干扰,在保证排序结果准确性的同时,减少了对内存的消耗。并且基于数据湖组件 Paimon 的聚合模型和 Audit Log 数据在数据湖内构建了拉链表,为排序结果提供了灵活的历史数据基础。
28359 0
贝壳找房基于Flink+Paimon进行全量数据实时分组排序的实践
|
4天前
|
开发者
创作赢好礼,推荐得返佣|寻找最强种草达人!
“全网寻找最强种草达人”,写下你“玩转云产品”的技术实践故事,一键加入云大使开启您的种草之旅。 单笔订单最高奖励4.5万,更有AirPods 3、CHERRY键盘、达人证书等超多福利!
163 33
|
9天前
|
安全 API Python
在python中的基本同步原语
【6月更文挑战第23天】本文介绍了Python `asyncio`库中的同步原语,包括Lock、Event、Condition、Semaphore和BoundedSemaphore,以及Queue和PriorityQueue。`asyncio` API设计与`threading`模块相似,
115 7
在python中的基本同步原语
|
9天前
|
存储 中间件 Go
在go语言服务中封装路由和示例
【6月更文挑战第23天】本文介绍golang后端按协议处理、中间件(一次性与每次请求执行)划分、以及服务架构Controller、Logic/Service、DAO/Repository和Routers划分。代码仓库在GitHub上提供。使用框架简化了交互和处理。后续章节深入探讨服务构建。
105 5
在go语言服务中封装路由和示例
|
7天前
|
存储 测试技术
了解面向对象设计和方法
【6月更文挑战第26天】本文介绍面向对象编程(OOP)强调通过对象来模拟现实世界,以数据和行为的结合体形式存在。核心概念是封装、继承和多态,关系包括依赖、实现、关联、聚合和组合。组合是强于聚合的关联,当部分与整体有相同生命周期时适用。OOP允许创建复杂系统模型,如汽车的组件,提供不同层次的抽象。
39 1
了解面向对象设计和方法
|
12天前
|
存储 Serverless Python
在python中字典和元类的使用技巧
【6月更文挑战第21天】探索Python编程:本文涵盖字典排序、阿姆斯壮数检查、最大公因数与最小公倍数计算、下划线用途(如存储解释器结果、忽略值、命名约定),以及数字分隔增强可读性。此外,用下划线分隔数字如1_000_000,便于读取二进制、八进制和十六进制数值。
62 7
在python中字典和元类的使用技巧
|
11天前
|
监控 网络协议 安全
事件驱动的反应堆模式
【6月更文挑战第22天】这是一个关于面向对象封装的事件驱动端口监控服务的文章摘要。文中还以一个分布式日志系统为例,展示了如何通过客户端/服务器架构处理并发I/O。后续部分比较了不同的多路I/O解决方案,并预告了反应堆的详细设计和实现。
54 5
事件驱动的反应堆模式
|
12天前
|
存储 缓存 Python
深入了解python中元类和连接符的用法
【6月更文挑战第20天】本文介绍包括`type`的多重用途,内建函数的常量,模块属性,类继承的概念,元类的工作原理,可哈希对象的重要性,加权平均值的计算,以及如何找到两个列表的交集。
57 5
深入了解python中元类和连接符的用法
|
13天前
|
设计模式 算法 数据可视化
分析大型软件系统的经典方法
【6月更文挑战第19天】本文介绍ATAM(架构权衡分析方法)是一种评估大型软件系统架构的工具,着重考虑性能、可用性、安全性和可修改性等质量属性的交互。ATAM提供了一种结构化方法,确保在设计早期就能理解和平衡各种质量属性,以优化系统整体性能。
109 2
分析大型软件系统的经典方法