《面向对象的思考过程(原书第4版)》一1.5 究竟什么是对象

简介: 对象是面向对象程序中的基础材料。使用面向对象技术的程序本质上是对象的集合。举例来说,一个公司系统包含了代表公司雇员的对象。接下来的小节描述了这些对象的数据和行为。

本节书摘来自华章出版社《面向对象的思考过程(原书第4版)》一书中的第1章,第1.5节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.5 究竟什么是对象

对象是面向对象程序中的基础材料。使用面向对象技术的程序本质上是对象的集合。举例来说,一个公司系统包含了代表公司雇员的对象。接下来的小节描述了这些对象的数据和行为。

1.5.1 对象数据

存放在对象中的数据代表了该对象的状态。在面向对象术语中,数据被称为属性。在图1-6的例子中,雇员的属性可以是社会安全号码、生日、性别、电话号码等。属性包含的信息将不同对象区分开来,在本例中是把不同的雇员区分出来。本章中讨论类时会讲述属性的细节。


b29303c4081d37cb2c4c7ebca49e3f4c6e1564bd


1.5.2 对象行为

对象的行为表示对象可以做什么。在过程式语言中,可以通过过程、函数及子程序定义行为。在面向对象程序设计术语中,这些行为包含在方法中,你可以通过发送消息的方式来调用方法。在雇员例子中,考虑到雇员对象需要的行为之一是对属性值进行存取,所以每个属性会有相应的方法,比如setGender()和getGender()。当另一个对象需要该信息时,可以给雇员对象发送一个消息来询问其性别。
毫不奇怪,在本书第1版发布时,应用程序中已经出现了取值方法(getter)和赋值方法(setter),当然还有很多其他的面向对象技术。而且很多技术都与数据相关。通过第11章及第12章,我们可以看到如何使用面向对象的方式组织数据。使用对象最强大、最有趣的一点在于,数据与行为是一个整体,而不是与行为代码割裂。
XML的出现并不全为了以可移植的方式表示数据。它也有一种替代方式来让代码轻松访问数据。在.NET技术中,取值方法和赋值方法都被认为是数据自身的属性。
例如,Java中定义一个名为Name的属性如下所示:
_1
对应的取值方法和赋值方法如下所示:
_2
现在,使用C#.NET定义一个名为Name的XML属性,代码如下所示:
_3
在这种方式中,取值方法和赋值方法实际上是属性Name的属性。
不论采用什么方式,目的都是一致的,即控制对属性的访问。本章中,我想先聚焦于取值方法和赋值方法的概念本质。而在第11章及以后的章节中讲述面向对象数据时会有更多关于属性的知识。
取值方法和赋值方法
取值方法和赋值方法的理念就是数据隐藏。因为其他对象不应该直接操作另一个对象中的数据,而取值方法和赋值方法提供了对对象数据的访问控制。取值方法和赋值方法有时分别被称为访问方法(accessor method)和设值方法(mutator method)。
注意,我们只展示了这些方法的接口,而不是实现。以下几点列出了用户需要知道如何实际使用这些方法:
方法名
传给方法的参数
方法的返回值
请看图1-7演示的行为。
图1-7中,Payroll对象包含了一个名为CalculatePay()的方法,用于计算具体雇员的薪水。Payroll对象需要获取该雇员的社会安全号码。为了获取该信息,Payroll对象需要给Employee对象发送一个消息(本例中即调用getSocialSecurityNumber()方法)。基本上,这意味着Payroll对象调用Employee对象的getSocialSecurityNumber()方法。Employee对象接收到该消息并返回请求的信息。


689df0f10dd3b848fcc09996ae3a1134c4ae2c65



UML类图
由于这是我们看到的第一个类图,所以进行了一些简化,缺乏一些类应该具有的结构(例如构造函数)。不过没关系,第3章中我们会详细讨论类图及构造函数。
每个类图由三部分组成:类名、数据(属性)、行为(方法)。图1-8中,Employee类图的属性区域包含SocialSecurityNumber、Gender和DateofBirth。方法区域包含了操作这些属性的方法。你可以使用UML建模工具来创建和维护类图以对应真实的代码。
建模工具

f7209bf5c2d1<br>195efa796c3a2feee53f8b2f



可视化建模工具提供了一种方式来使用统一建模语言(unified modeling language,UML)创建和操作类图。对于类图的讨论贯穿本书,第10章会指导如何使用该标记语言。UML类图可以作为一个工具来可视化类以及类与类之间的关系。本书中对UML的使用仅限于类图。
本章稍后会介绍类与对象的关系。但现在你可以认为类是创建对象的模板。当对象被创建时,我们看到对象被实例化。因此,如果我们创建三个雇员,实际上是创建了三个Employee类的直接实例。每个对象都包含了属性和方法的副本。例如,图1-9中,一个叫作John的对象(John是该对象的标识)自身拥有Employee类中所有的属性和方法的副本。叫作Mary的雇员类也拥有自己独立的属性和方法的副本。这两个对象各自拥有DataOfBirth属性和getDateOfBrith方法的副本。

