面向对象数据库_第1页
面向对象数据库_第2页
面向对象数据库_第3页
面向对象数据库_第4页
面向对象数据库_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据库系统基础教程(第2版),叶小平 汤 庸 汤 娜 潘 明 编著,普通高等教育“十一五”国家级规划教材,清华大学出版社,2,数据模型是对现实世界中实体本身及其约束的抽象描述和实体间相互联系的逻辑刻画。以面向对象方法为指导对数据模型做语义解释,就可构建面向对象数据模型(object oriented data model,OODM)。而按照OODM定义行为和联系的数据对象构成的数据库称为面向对象数据库(object oriented database,OODB)。,第10章 面向对象数据库,3,对OODB进行有效管理的数据管理系统称为面向对象数据库管理系统(object oriented da

2、tabase management system,OODBMS)。以OODBMS为核心构造的数据库系统则称为面向对象数据库系统(object oriented database system,OODBS)。面向对象数据模型吸收了面向对象程序设计方法中的核心概念和基本方法,其要点是采用面向对象的观点来描述现实世界中的实体(对象)的逻辑结构和对象之间的联系与限制。,第10章 面向对象数据库,4,“对象”(object)可以解释为客观世界中的客体;“面向对象方法”(OO方法)则可以理解为以客观世界中的客体为观察目标的方法。OO方法出发点和基本目标在于使得人们分析、设计和实现一个系统的方法尽可能接近于

3、人们认识该系统的方法,即描述问题的客体空间和解决问题的方法空间在结构上尽可能一致。,10.1 对象与类,10.1.1 对象,5,OO方法突出特点是通过可构造手段表现客观要求以及使用有限构造手段与步骤建立客观世界模型,从本质上来说,面向对象方法所构造模型可在计算机上有效实现,因此面向对象方法成为计算机科学技术中一种广泛使用的方法。,10.1 对象与类,10.1.1 对象,6,人们将客观世界中所关注客体的抽象单位称之为“对象”。对象是面向对象方法中基本单位,需要作进一步描述才能使其具体化与技术化,对象结构就是这种技术化的描述。对象是由一组数据结构以及其上的一组方法即程序代码封装起来的基本单位。由属

4、性集合、方法集合和消息集合三部分加上对象标识组成的对象封装体称为对象结构。,10.1 对象与类,10.1.1 对象,7,对象具有封装性、隐蔽性与稳定性等重要特性。(1)封装性 封装(encapsulation)是使对象的外部界面与内部实现之间实行清晰隔离的一种技术,是OO模型的主要特征之一。封装使得用户只能看到对象外在的界面信息(正如规格说明等),而看不到对象内部的信息(如方法实现细节),对象内部信息对于用户是屏蔽的。封装的意义首先在于安全性保证,其次在于相关模块的可扩展性。,10.1 对象与类,10.1.1 对象,8,(2)隐蔽性 对象分为内部表示和外部表示。内部的属性与行为的捆绑,封装之后

5、对于外部用户透明,用户通过对象外部表示即界面(interface)认识对象并与之通信联系。对象界面实际上是若干个外部接口,它对外部开放并为外部所见,但屏蔽了内部细节,即具有隐蔽性(hiddening)。对象隐蔽的意义在于外部用户只需掌握简单的对象界面而不需了解复杂的内部属性与行为,复杂处理简单化,方便了用户关于对象的认识与操作。,10.1 对象与类,10.1.1 对象,9,(3)稳定性 对象内部的对象行为建立在对象属性之上,即行为服务于属性或行为依赖于属性,这中在对象内部建立起的以属性为核心并以行为为附属的稳定实体特性称为对象的稳定性(stationary)。如对于树具有树叶、树干、树茎和树根

