《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 opinionsHxLauncher: Launch Android applications by voice commands