StupidBeauty
Read times:3697Posted at:Tue Jul 11 05:02:50 2017 - no title specified

《C++面向对象软件设计及构建》文章翻译:1.4将抽象和分离映射到类和对象,1.4 Mapping Abstraction and Separation to Classes and Objects

软件开发,关注的是,将抽象事物表达 成能够 在软件系统中进行操作的形式。之前 曾介绍过 抽象 即是, 一组属性和行为的集合。 如下图所示,抽象 中的属性,会被映射成一组数据 (变量 、数组、列表、复杂数据结构,等等 ) ,抽象 中的行为, 会被映射成一组方法 ( 也称作操作、函数、动作 ) 将抽象事物在软件中表达出来,就是编程过程的隐含目的 不过, 这个目的经常被 一些更机械性的考虑所掩盖。

将抽象事物映射成软件

面向对象编程, 在软件的抽象过程中,引入了一些更高级的结构,即,类( classes )和对象( objects ),以用来表示抽象。 这些新的软件结构允许更容易 直接和明确地表示抽象。

,为指定的抽象 定义 具体 结构(它有什么数据和方法,它的方法 如何实现 )。类 有一个独特的名称,表达它所代表的抽象的含义。 class ),这个 术语 表示 的意思是, 它代表 着某 组事件(或 某个分 的事物 )的所有成员。 例如, SalesPerson 可能代表 的是, “在汽车经销商处销售汽车的人” 人物 中的所有个人。 对象 表示此组事物 的特定成员。

将接口与实现相分离,这种手段,被用来将类分割成两个部分,即通常所说的私有( private )和公有( public )部分。数据和方法,按照下图所示的方式映射到类中的两个部分。这种将私有数据和代码与公开可见的方法名字区分开来的形式,是多年的软件工程经验总结出来的。它表明,要保护数据,避 免被软件中别处的那些对该对象进行操作的部分进行意料之外的、错误的访问。这种分离,还有另一个作用,就是,将某个方法背后的算法隐藏起来。


类的一般结构

以下定义,反映了类与抽象和分离之间的关系:

一个命名的软件组件,代表着一个 抽象 它将实现和接口分离开。

抽象,和类,这两个术语的定义之间有着明显的相似性。这表明了,类,就是明确直接地用来对真实世界中的实体进行建模的。

值得注意的一点是,有一些面向对象的语言中,并没有类的概念,但它们有着其它的技术,以实现类似的效果。像C++、Java 这样,有类的概念的语言,被称作“基于类的语言”。

对象

类,定义的是,相似事物作为一个整体所具有的结构(例如,任何一个销售人员)。而,对象,代表的是,那个类中的某个特定成员(例如,销售人员John Smith,是一个成交率为 15%的销售人员)。利用类的定义,可以一次性地定义好共有的结构。日后,在创建那些需要这个类所定义的结构的新对象时,就可以进行复用了。对象的属性,就与用来创建它的类所描述的属性一致。

如下所示,对象结构中的关键之处,就反映了用来创建该对象的类的结构。正像在类中那样,对于对象来说,主要的两个部分即是:

  • •.实现:在对象内部隐藏起来的数据和对于方法的具体实现,和

  • •.接口:在这个对象中,所有能够被外界看到的方法的特征

在下图中,可从对象的外界调用到的那些方法,是以小黑圆点的方式画在对象的边缘的。对于这些方法的实现代码,是该个对象的具体实现细节,因而被隐藏在对象内部。“封装”,这个术语,经常被用来描述这样的做法,即,将对象的具体实现细节隐藏起来;通常的说法是,“一个对象封装了它自己的数据”。封装,其定义是:

封装

指的是,在面向对象编程语言中,对于对象中的数据的访问权限被限制,只有那些定义在该对象的类内部的方法才能访问。

封装这个概念,是一个狠基本的概念,理解了这个,才能理解对象和面向对象编程。


对象的一般结构

将抽象映射到类

实例 instantiation ),这个术语,表示的就是,以某个类为模板来创建一个对象的过程,这样创建的对象,称作该个类的一个 实例 instance )。对于每个类,可以进行多次实例化,每次都会产生一个唯一的对象。由此得出,对于对象的定义就是:

对象

某个类的一个唯一的实例,它封装了自己的实现细节,在结构上,与该个类的其它实例一致。

这个定义,强调了一点,那就是,对于每个类,它的所有对象在结构上都是一致的:它们内部的数据组织方式是相同的,并且能够对相同的方法调用做出响应。然而,正如下图所示,每个对象,其数据可能会具有不同的值,而且通常也是这样的。在图片中,对于SalesPerson 类,有两个实例。两个对象中都封装了相同类型的数据(名字name)、成交率(commissionRate)和总销量(totalSales)。目前,这两个对象,它们的name 和totalSales 两个数据的值互不相同, 而commissionRate 这个数据的值是相同的。这两个对象中,都有两个可被调用的方法:sellCar 和reportSales。


一个类的多个实例

类,和利用这个类所创建的对象,它们之间的关系,类似于,一个工厂和由这个工厂所生产的产品之间的关系。汽车厂,按照自己的方式来生产汽车,Automobile 类,也是以类似的方式来创建Automobile 对象。类似地,Automobile类只能生产Automobile 对象,这跟汽车厂一样,汽车厂只能生产汽车,而无法生产真空吸尘器或火箭飞船。

拟人

开发者们,经常会以一种有生命的、拟人的方式来谈论类和对象:开发者可能会这样说,“这个类,不应当为这件事负责”,或者说,“我预期着这个对象会针对外部的查询回复其当前状态”。开发者甚至可能会假设自己处于那个对象的位置,以便更好地理解它在整个系统的设计中的角色。在这种模式下,开发者可能会问:“我被预期着做出什么行为?”“我该如何完成那件事?”或者,“为什么妳需要知道关于我的那个信息?”。问出这种问题,通常会有助于开发者更直观地理解一个对象,以及它与其它对象之间的关系。

有一个简单且流行的设计技巧,该技巧专注于针对每个对象(或者对象的类)标识出它的 职责 responsibilities 合作关系 (collaborators) 这种技巧,与对象的 图(anthropomorphic)有直观的关系。对 象(或者说类)的职责,指的是, 该对象(或者说类)需要维护 或行使的属性或义务。对象 (或者说类)的合作关系,指的是, 这个指定的对象(或者说类)要与之进行交互的其它对象(或者说类)。职责 和合作关系这两个术语,显然反映了对象 的拟人视图

对于对象 的人格化,反映了两点:一方面,开发者看到了真实世界实体与它的抽象之间的对应关系;另一方面,开发者也看到了,类和对象即为它们在软件中的体现。这个视图,也反映了由对象和类的设计者所确定的自治性(autonomy)和封装性(encapsulation)。

Your opinions

Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands