对象导论外文翻译资料

 2023-03-15 04:03

对象导论

关键词:抽象,对象,实现

抽象过程

所有的编程语言都提供了抽象概念。可以认为,人们所能够解决的问题的复杂性与抽象的类型和质量直接相关。所谓的“类型”是指“所抽象的是什么?”汇编语言是对底层机器的轻微抽象。接着出现的许多所谓“命令式”语言(如FORTRAN、BASIC、C等)都是对汇编语言的抽象。这些语言在汇编语言基础上有了大幅的改进,但是它们所作的主要抽象仍要求在解决问题时要基于计算机的结构,而不是基于所要解决的问题的结构来考虑。程序员必须建立起在机器模型(位于“解空间”内,这是对问题建模的地方,例如计算机)和实际待解问题的模型(位于“问题空间”内,这是问题存在的地方,例如一项业务)之间的关联。建立这种映射是费力的,而且这不属于编程语言所固有的功能,这使得程序难以编写,并且维护代价高昂,同时也产生了作为副产物的整个“编程方法行业”。

另一种对机器建模的方式就是只针对待解问题建模。早期的编程语言,如LISP和APL,都选择考虑世界的某些特定视图(分别对应于“所有问题最终都是列表”或者“所有问题都是算法形式的”)。PROLOG则将所有问题都转换成决策链。此外还产生了基于约末条件编程的语言和专门通过对图形符号操作来实现编程的语言(后者被证明限制性过强)。这些方式对于它们所要解决的特定类型的问题都是不错的解决方案,但是一但超出其特定领域,它们就力不从心了。

面向对象方式通过向程序员提供表示问题空间中的元素的工具而更进了一步。这种表示法足够通用,使得程序员不会受限于任何特定类型的问题。我们将问题空间中的元素及其在解空间中的表示称为“对象”。(你还需要一些无法类比为问题空间元素的对象。)这种思想的实质是:程序可以通过添加新类型的对象来使自身适用于某个特定问题。因此,当你在阅读描述解决方案的代码时,也是在阅读问题的表述。这是一种比我们以前更灵活、更强大的语言抽象。所以,OOP允许根据问题来描述问题,而不是根据运行解决方案的计算机。但它仍然有与计算机的连接:每个对象看起来很像一台小型计算机——它有状态,它有你可以要求它执行的操作。如果要对现实世界中的对象作类比,那么说它们都具有特性和行为似乎不错。

Alan Kay总结了第一个成功的面向对象语言、同时也是Java所基于的语言之一的Smalltalk的五个基本特性。这些特性代表一种纯粹的面向对象程序设计方式:

1.万物皆为对象。把对象看作一个奇特的变量;它可以存储数据,除此之外,你还可以要求它在自身上执行操作。理论上,你可以采用在你尝试解决的问题中的任何概念性组件(狗、建筑物、服务等)并将其表示为程序中的对象。

2.程序是一堆对象,通过发送消息来告诉对方该做什么。要对某个对象发出请求,需要向该对象“发送消息”。更具体地说,可以将消息视为调用属于特定对象的方法的请求。

3.每个对象都有自己的由其他对象所构成的存储。换句话说,可以通过创建一个包含现有对象的包来创建一种新类型的对象。因此,可以在程序中构建复杂性,同时将其隐藏在对象的简单性后面。

4.每个对象都有一个类型。用这种说法,每个对象都是类的一个实例,其中“类”是“类型”的同义词。一个类最重要的区别特征是“可以向它发送什么信息?”

5.一个特定类型的所有对象都可以接收到相同的消息。这实际上是一个加载语句,稍后你将看到。因为“圆”类型的对象也是“形状”类型的对象,所以圆可以保证接受发给形状对象的消息。这意味着可以编写与形状交互并自动处理所有与形状性质相关的事物的代码。这种可替代性是 OOP 中强大的概念之一。

Booch提供了一个更简洁的对对象的描述:

对象具有状态、行为和标识。

这意味着一个对象可以拥有内部数据(给它状态)、方法(产生行为),并且每个对象都可以与其他对象有唯一的区别——将其放在具体意义上,每个对象在内存中都有一个唯一的地址。

对象提供服务

当试图开发或理解一个程序设计时,最好的方法之一就是将对象想像为“服务提供者”。程序本身将为用户提供服务,它将通过使用其他对象提供的服务来实现这一点。你的目标是创建(或者更好的是在现有代码库中寻找)提供理想的服务来解决问题的一组对象。

开始这样做的一种方法是问自己,“如果我可以将问题从表象中抽取出来,那么什么样的对象可以马上解决我的问题呢?”例如,假设你正在创建一个簿记程序。可能会想象系统应该具有某些包括了预定义的薄记输入屏幕的对象,一个执行簿记计算的对象集合,以及一个处理在不同的打印机上打印支票和开发票的对象。也许其中一些对象已经存在,而对于那些不存在的对象,它们会是什么样子?这些对象将提供哪些服务?它们需要哪些对象来履行其义务?如果你继续这样做,你最终会说“那个对象看起来很简单,可以坐下来写代码了”或“我确定那个对象一定已经存在”。这是将问题分解为对象集合的一种合理方式。