9cf4aa89bbba27155988c1d87204232fba789229



图1-9 程序空间
实现问题
请注意没必要为每个对象的每个方法都实现一个物理副本。其实,每个对象指向了同一个实现。不过这个问题可以交由编译器/操作系统平台来解决。从概念上来说,你可以认为对象是完全独立的,各自拥有独立的属性和方法。
相关文章
|
Cloud Native 架构师 Devops
云原生时代领域驱动设计(DDD)的价值——从《没有银弹》说起
软件开发需要面对本质困难和附属困难。云原生、DevOps实践大幅降低了附属困难,使得架构师可以全力聚焦于业务复杂性,而DDD恰是管理业务复杂性的有效方法。
1853 0
云原生时代领域驱动设计(DDD)的价值——从《没有银弹》说起
|
前端开发 架构师 算法
技术一号位的方法论《个人篇》——人成长的本质以及如何构建个人成长路线图
不论你是职场新人还是35岁的职场“老人”,成长是每个职场人都绕不开的话题,同时也是贯穿每个人职业生涯的痛点。本文主要帮助读者建立起对个人成长的认知,然后在此认知的基础上让大家理解成长的本质,最终通过文章的引导,来帮助读者完成个人成长路线图的确定以及落地实践。
14174 3
技术一号位的方法论《个人篇》——人成长的本质以及如何构建个人成长路线图
|
监控 程序员 芯片
STM32 你不知道的看门狗细节
你知道什么是看门狗吗?看门狗,实际上可以说就是一个简单的定时器功能,而这个定时器有一个输出端,可以输出复位信号。
1560 88
STM32 你不知道的看门狗细节
|
JavaScript 前端开发 API
用Python和Vue构建内容管理系统(CMS):一步步指南
【4月更文挑战第10天】本文介绍了如何使用Python的Django框架和前端的Vue.js构建内容管理系统(CMS)。Django提供后端支持,遵循MTV模式,Vue.js则用于创建数据驱动的用户界面。步骤包括环境准备、Django项目与应用创建、定义数据模型、创建API接口、搭建Vue项目、集成Django与Vue、性能优化及部署上线。这种结合充分利用两者优势,实现高效、可扩展的CMS解决方案,适应未来智能化、个性化的趋势。
981 0
|
Cloud Native 前端开发 Java
技术人生第5篇——浅谈如何成为技术一号位?
认清每个人自己在日常工作中的思维定式非常重要,有助于转变自己对很多事情的认知,而这种转变也会从根本上带来行为上的变化。也就是说,可以通过理论分析和实践,来共同完成对个人实际生活的影响。今天这篇文章,我们会先讨论业务研发同学,或者说大多数的业务研发同学的自我认知是什么,再看下这种普遍的自我认知之内,是否已经存在着大家视而不见的思维定式;然后再讨论思维定式产生的原因是什么,如何突破这种由认知不到位而导致的自我束缚;最后再探讨业务研发同学应该存在什么样的认知,如何通过实践完成自己从普通开发到技术一号位的角色转变。
8933 64
技术人生第5篇——浅谈如何成为技术一号位?
|
缓存 IDE Java
Idea里开发遇到所有项目的所有代码爆红的问题与解决
在Idea中,用户意外遇到所有项目代码显示错误但能正常运行的问题。尝试清理缓存、更改编码和切换JDK等方法无效。最终解决方案是检查并移除Maven的.class文件忽略设置:进入File--Editor--File Types,确保Ignore files and folders列表中没有配置为忽略*.class文件。移除后,IDE重新索引,红色错误提示消失。
2862 1
|
监控 安全 中间件
「技术人生」专题第1篇:什么是技术一号位?
以真正的技术一号位的角色去落地你负责的事情,那么扮演技术一号位就是水到渠成的事情了。
8198 104
「技术人生」专题第1篇:什么是技术一号位?
|
新零售 供应链 架构师
「技术人生」第2篇:学会分析事物的本质
对于研发同学而言,探究事物的本质,是最基础最核心最先需要被掌握的技能,没有之一。
5314 90
「技术人生」第2篇:学会分析事物的本质
|
XML 数据库 数据格式
Flowable 中 ReceiveTask 怎么玩?
Flowable 中 ReceiveTask 怎么玩?

热门文章

最新文章