6、等属性,只有对应于这些属性才会有吸收地面水分(树根)、光合作用(树叶)及输送养分(树茎)等行为,这些构成了以树的属性为核心的稳定实体。,10.1 对象与类,10.1.1 对象,10,消息(message)是对象之间的联系信息。由于对象的封装性和隐蔽性,对象的消息仅仅作用于对象界面,然后再通过界面进一步作用于对象内部。 消息的作用 请求对象为其服务;向对象传递消息并对对象操作;反馈服务结果。 消息的组成 接收者:表示消息所施加作用的对象;操作要求:消息对对象的造作要求;操作参数:消息行使操作时作需要的外部数据。,10.1 对象与类,10.1.2 消息,11, 消息发送与接收 每个对象都可以发送和

7、接收若干消息。面向对象数据模型中的“消息”与计算机网络中传输的消息含义不同。它是指对象之间的操作请求的传递,而不考虑操作实现细节。,10.1 对象与类,10.1.2 消息,12,消息中仅包含发送者的要求,它告诉接收者要完成哪些处理,但并不指示接收者如何完成。消息由接收者解释,并选择所需操作。一个对象可以接收不同形式与内容的多个消息,同时,相同形式的消息也可发往不同对象。不同对象对形式相同的消息可有不同解释并完成不同操作。消息在提供对象使用时应规定的格式称为消息协议。,10.1 对象与类,10.1.2 消息,13,例 设一个对象A要求对象B完成其中的某种操作,则只需向对象B发送一个消息即可。B接

8、收到这个消息后,根据消息模式找到与之匹配的方法,执行该方法后将执行的结果又以消息的形式发送给对象A。,10.1 对象与类,10.1.2 消息,14,10.1 对象与类,10.1.2 消息,15,类(Class)是对具有共同属性和方法的对象全体的概括描述,它相当于关系模型中的关系模式。类给出了属于其全部对象属性与行为的抽象定义,类中对象仅是类定义中的一个实体,即对象实例。学生是一个类,一个具体学生,例如John就是学生类中一个对象实例。与关系模型需要首先描述关系模式类似,对象模型也首先需要抽象描述具有共同属性的对象的类,按照类来定义属性和方法,从而避免对每个对象一一重复定义。查询操作等方法也定义

9、在类上。,10.1 对象与类,10.1.3 类,16,类概念简化了人们对客观世界的认识,众多复杂对象因为有了类而简单清晰,人们可以对属于类的全体对象进行统一研究而不必对每个对象做个别重复讨论。类可有统一界面,此时,消息不仅作为对象间通信工具,还可作为类之间通信工具。类也具有封装性、隐蔽性和稳定性,在原理分析上,类取代对象成为面向对象方法中实际研究与讨论的基本抽象单位。,10.1 对象与类,10.1.3 类,17,类间基本关系可分为继承关系、组合关系和通信关系(消息)三种情形。继承关系和组合关系是类之间的两个基本关系,反映的是类与类之间静态联系;类之间类似于对象之间“消息”那样的通信关系反映的是

10、类与类之间的动态联系,下面主要讨论类的继承关系。,10.1 对象与类,10.1.3 类,18,(1)类继承基本概念 类与类之间的层次结构重要特点之一就是继承(inheritance)。继承反映一个类能够自动继承其它某些类所具有的属性和方法。这是面向对象数据模型中避免重复定义的一个重要机制。继承性比较自然地体现了类之间的“A is B”联系,它表示A中对象也是B中对象,但A中对象也具有B中对象所不具有的属性或方法。,10.1 对象与类,10.1.3 类,19,此时,类A是类B的子类(subclass),类B是类A的超类(superclass).一个子类可以有一个或多个超类,一个超类也可以有一个或

11、多个子类,这样形成了类与类之间一种基本层次结构。,10.1 对象与类,10.1.3 类,20,如果子类仅限于继承超类中的属性和方法,则定义子类就失去了意义。子类除了能继承超类中的属性和方法外,还可用增加和取代的途径定义子类所具有的特殊属性和方法。所谓增加就是在子类中定义新的属性和方法;所谓取代就是在子类中以新的内容重新定义超类中已有的属性和方法。,10.1 对象与类,10.1.3 类,21,抽象类(abstract class)是一种不能建立实例的类。抽象类将有关的类组织在一起,抽象出一个公共的超类,其它子类都从这个超类派生出来。通常一个抽象类只是描述了与这个类有关的方法接口或者方法的部分实现

