面向对象概念解析
2008-08-29 15:05
369 查看
1. 软件开发过程中的视角
1.1 概念视角:这种视角“呈现了所研究领域中的各种概念。。。得出概念模型时应该很少或者不考虑实现他的软件。。。”。该视角要回答的问题是:“软件要负责什么?”
1.2 规约视角:“现在我们要考虑的是软件,但我们关注的是软件的接口,而不是实现。”该视角回答的问题是:“怎么使用软件?”
1.3 实现视角:这时我们考虑的是代码本身。“这可能是最常用的视角,但在许多方面,采取规约视角经常会跟更好。”该视角会的问题是“软件怎么履行自己的责任?”
2. 对象:传统看法与新看法
传统上对象被视为具有属性、方法的数据体。“开始时描述问题领域中的状态数据,然后添加处理数据的方法(必要的行为所需要的),瞧,对象就有了”这是种太简单,太肤浅的定义。这其实只是从实现的视角来看待对象而已。
更有意义的定义应该是从概念视角出发——对象是“具有责任的一个实体”。这些责任定义了对象的行为。有时候还将对象视为具有特定行为的实体。这样定义有助我们关注对象的意图行为,而不是对象实现。这种理解能够以两步构建软件:
1) 先做出一个初步的设计,不用操心所有的相关细节。
2) 实现设计。
这种方式我们只需关注对象的公开行为接口。不需要知道对象内是怎样运作以及怎样处理我传递给他的信息等其他内部流程。
用视角来观察对象:
1) 概念层次上,对象是一组责任。
2) 规约层次上,对象是一组可以被其他对象或对象自己调用的方法(也称行为)。
3) 实现层次上,对象是代码和数据,以及他们之间的计算交互。
如何寻找问题域中的对象呢?在面向对象方法中,设计人员应该了解问题域,找到其中的名词,然后创建对象来表示这些名词,这些几乎是天经地义的。接下来设计人员寻找与这些名词相关的动词(也就是它们的操作),并通过在对象中添加方法来实现这些动词。这种以名词和动词为中心的过程通常会生成超出我们意愿的庞大类层次。我认为,在创建对象时使用共性和可变性味主要工具,要优于仅仅关注名词和动词。
3. 封装:传统看法与新看法
传统上封装被视为数据的隐藏,而封装更应该被视为“任何形式的隐藏”。换句话说,可以隐藏数据,还可以隐藏以下东西:
实现细节
派生类
设计实现
实例化规则
将其定义扩展后,可以 用封装来创建对象之间的层——这样我就可以对位于层一侧的东西进行修改,而不会对另外一侧造成不良影响。
类型封装是通过多态使用具有派生类的抽象类(或者具有多个实现的接口)实现的。使用抽象类的客户代码无需知道派生类的实际类型
发现变化并将其封装,最好将变化封装在一个抽象类“之后”。
许多开发人员都持有一种偏见是:他们往往认为“一个包含了另外一个对象的对象”本质上与“一个具有存数据成员的对象”完全不同。但是那些看似不是对象的数据成员(例如:整型数和双精度数)实际上都是对象。在真正的面向对象语言中,万事万物皆为对象,甚至内置数据类型也就是对象。
用对象的属性包含变化,和利用对象的行为包换变化其实非常相似。例如:一个系统需要销售数据,收据有合计一项。开始用double类型表示,但是,需求变化程序在世界各地使用,很快意识到需要解决货币兑换,因此需要创建一个Money类,用来包含数量和货币类。现在总计变成一个Money类型了。
4. 共性和可变性分析与抽象类
共性分析就是寻找一些共同的要素,它们能够帮我们理解系列成员的共同之处。也就是在问题领域中找到系列成员的不同变化,找到变化点就是“共性分析”。如果变化就是“变性分析”例如展示一只铅笔、一只园珠笔和一只毛笔,共同点他们是“书写工具”。你所做的识别其共同点的过程就是”共性分析“。三只笔做为书写工具有何差异就是“变性分析”。
可变性分析揭示了系列成员之间的不同。可变性只有在给定了共性之后才有意义。
5. 面向对象概念之间的关系
下表表示共性和可变性分析、3层视角、 抽象类及其接口和抽象类的派生类之间的关系
从表中可以看到,共性分析与问题领域的概念视角是相互关联的,而可变性分析与实现视角是相互关联的。规约视角位于其中,共性和可变性都要涉及这个视角。规约描述了如何与一组概念上相似的对象通信。这些对象每一个都代表了公共概念的一种变化。在实现层次上这个规约将抽象为抽象类或接口。
下表与抽象类对应的关系
规约视角和概念视角之间的关系在于:规约标识了用来处理此概念所有情况(即概念视角所定义的共性)所需的接口。
规约视角和实现视角之间的关系在于:对于给定的规约,怎样实现这个特定情况(这个变化)?
1.1 概念视角:这种视角“呈现了所研究领域中的各种概念。。。得出概念模型时应该很少或者不考虑实现他的软件。。。”。该视角要回答的问题是:“软件要负责什么?”
1.2 规约视角:“现在我们要考虑的是软件,但我们关注的是软件的接口,而不是实现。”该视角回答的问题是:“怎么使用软件?”
1.3 实现视角:这时我们考虑的是代码本身。“这可能是最常用的视角,但在许多方面,采取规约视角经常会跟更好。”该视角会的问题是“软件怎么履行自己的责任?”
2. 对象:传统看法与新看法
传统上对象被视为具有属性、方法的数据体。“开始时描述问题领域中的状态数据,然后添加处理数据的方法(必要的行为所需要的),瞧,对象就有了”这是种太简单,太肤浅的定义。这其实只是从实现的视角来看待对象而已。
更有意义的定义应该是从概念视角出发——对象是“具有责任的一个实体”。这些责任定义了对象的行为。有时候还将对象视为具有特定行为的实体。这样定义有助我们关注对象的意图行为,而不是对象实现。这种理解能够以两步构建软件:
1) 先做出一个初步的设计,不用操心所有的相关细节。
2) 实现设计。
这种方式我们只需关注对象的公开行为接口。不需要知道对象内是怎样运作以及怎样处理我传递给他的信息等其他内部流程。
用视角来观察对象:
1) 概念层次上,对象是一组责任。
2) 规约层次上,对象是一组可以被其他对象或对象自己调用的方法(也称行为)。
3) 实现层次上,对象是代码和数据,以及他们之间的计算交互。
如何寻找问题域中的对象呢?在面向对象方法中,设计人员应该了解问题域,找到其中的名词,然后创建对象来表示这些名词,这些几乎是天经地义的。接下来设计人员寻找与这些名词相关的动词(也就是它们的操作),并通过在对象中添加方法来实现这些动词。这种以名词和动词为中心的过程通常会生成超出我们意愿的庞大类层次。我认为,在创建对象时使用共性和可变性味主要工具,要优于仅仅关注名词和动词。
3. 封装:传统看法与新看法
传统上封装被视为数据的隐藏,而封装更应该被视为“任何形式的隐藏”。换句话说,可以隐藏数据,还可以隐藏以下东西:
实现细节
派生类
设计实现
实例化规则
将其定义扩展后,可以 用封装来创建对象之间的层——这样我就可以对位于层一侧的东西进行修改,而不会对另外一侧造成不良影响。
类型封装是通过多态使用具有派生类的抽象类(或者具有多个实现的接口)实现的。使用抽象类的客户代码无需知道派生类的实际类型
发现变化并将其封装,最好将变化封装在一个抽象类“之后”。
许多开发人员都持有一种偏见是:他们往往认为“一个包含了另外一个对象的对象”本质上与“一个具有存数据成员的对象”完全不同。但是那些看似不是对象的数据成员(例如:整型数和双精度数)实际上都是对象。在真正的面向对象语言中,万事万物皆为对象,甚至内置数据类型也就是对象。
用对象的属性包含变化,和利用对象的行为包换变化其实非常相似。例如:一个系统需要销售数据,收据有合计一项。开始用double类型表示,但是,需求变化程序在世界各地使用,很快意识到需要解决货币兑换,因此需要创建一个Money类,用来包含数量和货币类。现在总计变成一个Money类型了。
4. 共性和可变性分析与抽象类
共性分析就是寻找一些共同的要素,它们能够帮我们理解系列成员的共同之处。也就是在问题领域中找到系列成员的不同变化,找到变化点就是“共性分析”。如果变化就是“变性分析”例如展示一只铅笔、一只园珠笔和一只毛笔,共同点他们是“书写工具”。你所做的识别其共同点的过程就是”共性分析“。三只笔做为书写工具有何差异就是“变性分析”。
可变性分析揭示了系列成员之间的不同。可变性只有在给定了共性之后才有意义。
5. 面向对象概念之间的关系
下表表示共性和可变性分析、3层视角、 抽象类及其接口和抽象类的派生类之间的关系
共性分析 | 概念视角 | 抽象类/接口 |
共性分析、可变性分析 | 规约视角 | 抽象类/接口、派生类 |
可变性分析 | 实现视角 | 派生类 |
从表中可以看到,共性分析与问题领域的概念视角是相互关联的,而可变性分析与实现视角是相互关联的。规约视角位于其中,共性和可变性都要涉及这个视角。规约描述了如何与一组概念上相似的对象通信。这些对象每一个都代表了公共概念的一种变化。在实现层次上这个规约将抽象为抽象类或接口。
下表与抽象类对应的关系
抽象类与核心概念 | 抽象类代表了将所有的派生类联系起来的核心概念。正是这个核心概念定义了派生类的共性 |
共性与要使用的抽象类 | 共性定义了需要使用的抽象类 |
可变性与抽象的派生类 | 在共性中辨别出的可变性将成为抽象类的派生类 |
规约与抽象类的接口 | 这些类的接口对应于规约层次 |
规约视角和概念视角之间的关系在于:规约标识了用来处理此概念所有情况(即概念视角所定义的共性)所需的接口。
规约视角和实现视角之间的关系在于:对于给定的规约,怎样实现这个特定情况(这个变化)?
相关文章推荐
- 解析JavaScript面向对象概念中的Object类型与作用域
- 解析JavaScript面向对象概念中的Object类型与作用域
- JSON数据格式解析(面向对象概念的体现)
- 24_面向对象程序设计(原型【七】深入解析原型继承的概念
- 代码解析面向对象概念
- 虚函数 (virtual) --- 面向对象之概念解析
- 18--26 面向对象程序设计24(深入解析原型继承的概念)
- 一篇不错的面向对象概念的解释
- Java中面向对象与内存解析
- 面向对象开发与面向对象设计模式的几个核心的思想和概念 -java
- 面向对象程序设计与面向过程程序设计解析
- 面向对象基本先关概念
- PHP面向对象学习笔记之一 基础概念
- JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念
- C++学习4-面向对象编程基础(面向对象概念,定义类,定义对象)
- UML类图和对象图概念及其区别解析
- C#2.0学习3--面向对象基本概念
- 【17-06-19】Java进阶自测:面向对象基础知识掌握了吗?(附答案及个人解析)
- 面向对象和模式概念篇
- PHP面向对象继承的概念