• 2009-04-27

    CLIPS中文用户手册(20) - [日志纪事]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://penning.blogbus.com/logs/38559246.html

    第八章 继承事项

    获取财富最简单的办法莫过于继承遗产,其次就是剥削他人的劳动,与财富联姻太像一项工作了。

    本章为CLIPS面向对象编程的概述章节。与基于规则的编程不同,基于规则的编程中,你可以不用考虑系统中其它的东西,而及时投入进去,编写规则,而面向对象的编程需要许多重要的背景资料。

    如何客观

    好的程序设计的一个重要特性是应具有灵活性(flexibility)。不幸的是,结构化编程技术刻板的方法论不能提供快速,可靠和高效变化的灵活性。面向对象编程范式(object-oriented programming (OOP) paradigm)提供了这种灵活性。

    术语——范式来源于希腊语paradeigma,意思是一个模型,例子或模式。在计算机科学中,范式为一致的,有组织的尝试解决问题的方法论。当前,有很多的设计范式,如OOP,过程式的(procedural),基于规则的(rule-based)和联系式的(connectionist)。术语——“人工神经网络”(artificial neural systems),是旧术语“联接”(connectionist)的现代同义词。

    传统的程序设计是过程化的,因为它强调在解决问题中的算法和程序。有相当多的语言被开发以支持这样的过程化范式,如PascalCAdaFORTRANBASIC。这些语言同样也适用于面向对象的设计(object-oriented design (OOD)),它们通过增加延伸或利用程序员的设计方法学。相比而言,新的语言已经被设计出来,用以提供OOP,与OOD并不一样。你可以在任意语言中使用OOD,甚至汇编语言。

    CLIPS提供三个范式:规则,对象和过程。你将在CLIPS面向对象语言(CLIPS Object-Oriented Language (COOL))中了解到更多关于对象的信息,COOL整合了规则和过程两个CLIPS基本范式。CLIPS通过类属函数,自定义函数和用户自定义外部函数来支持过程化范式。视应用程序的不同,你可以选择使用规则,对象,过程或是它们的组合。

    与其利用单个的范式,我们的哲学是:多种专门工具,多范式途径要比尝试去强制所有人使用单一万能的工具。类似的,你可以用锤子和钉子来固定一切,但同时也有很多其他首选的方法来固定某物。举个例子,想象一下你用锤子和钉子来代替拉链来扣紧你的裤子吧。(注意:如果有人使用锤子和钉子来扣紧裤子,那么请联系吉尼斯世界纪录吧!)

    OOP中,类是描述具有相同特性和属性(attributes)的对象的模板。注意这里使用的术语——“模板”与前面所讲的自定义模板(deftemolate)是两码事。这里,模板一词用的是工具的表意,用来构建具有相同属性的对象。类似的,直尺是画直线的模板,饼干模子是做出曲奇的模板。

    对象的类在层次和图线上被安排来描述系统中对象之间的关系。每个类都是实际系统或其他一些我们正尝试塑造的逻辑系统的抽象。举个例子,一个现实系统的抽象有可能是一辆汽车,逻辑系统的另一个抽象模型可能是金融证券,如股票,契约或复数。术语——抽象一词引用于两点,(1)对现实对象或其他我们正尝试塑造系统的抽象描述。(2)用术语类表示一个系统的过程。抽象是一个真正OOP语言所广泛接受的五个特征之一。其他分别是继承(inheritance),封装(encapsulation),多样性(polymorphism)和动态绑定(dynamic binding)。当你通读本书后将会对以上术语有所详细了解。CLIPS支持以上五种特性。

    抽象一词意味着我们不用关注一些非实质性的细节。复杂系统的抽象描述是一种集中于指定目标重大信息的精简描述。那样,系统就被更简单,易懂的模型表示了。作为一个熟悉的例子,当某人开车的时候,他利用的是包含两个部分——转向轮和油门的抽象驾驶模型。这样,人们不会去关心组成摩托车的上百个零部件和内部燃烧发动机的理论知识,交通法规等等了。知道怎样使用转向轮和油门就是他们驾驶的抽象模型。

    继承是OOP的五个基础特性之一。类在继承的设计上,遵循将最一般的类放在顶层,最特殊化的类放在底层。这允许新的类被作为特殊定制或对已存在类修改而重新定义。

    继承的使用可以大大加速软件的开发和增加可靠性,因为建立一个新的软件,不必要每次从编写新的程序白手起家。OOP利用可再用代码(reusable code)使得以上变得简单。OOP程序员常常利用包含成百上千个对象的对象库,这些对象能被使用或作为设计新程序而修改。除了公共领域的对象库,还有许多公司市场商业化对象库。尽管可再用软件组件的概念早已在1960FORTRAN子程序库中被贯彻,但是它还从未被如此成功的应用于通用软件开发中。

    定义一个类,你必须指定被定义类的一个或多个父类(parent classes)或超类(superclasses)。关于超类的比如,每个人都有父母,没有哪个人是天然就存在的(尽管有些时候你也许想知道某些人是否真的有父母)。超类相对的是子类(child class)和亚类(subclass)

    这些决定新类的继承。子类继承属性来源于一个或多个超类。COOL中的属性一词引用于对象的道具(properties),被命名为槽(slot)来描述它。举个例子,一个表示人的对象可能包含有姓名,年龄,地址等等的槽。

    实例(instance)是拥有了槽值的对象,如约翰.史密斯,28岁,清湖市主街道1000号。底层类自动继承高层类的槽,除非某个槽被显式的关闭了。除了继承的槽值被设置所有的属性,新的槽也被定义来描述类。

    对象的行为(behavior)由它的消息句柄(message-handlers)或槽的操作(handlers)。对象的消息句柄对消息(messages)响应和执行要求的行为。举个例子,发送消息:

     

    (send [John_Smith] print)

     

    将引起相应的消息句柄以打印实例John_Smith的槽值。实例通常被指定在中括号[](brackets)内。消息由send函数开始,后面跟实例名,消息名和所有要求的参数。举个例子,在打印消息的情况下,没有参数。CLIPS的对象就是一个类的实例。

    对象内槽和操作的封装是OOP广泛接受的五个特性之一。封装一词的意思是类按照它的槽和操作被定义。尽管一个类的对象可以继承它超类的槽和操作,(一些例外稍后再讲),如果没有发送消息到对象,对象的槽值不会被改变或消除。

    CLIPS的根类(root class)或简单根(root)是被称之为OBJECT的预定义系统类(predefined system class)。预定义系统类USEROBJECT的子类。


    收藏到:Del.icio.us