12、,而具体的实现则在一个或几个子类中定义。 抽象类一般用于定义一种协议或概念。,10.1 对象与类,10.1.3 类,22,(2)类继承基本特性 类继承通常具有下面的四个基本性质。传递性 设有A,B,C三个类,其种类C继承类B,而类B继承类A,此时必有类C继承类A。例如动物、哺乳动物与灵长类动物均为类,而其中灵长类动物继承哺乳动物,哺乳动物继承动物,此时必有灵长类动物继承动物。,10.1 对象与类,10.1.3 类,23,单向性 设有类B继承类A,则此时一定不能有类A继承类B,如研究生类继承学生类,但学生类必不继承研究生类。传递性和单向性说明了类继承具有单向层次性。,10.1 对象与类,10.1

13、.3 类,24,可重用性 可重用性(reuse)指得是子类可以重用超类的全部资源,同时根据继承的传递性,它还可以重用继承链上所有超类资源。包含性 继承除了具有类之间一般与特殊关系之外,还可以有包含关系,即灵长类继承哺乳动物类,此时灵长类必包含在哺乳动物中。类中继承的包含关系一般是真包含关系。,10.1 对象与类,10.1.3 类,25,(3) 多态性与联编 多态性与联编是类继承的重要技术特性 多态性 在类继承过程中,超类属性与方法在子类中可以有不同的实现形式、方法与语义,这就称为多态性(polymophic)。如在图2-12所示的类继承当中,动物均有吃食物的行为,但是人类吃食物的实现形式与一般

14、动物不同,人类用工具吃食物,动物则直接用爪子。另外,同是用工具吃食物的方式也有所不同,东方人使用筷子方式,而西方人使用刀叉。,10.1 对象与类,10.1.3 类,26,10.1 对象与类,10.1.3 类,27,多态性实际上反映了“一名多义”,即一个名字可以具有多种语义。在“图形”类中,可以定义一个打印(print)方法用于打印图形。对图形类中不同实例,其打印过程可以不同。只有当消息送到具体对象时,才能确定采用什么打印过程。这即是“打印”方法的多态性。多态性的意义在于可以为系统需求分析和设计带来带来方便,提高效率。,10.1 对象与类,10.1.3 类,28, 联编 多态性为对象与属性、方法

15、之间的复杂关系提供处理的方便与灵活性,但在计算机软件中实现多态性需要有联编(binding)等功能的支撑。联编是将一个程序经过编译而成为可以运行目标代码的过程,即将执行代码聚束在一起的联编过程。用传统语言写的程序在运行之前即可完成此过程,故称为静态联编(static binding)。,10.1 对象与类,10.1.3 类,29,面向对象语言在程序运行时也可发生联编,称为动态联编(dynamic binding)。动态联编的意义在于增加程序的简单性和可扩充性,使程序增删自如,不易出错,但效率略低于静态联编。另外,静态联编运行效率高但修改和维护工作量大。,10.1 对象与类,10.1.3 类,3

16、0,面向对象数据模型是依据面向对象方法所建立的数据模型,其中包括数据模式(数据结构)、建立在模式上的数据操作和数据约束。 数据模式 由对象结构以及类间继承和组合关系建立起来的数据间的组织结构关系,这种模式结构的语义表示能力远比ER方法与EER方法要强。,10.2 数据模型,10.2.1 基本概念,31, 数据操作 由对象与类中方法建构对象数据模式上的数据操作,这种操作语义强于传统数据模型,如可以构做一个圆形类,它的操作可以除查询、修改外,还可以有图形的放大/缩小,图形的移动、图形的拼接等。在面向对象数据操作分为两个部分,一个部分封装在类之中称之为方法,另一部分是类之间相互沟通的操作称之为消息。