将对象视为服务提供者还有一个额外的好处:它有助于提高对象的内聚性。高内聚性是软件设计的一种基本质量:意味着软件构件的各个方面(比如一个对象,当然这也适用于一个方法或一个对象库)可以很好地“组合”在一起。人们在设计对象时遇到的一个问题是,在一个对象中填充了太多的功能。例如,在检查打印模块中,你可能决定需要一个了解格式和打印技术的对象。你可能会发现,这对于一个对象来说太多了,你所需要的是三个或更多的对象。一个对象可能是所有可能的支票排版的目录,可以查询有关如何打印支票的信息。 一个对象或一组对象可能是一个通用的打印接口,它了解所有关于不同类型的打印机(但对簿记一无所知——这个是购买而不是自己编写的对象)。第三个对象可以使用其他两个对象的服务来完成任务。因此,每个对象都有它提供的一组内聚的服务。在一个好的面向对象设计中,每个对象都做好一件事,但不会尝试做太多。这不仅允许通过购买获得的对象(打印机接口对象),而且还可以创建能在其他地方重复使用的新对象(支票排版目录对象)。

将对象视为服务提供者是一个很好的简化工具。这不仅在设计过程中很有用,而且在其他人试图理解你的代码或重用对象时也很有用。如果他们可以根据对象提供的服务来了解对象的价值,则可以更轻松地将其融入设计中。

被隐藏的具体实现

将程序开发人员分成类创建者(创建新数据类型的人)和客户端程序员(在其应用程序中使用数据类型的类消费者)是有帮助的。客户端程序员的目标是收集各种用来实现快速应用开发的类。类创建者的目标是构建类,该类只向客户端程序员公开必要的内容,并隐藏其他内容。为什么?因为如果它被隐藏了,客户端程序员就无法访问它,这意味着类创建者可以随意更改被隐藏的部分,而不用担心对其他人的影响。被隐藏的部分通常代表对象内部脆弱的部分,很容易被粗心或不知情的客户端程序员破坏,因此隐藏实现可以减少程序错误。

在任何关系中,重要的是要具有所有相关方都尊重的界限。当你创建一个类库时,你与客户端程序员建立了关系,他们也是程序员,但是他们是使用你的类库来构建应用、或者构建更大的类库的程序员。如果所有的类成员对任何人都是可用的,那么客户端程序员就可以对类做任何事情,而不受任何约束。即使你希望客户端程序员不要直接操作你的类中的某些成员,但是如果没有任何访问控制,将无法阻止此事发生。一切对世界都是赤裸裸的。

因此,访问控制的第一个存在原因就是让客户端程序员无法触及他们不应该触及的部分——这些部分对数据类型的内部操作来说是必需的,但并不是用户解决特定问题所需的接口的一部分。这实际上是对客户端程序员的一项服务,因为他们可以很容易地看到对他们来说什么是重要的,什么是他们可以忽略的。

访问控制的第二个存在原因是允许库设计者改变类的内部工作方式而不用担心它会到影响客户端程序员。例如,你可能以一种简单的方式实现一个特定的类以简化开发,然后发现你需要重写它以使其运行得更快。如果接口和实现被明确地分开和保护,你可以很容易地做到这一点。

Java用三个关键字在类的内部设定边界:public、private、protected。这些访问指定词决定了紧跟其后被定义的东西可以被谁使用。public表示紧随其后的元素对任何人都是可用的,而private这个关键字表示除类型创建者和类型的内部方法之外的任何人都不能访问的元素。private就像你与客户端程序员之间的一堵砖墙,如果有人试图访问private成员,就会在编译时得到错误信息。而protected关键字与private作用相当,差别仅在于继承的类可以访问protected成员,但是不能访问private成员。稍后将会对继承进行介绍。

Java还具有“默认”访问权限,当没有使用前面提到的任何访问指定词时,它将发挥作用。这种权限通常被称为包访问权限,因为在这种权限下,类可以访问在同一个包(库构件)中的其他类的成员,但是在包之外,这些成员如同指定了private一样。

外文原文资料信息

[1] 外文原文作者:Bruce Eckel

[2] 外文原文所在书名或论文题目:Introduction to Objects

[3] 外文原文来源:Thinking in Java 4th Edition P15~20

二、外文原文资料:

Introduction to Objects

Keywords: abstractions, object, implementation

The progress of abstraction

All programming languages provide abstractions. It can be argued that the complexity of the problems yoursquo;re able to solve is directly related to the kind and quality of abstraction. By “kind” I mean, “What is it that you are abstracting?” Assembly language is a small abstraction of the underlying machine. Many so-called “imperative” languages that followed (such as FORTRAN, BASIC, and C) were abstractions of assembly language. These languages are big improvements over assembly language, but their primary abstraction still requires you to think in terms of the structure of the computer rather than the structure of the problem you are trying to solve. The programmer must establish the association between the machine model (in the “solution space,” which is the place where yoursquo;re implementing that solution, such as a computer) and the model of the pro

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[595979],资料为PDF文档或Word文档,PDF文档可免费转换为Word

您需要先支付 30元 才能查看全部内容!立即支付

课题毕业论文、文献综述、任务书、外文翻译、程序设计、图纸设计等资料可联系客服协助查找。