77
88> “我们没有意识到惯用语言的结构有多大的力量。可以毫不夸张地说,它通过语义反应机制奴役我们。语言表现出来并在无意识中给我们留下深刻印象的结构会自动投射到我们周围的世界。” -- Alfred Korzybski (1930)
99
10- 计算机革命的起源来自机器。编程语言就像是那台机器。它不仅是我们思维放大的工具与另一种表达媒介,更像我们思想的一部分 。语言的灵感来自其他形式的表达,如写作,绘画,雕塑,动画和电影制作。编程语言就是创建应用程序的思想结构。
10+ 计算机革命的起源来自机器。编程语言就像是那台机器。它不仅是我们思维放大的工具与另一种表达媒介,更像是我们思想的一部分 。语言的灵感来自其他形式的表达,如写作,绘画,雕塑,动画和电影制作。编程语言就是创建应用程序的思想结构。
1111
12- 面向对象编程(Object-Oriented Programming OOP)是一种编程思维方式和编码架构。本章讲述 OOP 的基本概述。如果读者对不太理解 ,可先行跳过本章。等你具备一定编程基础后,请务必再回头看。只有这样你才能深刻理解面向对象编程的重要性及设计方式。
12+ 面向对象编程(Object-Oriented Programming OOP)是一种编程思维方式和编码架构。本章讲述 OOP 的基本概述。如果读者对此不太理解 ,可先行跳过本章。等你具备一定编程基础后,请务必再回头看。只有这样你才能深刻理解面向对象编程的重要性及设计方式。
1313
1414## 抽象
1515
2121问题都归纳为决策链。对于这些语言,我们认为它们一部分是“基于约束”的编程,另一部分则是专为
2222处理图形符号设计的(后者被证明限制性太强)。每种方法都有自己特殊的用途,适合解决某一类的问题。只要超出了它们力所能及的范围,就会显得非常笨拙。
2323
24- 面向对象的程序设计在此基础上跨出了一大步,程序员可利用一些工具表达“问题空间”内的元素。由于这种表达非常具有普遍性,所以不必受限于特定类型的问题。我们将问题空间中的元素以及它们在解决方案空间的表示物称作 “对象”(**Object**)。当然,还有一些在问题空间没有对应的对象体。通过添加新的对象类型,程序可进行灵活的调整,以便与特定的问题配合。所以在阅读方案的描述代码时,会读到对问题进行表达的话语 。与我们以前见过的相比,这无疑是一种更加灵活、更加强大的语言抽象方法。总之,OOP 允许我们根据问题来描述问题,而不是根据方案 。然而,仍有一个联系途径回到计算机。每个对象都类似一台小计算机;它们有自己的状态,而且可要求它们进行特定的操作。与现实世界的 “对象”或者“物体”相比,编程“对象”与它们也存在共通的地方 :它们都有自己的特征和行为。
24+ 面向对象的程序设计在此基础上跨出了一大步,程序员可利用一些工具表达“问题空间”内的元素。由于这种表达非常具有普遍性,所以不必受限于特定类型的问题。我们将问题空间中的元素以及它们在解决方案空间的表示称作 “对象”(**Object**)。当然,还有一些在问题空间没有对应的对象体。通过添加新的对象类型,程序可进行灵活的调整,以便与特定的问题配合。所以当你在阅读描述解决方案的代码时,也是在阅读问题的表述 。与我们以前见过的相比,这无疑是一种更加灵活、更加强大的语言抽象方法。总之,OOP 允许我们根据问题来描述问题,而不是根据运行解决方案的计算机 。然而,它仍然与计算机有联系,每个对象都类似一台小计算机:它们有自己的状态并且可以进行特定的操作。这与现实世界的 “对象”或者“物体”相似 :它们都有自己的特征和行为。
2525
26- Smalltalk 作为第一种成功的面向对象程序设计语言和 Java 的基础语言 ,* Alan Kay* 总结了其五大基本特征。通过这些特征,我们可理解“纯粹”的面向对象程序设计方法是什么样的:
26+ Smalltalk 作为第一个成功的面向对象并影响了 Java的程序设计语言 ,* Alan Kay* 总结了其五大基本特征。通过这些特征,我们可理解“纯粹”的面向对象程序设计方法是什么样的:
2727
28- > 1 . ** 万物皆对象** 。你可以将对象想象成一种特殊的变量。它可以存储数据,可以在你对其 “发出请求”时执行本身的操作。理论上讲,你可以从要解决的问题身上抽象出概念性的组件,然后在程序中将其表达为一个对象 。
29- > 2 . ** 程序是一组对象,通过信息传递来告知彼此该做什么 ** 。要请求一个对象,你需要向该对象发送信息 。
28+ > 1 . ** 万物皆对象** 。你可以将对象想象成一种特殊的变量。它存储数据,但可以在你对其 “发出请求”时执行本身的操作。理论上讲,你总是可以从要解决的问题身上抽象出概念性的组件,然后在程序中将其表示为一个对象 。
29+ > 2 . ** 程序是一组对象,通过消息传递来告知彼此该做什么 ** 。要请求调用一个对象的方法,你需要向该对象发送消息 。
3030> 3 . ** 每个对象都有自己的存储空间,可容纳其他对象** 。或者说,通过封装现有对象,可制作出新型对象。所以,尽管对象的概念非常简单,但在程序中却可达到任意高的复杂程度。
31- > 4 . ** 每个对象都有一种类型** 。根据语法,每个对象都是某个“类”的一个“实例”。其中,“类”(Class)是“类型”(Type)的同义词。一个类最重要的特征就是“能将什么信息发给它 ?”。
32- > 5 . ** 同一类所有对象都能接收相同的信息 ** 。这实际是别有含义的一种说法,大家不久便能理解。由于类型为“圆”(Circle)的一个对象也属于类型为“形状”(Shape)的一个对象,所以一个圆完全能接收形状信息 。这意味着可让程序代码统一指挥“形状”,令其自动控制所有符合“形状”描述的对象,其中自然包括“圆”。这一特性称为对象的“可替换性”,是OOP最重要的概念之一。
31+ > 4 . ** 每个对象都有一种类型** 。根据语法,每个对象都是某个“类”的一个“实例”。其中,“类”(Class)是“类型”(Type)的同义词。一个类最重要的特征就是“能将什么消息发给它 ?”。
32+ > 5 . ** 同一类所有对象都能接收相同的消息 ** 。这实际是别有含义的一种说法,大家不久便能理解。由于类型为“圆”(Circle)的一个对象也属于类型为“形状”(Shape)的一个对象,所以一个圆完全能接收发送给"形状”的消息 。这意味着可让程序代码统一指挥“形状”,令其自动控制所有符合“形状”描述的对象,其中自然包括“圆”。这一特性称为对象的“可替换性”,是OOP最重要的概念之一。
3333
34- * Grady Booch* 提供了对对象更简洁的描述:一个对象具有自己的状态,行为和身份 。这意味着对象有自己的内部数据(由状态提供 )、方法 (由特性提供 ),并彼此区分(每个对象在内存中都有唯一的地址)。
34+ * Grady Booch* 提供了对对象更简洁的描述:一个对象具有自己的状态,行为和标识 。这意味着对象有自己的内部数据(提供状态 )、方法 (产生行为 ),并彼此区分(每个对象在内存中都有唯一的地址)。
3535
3636
3737## 接口
3838
39- 亚里士多德(* Aristotle* )大概是第一个认真研究“类型”的哲学家,他曾提出过“鱼和鸟类 ”这样的概念。所有对象都是唯一的,但同时也是具有相同的特性和型位的对象所归属的类的一部分 。这种思想被首次应用于第一个面向对象编程语言 Simula-67,它在程序中使用基本关键字 ** class** 来引入新的类型(class 和 type 通常可互换使用,有些人对它们进行了进一步区分,他们强调 type 决定了接口,而 class 是那个接口的一种特殊实现方式)。
39+ 亚里士多德(* Aristotle* )大概是第一个认真研究“类型”的哲学家,他曾提出过“鱼类和鸟类 ”这样的概念。所有对象都是唯一的,但同时也是具有相同的特性和行为的对象所归属的类的一部分 。这种思想被首次应用于第一个面向对象编程语言 Simula-67,它在程序中使用基本关键字 ** class** 来引入新的类型(class 和 type 通常可互换使用,有些人对它们进行了进一步区分,他们强调 type 决定了接口,而 class 是那个接口的一种特殊实现方式)。
4040
41- Simula 是一个很好的例子。正如这个名字所暗示的,它的作用是“模拟”(Simulate)类似“银行出纳员”这样的经典问题。在这个例子里,我们有一系列出纳员、客户、帐号以及交易等 。每类成员(元素)都具有一些通用的特征:每个帐号都有一定的余额;每名出纳都能接收客户的存款;等等。与此同时,每个成员都有自己的状态;每个帐号都有不同的余额;每名出纳都有一个名字。所以在计算机程序中,能用独一无二的实体分别表示出纳员、客户、帐号以及交易。这个实体便是“对象”,而且每个对象都隶属一个特定的“类”,那个类具有自己的通用特征与行为。
41+ Simula 是一个很好的例子。正如这个名字所暗示的,它的作用是“模拟”(Simulate)类似“银行出纳员”这样的经典问题。在这个例子里,我们有一系列出纳员、客户、帐号、交易和货币单位等许多"对象” 。每类成员(元素)都具有一些通用的特征:每个帐号都有一定的余额;每名出纳都能接收客户的存款;等等。与此同时,每个成员都有自己的状态;每个帐号都有不同的余额;每名出纳都有一个名字。所以在计算机程序中,能用独一无二的实体分别表示出纳员、客户、帐号以及交易。这个实体便是“对象”,而且每个对象都隶属一个特定的“类”,那个类具有自己的通用特征与行为。
4242
43- 因此,在面向对象的程序设计中,尽管我们真正要做的是新建各种各样的数据“类型”(Type),但几乎所有面向对象的程序设计语言都采用了 ` class ` 关键字。当你看到“type”这个字的时候 ,请同时想到 ` class ` ;反之亦然。
43+ 因此,在面向对象的程序设计中,尽管我们真正要做的是新建各种各样的数据“类型”(Type),但几乎所有面向对象的程序设计语言都采用了 ` class ` 关键字。当你看到“type”这个词的时候 ,请同时想到 ` class ` ;反之亦然。
4444
4545创建好一个类后,可根据情况生成许多对象。随后,可将那些对象作为要解决问题中存在的元素进行处理。事实上,当我们进行面向对象的程序设计时,面临的最大一项挑战性就是:如何在“问题空间”(问题实际存在的地方)的元素与“方案空间”(对实际问题进行建模的地方,如计算机)的元素之间建立理想的“一对一”的映射关系。
4646
@@ -55,11 +55,11 @@ Light lt = new Light();
5555lt. on();
5656```
5757
58- 在这个例子中,类型/类的名称是 ** Light** ,可向 ** Light** 对象发出的请求包括包括打开 ` on ` 、关闭 ` off ` 、变得更明亮 ` brighten ` 或者变得更暗淡 ` dim ` 。通过声明一个引用,如 ` lt ` 和 ` new ` 关键字,我们为 ** Light** 类对象创建了一个对象 ,再用等号将其赋给引用。
58+ 在这个例子中,类型/类的名称是 ** Light** ,可向 ** Light** 对象发出的请求包括包括打开 ` on ` 、关闭 ` off ` 、变得更明亮 ` brighten ` 或者变得更暗淡 ` dim ` 。通过声明一个引用,如 ` lt ` 和 ` new ` 关键字,我们创建了一个 ** Light** 类型的对象 ,再用等号将其赋给引用。
5959
60- 为了向对象发送信息 ,我们使用句点符号 ` . ` 将 ` lt ` 和信息名称 ` on ` 连接起来。可以看出,使用一些预先定义好的类时,我们在程序里采用的代码是非常简单和直观的 。
60+ 为了向对象发送消息 ,我们使用句点符号 ` . ` 将 ` lt ` 和消息名称 ` on ` 连接起来。可以看出,使用一些预先定义好的类时,我们在程序里采用的代码是非常简单直观的 。
6161
62- 上图遵循 ** UML** (Unified Modeling Language,统一建模语言)的格式。每个类由一个框表示,框的顶部有类型名称,框中间部分要描述的任何数据成员,以及方法 (属于此对象的方法,它们接收任何发送到该对象的信息 )在框的底部。通常,只有类的名称和公共方法在 ** UML** 设计图中显示,因此中间部分未显示,如本例所示。如果你只对类名感兴趣,则也不需要显示方法信息。
62+ 上图遵循 ** UML** (Unified Modeling Language,统一建模语言)的格式。每个类由一个框表示,框的顶部有类型名称,框中间部分是要描述的任何数据成员,方法 (属于此对象的方法,它们接收任何发送到该对象的消息 )在框的底部。通常,只有类的名称和公共方法在 ** UML** 设计图中显示,因此中间部分未显示,如本例所示。如果你只对类名感兴趣,则也不需要显示方法信息。
6363
6464
6565## 服务提供
0 commit comments