17、,10.2 数据模型,10.2.1 基本概念,32, 数据约束 数据约束也是一种方法,即是一种逻辑表示式,可以用类中方法表示模式约束。面向对象数据一般使用方法或消息表示完整性约束条件,称为完整性约束方法与完整性约束消息,并在其之前标有特殊标识。,10.2 数据模型,10.2.1 基本概念,33,面向对象数据模型直观描述就是面向对象方法中的类层次结构图。面向对象数据模型中的对象由一组变量、一组方法和一组消息组成,其中描述对象自身特性的“属性”和描述对象间相互关联的“联系”也常常统称为“状态”(state),方法就是施加到对象的操作。一个对象的属性可以另一个对象,另一个对象的属性还可以同其他对象描

18、述,以此模拟现实世界中复杂实体。在面向对象数据模型中,对象的操作通过调用其自身包含的方法实现。,10.2 数据模型,10.2.1 基本概念,34,任何一个对象及属性都有一种类型,OODM的类型系统有一组自身定义的基本类型和一些用来递归地构造复杂类型的构成器组成。,10.2 数据模型,10.2.2 数据类型,35,1)基本类型 主要是基础类型与“类”类型两种情形。 基础类型 通常意义下的系统“内置”数据类型,如整型、实型、字符串和布尔型等。“类”类型 一个类本身可看做下述构造型的一种,是复杂类型,但仍可将其作为一个整体看成一个基础型,从而可以像上述型一样对待和使用。,10.2 数据模型,10.2

