1.6 元数据模型术语

由于元数据模型比较抽象,前面涉及的许多概念对理解本书非常重要。因此本节将再次明确一下相关概念,一定要注意区分。类和对象的概念是面向对象程序设计的基本概念,Java语言关键字class可声明一个类,每一个类有一个类名,例如,前面的PartyBO是一个类,“PartyBO”是类名。用PartyBO类可以定义或者声明一个对象:PartyBO party = new PartyBO();在这个语句中,party是PartyBO类的一个具体对象引用,new PartyBO()表示创建PartyBO类的一个对象,赋给对象引用party。对象引用称呼比较累赘,故直接称为“对象”,直接说party是一个对象,对象名为“party”,而不说party是对象引用。平常将party说成PartyBO类的一个对象,在理解上不会有歧义,书中将保持这种说法。类的实际作用是描述属于该类所有对象共同遵循的数据结构规范,而对象是在类描述的数据结构规范下的具体实例。

类是描述对象的数据结构的信息,那么如何描述类的信息呢?在Java语言中,就是使用class声明各种类。可以这么理解,class是对类的数据结构的描述,是一段程序代码。Java可以在程序运行过程中返回对象的元数据,也就是类运行态信息,Java表达式party.class可以返回对象party所属类的元数据信息,也可以通过PartyBO.class表达式返回类PartyBO的元数据信息。本书的元数据模型概念,包含两部分内容:定义部分和实例部分,定义部分是对类的结构信息的描述,而类又是对象的数据结构的描述。因此,元数据模型定义部分是对象的数据结构的结构信息描述。

元数据模型的定义部分就是Dna,Dna是一个Java类,通过语句Dna dna = new Dna(),定义了Dna的对象引用,并创建一个Dna对象,赋值给对象引用dna。注意,Dna是类,dna是对象名。Dna对象和对象dna是不同的概念,前者泛指一个Dna类的一个对象(引用),后者是一个具体对象(引用),其对象名为“dna”。

对象用于描述某个事物的信息/数据,例如,PartyBO对象party就是描述某个具体的当事人。Dna对象dna是一个对象,则是描述某个对象的数据结构的数据。元数据模型的实例部分称为Inst类。定义部分Dna的每一个对象,都是描述某一个数据结构,而实例类Inst对象下每一个实例值Cell对象(Inst的属性List〈Cell〉 cells中),都是描述一个具体的事物,例如某个具体当事人。综上所述,表1-2是普通Java类和元数据模型术语的举例和对照。

表1-2 普通Java类和元数据模型术语的举例和对照

img

Java类和元数据模型之间的对应关系如图1-9所示,其中PartyBO类与Dna的一个对象dna处于同等级别,表示一个Dna对象等价于一个Java类,不同Dna对象等价为不同Java类。通过创建不同Dna对象(相当于创建不同Java类)来实现领域模型的动态扩展,而不是Java编程声明类。实例对象下每一个Cell对象(Inst的属性List〈Cell〉 cells中每一个列表元素)等价于Java具体类的对象,但是Inst下Cell对象属于哪一类对象是通过Dna对象的约束来实现的,即Inst对象根据哪一个Dna对象来创建,那么该Inst对象下Cell对象就是等价于该Dna对象所等价Java类的对象。Inst对象是List〈Cell〉 cells的容器,相当于对多个Cell对象进行包装,相当于List〈Object〉的级别。在PartyBO例子中,Ins对象等价于List〈PartyBO〉 parties的对象列表parties。

img

图1-9 Java类和元数据模型之间的对应关系

总结一下,元数据模型由两部分构成:定义部分和实例部分。定义部分是Dna,实例部分为Inst(含List〈Cell〉 cells属性)。实例部分Inst对象根据定义Dna对象进行创建和操作。定义部分Dna是一个递归结构,通过该结构可以定义出各种复杂树形结构。

为了之后叙述上的方便,这里对常用的表达方式做简化约定:

1) “保存一个当事人”,实际含义是保存一个当事人对象,省略掉“对象”两字。“保存一个实例”,实际上是保存一个实例对象。在不发生歧义的前提下,一般都会省略“对象”两字。

2) 同样地,“获取/保存一个Dna”和“获取/保存一个Dna对象”,没有特别说明,是相同的含义。

3) 语句PartyBO partyBO = new PartyBO()可以很自然地表达为“partyBO是PartyBO的对象,PartyBO是partyBO的类”。基于Dna对象dna创建的一个Inst对象inst,这里dna和inst是两个对象名,Dna和Inst是两个类名,我们可以说“inst是dna的实例,dna是inst的定义”。两个对象dna和inst之间的关系可以表达为“inst对应的dna,或者dna对应的inst”,或简化为“dna的inst,inst的dna”。

4) 大多情况下,不给出实例对象名,例如基于partyDna创建出来的实例,简化为partyDna的实例,或者partyDna的Inst,反过来说,实例对应的Dna对象,简化为实例的Dna,或者Inst的Dna。类似地, 基于partyDna创建出来的实例值(Cell)对象,简化为partyDna的实例值或者partyDna的Cell,反之,简化为实例值的Dna或者Cell的Dna。

请读者阅读时,根据上下文区分含义。有时候文中为了避免歧义,也会将相关定语加上。

本书的目标是描述一套非常通用的元数据机制,并利用这套机制,快速实现类似当事人管理的低代码开发平台。这意味着利用元数据模型即可实现所有领域对象的管理,而不必分别开发各个领域应用。因此,这套机制的意义在于:

1)快速实现领域对象的管理,无论是已知的领域对象,还是将来不断出现的新的领域对象;

2)实现领域对象的灵活扩展,包括模型、规则、数据库、界面、流程和功能的扩展;

3)提供产品化程度很高的领域对象管理。低代码开发平台的软件设计思路,使得按照元数据模型设计的软件具有通用性,可重用于不同行业,或者同一个行业中的不同企业,不用修改代码,只需通过灵活配置即可实现差异化管理。