《程序设计与数据结构》——什么是类?
,但只要正确使用面向对象分析(Ogject Oriented Analysis,OOA)和面向对象设计(Object Oriented Design,OOD)就能得到具有价值的领域模型和设计模型。OOA、OOD与OOP到底是什么关系?OOA的结果可以作为OOD开始的模型,OOD的结果可以作为蓝图,利用OOP方法实现一个系统。
在OOA和OOD中,不需要考虑特定的语言机制,"关键是寻找并解决业务问题,完成概念分析和设计。在OOA和OOD的早期,开发者的主要任务有两项:
● 从需求的词汇表中确定类;
● 创建一些结构,让多组对象一起工作,提供满足需求的行为。
通常我们将这样的类和对象统称为问题域的关键抽象,即关键抽象反映了问题域的词汇表,可以从问题域中发现,也可以作为设计的一部分发明;将这些协作结构称为实现的机制,其考虑的是许多不同类型的对象之间的协作活动。
确定关键抽象包括两个过程:发现和发明,通过与领域专家(用户)交流,将会发现领域专家所使用的抽象。如果领域专家提及它,那么这个抽象通常是很重要的,比如,范围值校验器RangeValidator。而发明就是创造新的类和对象的过程,虽然它们不一定是问题域的组成部分,但在设计或实现中也是很重要的。比如,微型数据库、链表、栈、队列等。这些关键抽象是具体设计的结果,不属于问题域。因此在设计过程中,开发者不仅需要考虑单个类的设计,还要考虑这些类的实例如何一起工作,并使用场景驱动分析过程。由此可见,关键抽象反映了业务领域的抽象,机制是设计的灵魂。
假设希望对push到栈中的值,既可以进行范围值校验,也可以进行偶校验。从面向对象的角度来看,首先要从问题的描述中发现对象,当找到对象后,接着开始通过共性和差异性分析这些对象所具有的属性和行为,然后利用面向对象的封装机制将其封装成类。
根据问题的描述,范围值校验器就是一个RangeValidator具体类,其属性是范围值校验参数min和max,其行为就是将符合范围要求的数值push到栈中。因此只要将RangeValidator的属性和行为作为成员封装到结构体中,就形成了RangeValidator类,这是面向过程编程的C程序员最容易想到,也最容易理解的方法。
为了支持这种风格,C允许将方法作为某个结构体的一部分来声明,那么操作存储在结构体中的数据就很容易了,详见程序清单 2.18。
程序清单4.1范围值校验器类接口
1 typedef struct _RangeValidator{
2 bool (*const RangeValidate)(struct _RangeValidator *pThis, int value);
3 const int min;
4 const int max;
5 }RangeValidator;
6
7 RangeValidator rangeValidator;
其中,类名字的首字母为大写,对象名字的首字母为小写。由此可见,通过扩展已有结构体的概念创造了一个全新的概念——类,类如同种类一样,定义一个类就是在创造一个新的数据类型。虽然声明一个类的变量如同声明一个结构体的变量一样,但声明一个类的变量被称为对象,因此有了类即可声明一个RangeValidator类的对象rangeValidator。通常也称rangeValidator对象是RangeValidator类的一个实例,就是创建类的一个实例的过程。
在进行范围值校验时,首先需要判断value值是否符合要求?validateRange()函数接口的实现详见程序清单 2.19。
程序清单 4.2 范围值校验器接口函数的实现
1 bool validateRange(RangeValidator *pThis, int value)
2 {
3 return pThis -> min <= value && value <= pThis -> max;
4 }
偶校验器OddEvenValidator具体类和对象oddEvenValidator的定义详见程序清单 2.20。
程序清单 4.3 偶校验器类接口
1 typedef struct _OddEvenValidator{
2 bool (*const OddEvenValidate)(struct _OddEvenValidator *pThis, int value);
3 bool isEven;
4 }OddEvenValidator;
5
6 OddEvenValidator oddEvenValidator;
在进行偶校验时,同样需要判断value值是否符合要
周立功 相关文章:
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)
- 算法的泛化问题,这些坑你可能都经历过!|周立功教你学软件设计(08-01)