19、.2 数据类型,36,(2)构造类型 通过基础型和“类”型可以使用构造器形成数组(array)、列表(list)、包(bag)、集合(set)各种复杂型(构造型)。需要指出的是,基础型对象(属性)的值是“自我定义”的,而构造型对象的值是由其部件对象的Oid的相应组合确定。,10.2 数据模型,10.2.2 数据类型,37,例 类“公司”的说明:CLASS CompanyATTRIBUTES(Name:string,Address:string,Employees:SET,Subsidiaries:SET)METHOD(GetName()GetSubsidiaries(),Addsubsidia

20、ry(NC:Company),Trigger(NoSuchComp),10.2 数据模型,10.2.2 数据类型,38,这里有四个属性和四个方法,例如最后一个方法的名称为Addsubsidiary,参数为NC,就是要使之成为目标对象公司的子公司的一个Company实例,结果为插入NCo公司到目标对象公司的子公司Subsidiaries中,若不存在NC公司,即它不是Company的一个实例,则启动触发器NoSuchComp进行例外处理。这里省略了接收参数,因为它就是本Company类的实例。,10.2 数据模型,10.2.2 数据类型,39,设子公司由一个NumSubsi项(当前项数)数组实现,

21、AddSubsidiary的方法可定义为:AddSubsidiary(C:Company,NC:Company)IF Checkcomp(NC)THEN C.SubsidiaryNumSubsi:=NC,Numsubsi:=NumSubsi + 1ENDIF,10.2 数据模型,10.2.2 数据类型,40,这里,Checkcomp(NC)为发给本类的一个消息(为另一方法调用),它检验NC是否是类Company中的一个公司。若是,则返回“真”,否则就返回“假”。NC为该方法的形式参数,C为直接接受者(目标对象)参数,NumSubsi为存储当前子公司数的实例变量。若发送消息:AddSubsidi

22、ary(IBM,ABC)则NC联编到ABC,10.2 数据模型,10.2.2 数据类型,41,OODM是一种层次式的结构模型,以类为基本单元,以继承和组合为结构方式,从而组成图结构形式,具有丰富语义,能够表达客观世界复杂的结构形式。 OODM将数据与操作封装于一体的结构方式,使得OODM中的类具有独立运作能力的实体,扩大了传统数据模型中实体集仅仅是单一数据集的不足。,10.2 数据模型,10.2.3 与关系模型比较,42, OODM具有构做多种复杂抽象数据类型的能力。数据类型是一种类,如实型就是一种类,特式实数结构与实数操作所组成的类,因此可用构做类的方法构做数据类型,从而构造出实际所需的各种

23、复杂数据类型。例如可用类的方法构造元组(tupple)、数组、队列、包和集合等,也可以用类的方法构造向量空间等类型使数据类型大为扩充。,10.2 数据模型,10.2.3 与关系模型比较,43, OODM中类层次结构是一种结构化形式,可根据需要随时改变结构从而使OODM具有不断更新结构的能力,这种能力称为模式演化(schema evaluation)能力。需要说明的是,面向对象类层次结构图既是概念模型又是逻辑模型,它将抽象概念与具体数据库实现有机地融合为一体,这也构成了OODM的独特性质。,10.2 数据模型,10.2.3 与关系模型比较,44,10.2 数据模型,10.2.3 与关系模型比较,

24、45,前面已经简要介绍了面向对象数据库系统中的基本概念。为了在技术开发和实际应用中有效使用这些概念,还需要一种数据库语言进行必要的表述与刻画。面向对象数据库语言构建的基本思路是对现有面向对象程序设计语言如C+、Smalltalk等进行扩展,使之支持相应数据库操作。20世纪80年代成立的ODMG(object data management group),在1993年形成工业化的OODB标准ODMG1.0,完成了对面面向对象程序设计语言C+的数据库功能扩充。,10.3 ODMG数据操作,46,1997年推出的ODMG2.0, 内容涉及到对象模型和对象查询语言与C+、Smalltalk以及Java

25、之间绑定。2000年再次推出ODMG3.0,对先前版本做了一些修改和补充,基本框架和基本概念未变。,10.3 ODMG数据操作,47,ODMG工业标准对C+的扩展主要包括C+对象定义语言(object definition language,ODL)和C+对象操作语言(object Manipulate language,OML),其中,OML又分为对象查询语言(OQL)和对象控制语言(OCL)。ODMG工业标准中的对象数据模型主要包括有下述5个核心概念:,10.3 ODMG数据操作,48, 对象和文字 对象和文字是面向对象数据建模的基本原语。每个对象有一个唯一标识符,文字(literal)没

26、有标识符。对象标识符在对象整个生命周期中都有效,即无论对象是存储在外存中还是在内存中,标识符都始终有效。对象作为基本数据结构,是存储和操作的基础单元。,10.3 ODMG数据操作,49, 类型 对象和文字都可以被划分为类型,同一类型(type)的对象或文字具有相同的状态,对象可以称为类型的实例。 状态 对象的状态可以通过一组性质定义。性质(property)可以分为两种:对象属性(attribute)和对象之间联系(relationship)。,10.3 ODMG数据操作,50, 操作 对象行为可以通过一组操作来定义。操作(operation)具有输入和输出参数,并且可以返回特定类型的结果。

27、ODL 利用ODL定义对象数据管理系统的模式,它所存储的对象都是模式中定义类型的实例,即对象,这些对象可以供多个应用程序共享。,10.3 ODMG数据操作,51,另外需要说明的是,由于对象本身是状态(属性和对象间联系)与行为(操作或方法)的封装体,因此在ODMG框架内,相应数据操作主要是数据的查询,而数据更新(插入、删除和修改)由于属于对象行为范畴,并不显式的表现出来,而是通过类型创建中的行为定义完成。下面主要介绍面向对象的数据定义和数据查询。,10.3 ODMG数据操作,52,1)接口和类的创建例2-3 下述语句创建了ODMG中的接口和类。Interface Employee;Interfa

28、ce Professor:Employee;Interface Associate_Professor:Professor ;Class Salaried_Employee:Employee;Class Hourly_Employee:Employee;,10.3 ODMG数据操作,10.3.1 数据创建,53,Class Personattribute string name;attribute date birthday;class Employeeperson extends Person:Employeeattribute Date hireDate;attribute Currenc

29、y payRate;relationship Manager boss inverse Manager:subordinates;,10.3 ODMG数据操作,10.3.1 数据创建,54,class ManagerPerson extends EmployeePerson:Managerrelationship set subordinates inverse Employee:boss;,10.3 ODMG数据操作,10.3.1 数据创建,55,说明 在上述类型说明的定义语句中,接口employee中定义了操作calculate-paycheck,类salaried-employee和类h

30、ourly-employee,可以根据具体情况对接口employee中操作calculate-paycheck进行修改。另外,也允许对行为进行多重继承,即一个子类型可以从不同的超类型中继承多个具有相同名称、不同参数的操作。,10.3 ODMG数据操作,10.3.1 数据创建,56,ODMG标准规定,一个接口和其所有实现的结合称为类型,而一个接口和其某种实现的结合称为类。因此,“类型”是独立于实现的,而“类”是依赖于实现的,即类型的抽象级别要比类高。只有当一个类型只有一种实现时,类型和类才是等同的。正是由于类型包含类,所以在ODL和OQL中,类型使用很普遍,而类只用于特定情况。,10.3 ODM

31、G数据操作,10.3.1 数据创建,57,在ODMG ODL中,面向对象数据库模式被定义为一系列类(class)的集合。对于每一个类可以说明类的外延(extent),外延的意义在于表示当前对象集合的一个名称,面向对象数据模型种的“类”与“外延”类似于关系数据模型中“关系模式”和“关系实例”。,10.3 ODMG数据操作,10.3.1 数据创建,58,2)对象的创建类和接口创建类似于关系模式创建;而对象创建则类似于关系模式中数据创建。在ODMG中,对象可以分为聚集对象和原子对象。原子对象就是“用户自定义对象”,具有各种不同的复杂情形,需要用户通过接口定义、类定义等完成创建过程;而聚集对象相对比较

32、整齐,根据ODMG标准,通常是使用为不同聚集了类型定义的一种特殊接口类型工厂对象(factory object)来创建聚集对象,即是说通过“工厂对象”接口定义中的生成函数来创建聚集对象。,10.3 ODMG数据操作,10.3.1 数据创建,59,例10-4 设有下述语句表示的ODMG标准中一个工厂对象接口。Interface ObjectFactoryObject new();通过该工厂对象接口,可以为用户创建聚集对象如下:interface DateFactory:ObjectFactoryexception InvalidDate;,10.3 ODMG数据操作,10.3.1 数据创建,60

33、,Date calendar-date(in unsigned short year,In unsigned short month,In unsigned short day)raises(InvalidDate);Date current();,10.3 ODMG数据操作,10.3.1 数据创建,61,说明 上述工厂接口“ObjectFactory”只有一个操作new(),它返回一个带有对象标识OID的新对象。新创建的“DateFactory”接口继承该接口生成函数“new()”,就可以为每个用户定义的原子对象创建它们自己的工厂接口,并且可以针对每种新对象实现不同的new()操作。例如,给

34、定一个DateFactory接口,它还可以有其他一些操作:calendar-date用来创建一个新的日期,current用来创建一个值为当前日期的对象。,10.3 ODMG数据操作,10.3.1 数据创建,62,对象查询语言OQL是以面向对象模型为基础的类SQL查询语言,允许使用传统SELCET查询语句来书写表达式。OQL没有提供显式删除和修改操作,这些基本数据操作由类型定义中的操作完成。在“collection”和“structure”中,如果是由类型组成,则用“”表示,如果是用文字组成,则用“()”表示。,10.3 ODMG数据操作,10.3.1 数据创建,63,例 10-5 在大学数据库

35、中,用OQL的SELECT语句可以得到如下查询操作:查询大学中授课门数超过2门的教师,要求显示学校名称和教师姓名,显示时属性名为university_uname和faculty_name:SELECT university_name:F.works_for.uname,faculty_name:F.nameFROM faculties FWHERE F.num_teach()2;,10.3 ODMG数据操作,10.3.1 数据创建,64,例10-6 查询广州地区大学中教师开设课程的课程名:SELECT DISTINCT C.cnameFROM universities U,U.staff F,F.teach CWHERE U.city = guangzhou;说明 关键字DISTINCT消除了结果中重复部分,此时查询结果为集合,否则为包。,10.3 ODMG数据操作,10.3.1 数据创建,65,例10-7 上述查询也可以用子查询表示,但查询出现在FROM中:SELECT DISTINCT C.cnameFROM (SELECT UFROM universities UWHERE U.city = guangzhou)D1(SELECT FFROM D1.staff F)D2D2.teach C;,10.3 ODMG数据操作,10.3.1 数据创建,66,说

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论