领域模型中关联语义的描述逻辑表示与应用

2015-12-26 12:15张力生年欢宋辉雷大江
软件 2015年6期

张力生+年欢+宋辉+雷大江

摘要:从领域模型生成代码是MDA中模型驱动开发过程的重要环节。工程中领域模型一般用UML类图表示,然后生成数据访问层代码。UML组合关联的语义定义不明确,导致从领域模型生成的数据访问层代码不能精确地实现组合关联语义问题的出现。本文研究了描述逻辑CATS、ALCHOIQbr和知识库查询,在这三种形式化工具的基础上提出描述逻辑CATSbqr,使用CATSbqr分析了组合关联的语义变化;然后表示了领域模型中增加复杂对象的操作语义,并给出了在数据访问层实现增加操作的算法;最后将这种表示方法应用到销售单这个典型场景。本文的研究工作为建模工具实现UML组合关联自动转换成数据访问层代码提供了理论基础。

关键词:领域模型;组合关联;描述逻辑

中图分类号:TP301

文献标识码:A

DOI:10.3969/j.issn.1003-6970.2015.06.013

本文著录格式:张力生,年欢,宋辉,等,领域模型中关联语义的描述逻辑表示与应用[J].软件,2015,36(6):66-74

RepresentationandApplicationofDescriptionLogicintheSemanticAssociationinDomainModel

ZHANGLi-shengl,NIANHuanl,SONGHuj2,LEIDa-jiangl[Abstract]:Generatingcodefromthedomainmodelisanimportantpartofmodel-drivendevelopmentprocessinMDA.DomainmodelexpressedbyUMLclassdiagramcangeneratedataaccesslayercode.TheindistinctsemanticsofUMLcompositionassociationcausethegenerateddataaccesslayercodeincompletelyimplementthesemanticofcomposition.ThispaperresearcheddescriptionlogicCATS,ALCHOIQbrandqueryknowledgebaseandproposedCATSbqrlanguagebasedonthesethreetools,andanalyzedthechangesofsemanticsofcompositionassociationbyCATSbqr.Thenwerepresentedthesemanticsofaddingcomplexob.jectsoperationinthedomainmodelandproposedthealgorithmtoimplementtheaddingoperation.Atlast,weappliedthemethodtorepresentingthesalesorderinap-plicationscenarios.Thisworkprovidesapreciseformalpresentationwayfortheprocessofgeneratingdataaccesslayercodefromdomainmodelinmodelingtools.

[Keywords]:Domainmodel;Compositionassociation;Descriptionlogic

0引言

在应用领域中,复杂对象的内部存在整体/部分关系[1],它表示对象的部分与这些部分所组成的整体之间的关系,可以用自然语言描述。例如,“头部是身体的一部分”这句话说明了头部和身体之间具有整体/部分关系。复杂对象在软件系统三层架构的业务逻辑层中被抽象为业务实体(businessobjects),表示对真实世界的软件抽象;在数据访问层中被抽象为值对象(valueobjects),通过O/R映射(Ob.jectRelationalMapping)为数据库中的记录以实现对象持久化。MDA(Model-DrivenArchitecture)是OMG(ObjectManagementGroup)提出的软件开发框架[2]。在MDA开发生命周期[3]中,建模人员对值对象建模得到领域模型,然后借助建模T具从领域模型生成可执行的数据访问层代码。这个过程中的值对象主要是结构化数据,结构化数据具有直观明了的特点[4],对其进行领域建模可以得到关系数据模型。领域模型一般用UML类图表示,描述值对象的静态结构(包括值对象本身和对象间的联系)、动态操作(即增、删、改、查,简写为CRUD)和完整性约束三个方面的内容。在领域模型中,对象彼此之间是直接引用,因此不存在引用完整性约束的问题。

使用UML描述模型具有与领域无关的通用模型描述能力,能够实现不同领域子系统模型间的无缝集成‘5]。复杂对象在领域模型中的静态结构可以用UML组合关联表示,但是UML标准文本对组合关联的语义定义不明确,导致领域模型生成的数据访问层代码不能精确地实现组合关联的语义。基于以上问题,本文提出一种方法使用描述逻辑准确地描述复杂对象在领域模型中的静态结构和动态操作,使生成的数据访问层代码实现组合关联的语义。

1组合关联的语义

1.1UML组合关联的语义

UML标准文档[6]中描述整体/部分关系的关联有两种形式:聚合关联(aggregationassociation)和组合关联(compositionassociation),它们都是二元关联(binaryassociation)。组合是聚合的强关联形式,比聚合多了2个约束,第一个约束是部件(part)实例只能同时包含在至多1个组合(composite)实例中,这就要求组合关联端(compositeassociationend)重数的上边界不能大于[6];第二个约束是部件具有与组合相同的生命周期[7]。UML标准文档定义了对组合对象的操作,组合实例完全负责部件实例的存在和存储,删除组合则它的所有部件都会一起被删除。组合可以被链接进一个具有传递删除特性(transitivedeletioncharacteristics)的有向无环图(adirectedacyclicgraph)中,如此一来,删除图中一个部件的元素会导致这个元素下的所有子图元素被删除。这种现象叫做传播(propagation),是指当一个操作应用于某个起始对象时,该操作会自动应用到网络中的对象[8]。

组合关联可以用一条带实心菱形的实线表示,实心菱形的一端连接表示组合的类,另一端连接表示部件的类。

1.2问题的提出

UML标准文档定义了组合关联,但没有明确地说明组合类和组合关联代表的具体对象,例如组合类是否代表应用领域中的复杂业务对象,如果不能,它们有什么联系与区别。另外,标准文档中也明确地指出了组合关联语义的变化点:组合中创建部件的顺序和方式尚未定义。这些问题导致了建模T具从领域模型生成数据访问层的代码没有准确地实现组合语义。本文使用描述逻辑定义复杂对象的类图到描述逻辑知识库的转换规则,推导UML组合关联的语义,从领域模型中复杂对象的静态结构和动态操作两方面描述组合关联的语义。

2组合语义的描述逻辑表示

描述逻辑是一种研究知识表示和推理领域的形式化方法,能为建模应用领域提供精确的形式化理论支持。本章在描述逻辑CATSbqr、ALCHOIQbr和知识库查询的基础上提m了描述逻辑CATSbqr语言,使用CATSbqr定义了组合关联的语义,表示了领域模型中复杂对象的静态结构,为描述领域模型动态操作的目标对象提供了基础。

2.1描述罗辑CATSbqr

由于描述逻辑语言CArS[9]不能描述对象的动态操作语义,本节在描述逻辑CATS、ALCHOIQbr[10]和知识库查询[11]的基础上提出描述逻辑CATSbqr,使用公理的布尔组合、单独的关联构造算子和查询表达式扩展了CATS,用于描述领域模型中复杂对象的复杂静态结构和动态操作。

描述逻辑CATSbqr语言的基本元素是概念(concepts)、联系(roles)和个体(individuals)。CATSbqr语言的知识库包括TBox和ABox两部分,分别描述应用领域的内涵知识和外延知识[13]。本文的研究重点在于复杂对象的术语表示,因此主要讨论TBox。

CATSbqr语言的语法和语义分为两部分:静态结构和动态操作,静态结构是形式化表示应用领域的结果,动态操作表示静态结构中的对象集合在操作中发生的变化。CATSbqr静态结构的语义由解释定义。一个解释I=(AI,.1)由解释域AI和解释函数.1构成,解释域AI是应用领域中对象的集合,解释函数.1把每个概念名映射为AI的子集,把每个联系名映射为AIXAI的子集。CATSbqr描述静态结构的部分构造算子的语法和语义见表1。

CATSbqr动态操作是通过背景动作[10]使解释产生变化,这个过程叫做解释更新[10][14]。动态操作主要有增、删、改、查四个动作,使用CATSbqr动作语言和知识库查询描述,其语法和语义如表2所示。

2.2组合关联语义的准确定义

本节将通过描述逻辑知识库断言的数学语义表达式推导组合类和组合关联的准确语义,说明UML组合类和组合关联在建模应用领域的复杂对象时发生的语义变化。

2.2.1复杂对象业务语义的描述逻辑表示

整体/部分关系表现为:从完整对象的外部看,这个完整的对象是独立的、不可再分的,具有原子属性;从完整对象的内部看,整体由部分组成,部分不能脱离整体单独存在。两种角度的抽象层次不同,外部的抽象层次比内部高。

我们把具有整体/部分关系的对象抽象为复杂对象A,假设复杂对象A具有1个部件C和多个部件D,A和C之间的关系为r,A和D之间的关系为s。使用描述逻辑语言CATSbqr可以将复杂对象A表示为TBox知识库K1:

说明:Ai、Cl、Dt、T是知识库中的概念,分别映射到应用领域中一类对象的集合;r.、sl是知识库中的联系,分别映射到应用领域中两类对象集合的关系。同一个断言表达式中的概念具有相同的顶域。

断言2.1:表示应用领域中复杂对象A与部件C和部件D之间的关系,其中概念Ai、Cl、Di的语义分别是:

联系rl、sl的语义分别是:

rlI_{(o,o)l(o,o)∈复杂对象A与部件C的关系r},

sll={(O,o)l(o,o)∈复杂对象A与部件D的关系s}。

断言2.2:表示应用领域中复杂对象A与部件C的1对1关系,其中顶域T的语义是

TI={oIo∈满足复杂对象A与部件C的关系r的C类型对象)。

断言2.3:表示应用领域中复杂对象A与部件D的1对多关系,其中顶域T的语义是

TI_{oIoE满足复杂对象A与部件D的关系s的D类型对象}。

2.2.2UML组合关联的描述逻辑表示

根据类图的描述逻辑编码规则[15]可以把复杂对象的UML类图自动转换成CATSbqrTBox知识库。转换的实质可以从MDA元建模的层次[16]解释:在元模型层M2层,UML的元模型根据转换规则转换成CATSbqr语言中的元素,例如,UML的类转换成CATSbqr的概念,UML的关联转换成CATSbqr的联系;在系统模型层Ml层,UML元模型的实例根据转换规则转换成CATSbqrTBox知识库中的断言。

使用UML组合关联对2.2.1节中抽象出来的复杂对象A进行领域建模,其类图如图2.1所示。建模思路是:对于复杂对象A,在图2.1中用类A2表示,为了满足关系型数据库的第三范式关系模式,把具有1对多对应关系的部件D从整体A中分离,用类D2表示,复杂对象A和部件D的l对多整体/部分关系用组合关联s2表示,重数[1..1]在A2端,重数[1..*]在D2端。使用描述逻辑语言CATSbqr可以将复杂对象A的类图(图2.1)表示为TBox知识库K2:

断言2.4:表示类图中复杂对象A的类图包括满足关联s2的组合类A2和满足关联s2的部件类D2。由于部件D从复杂对象A中分离,剩余部分为部件C,因此组合类A2的数据实际只有部件C的数据。概念T、A2、D2的语义分别是:

TI_{oIoE复杂对象A},

A21={OIO∈部件C},

D21={OIO∈部件D}。

联系S2和s2的语义分别是:

(s2)1={(o,o)l(o,o)∈部件D与部件C的关系},

S21={(o,o)l(o,o)∈部件C与部件D的关系}。

断言2.5:表示类图中1个A2对象对应多个D:对象,其中概念T的语义是

T1={oIoε满足部件D与部件C关系的C类型对象}。

断言2.6:表示类图中1个D2对象对应1个A2对象,其中概念T的语义是

TI={oIoε满足部件C与部件D关系的D类型对象}。

2.2.3UML组合类与组合关联的语义变化分析

假设图2.1可以准确地表示整体/部分关系,那么知识库Ki中的断言应该与K2中的断言对应等价。

性质1(概念相等和联系相等)在描述逻辑知识库的断言中,C和D表示两个概念,r和s表示两个联系,如果C和D的语义相同,r和s的语义相同,即满足表达式2.7和2.8,

那么概念C和D等价,联系r和s等价,即

C-D,r-s。

性质1利用描述逻辑的语义说明了知识库中概念相等和联系相等的语义。如果概念C和D的语义相同,即概念C和D通过解释-1映射到应用领域中的同一种对象,那么概念C等价于概念D,其实质是使用不同的概念名表示相同的对象。类似地,如果联系r和s的语义相同,即表示应用领域中的同一种对象关系,那么联系r等价于联系s。

UML组合类与组合关联的语义变化分析:根据断言2.1和2.4中概念Ai和T的语义可得:

AlI_{oIoε夏杂对象A}=TI

由性质1中概念相等表达式2.7可得

A1三T,

同理,

Ci三A2,Di三D2。

根据断言2.1和2.4中联系rl和Sl-的语义可得:

rlI_{(o,o)l(o,o)∈复杂对象A与部件C的关系r}≠{(o,o)l(o,o)∈部件D与部件C的关系}=(s2)1

由性质1中联系相等表达式2.9可得

rl+s2,

同理,

S1+S2。

由于断言2.1和2.4中对应的概念相等,但对应的联系不相等,因此从断言上分析知识库K:与K,中的断言不等价。使用替换规则将断言2.1中的概念Ai、Cl和Di分别替换为T、A2和D:,得到断言2.9

下面从断言2.9和2.4的数学语义分析组合关联的语义,其数学语义分别如表达式2.10、2.11:

表达式2.10中概念Ai、C1、Di的顶域都为夏杂对象A,因此式中AI的语义是

AI={oIoε复杂对象A}。

表达式2.11中概念T、C2、D2的顶域也是复杂对象A,因此式中A1的语义是

AI={oIoE复杂对象A}。

数对(o,02)的语义是

(o,02)I∈{(O,o)l(o,o)∈复杂对象A与部件C的关系r},

联系s2-的语义是

(s2-)1{(o,o)l(o,o)∈部件D与部件C的关系},

而(o,02)∈(S2-)1,对比表达式2.10和2.11可以发现S2的语义发生了变化,部件D与部件C的关系变为

变化的原因是类A2隐含了复杂对象A与部件C之间的1对1关系,部件D通过复杂对象A可以确定唯一的部件C实例。同理,联系s2的语义从S21={(0,o)l(o,o)∈部件D与部件C的关系}变化为S21={(0,o)l(o,o)∈复杂对象A与部件D的关系s}。

由上分析可得

根据性质1中联系相等表达式2.8可得

rl-s2,Sl-S2。

在组合类A2、S-2和S2的语义发生变化后,使用代入规则可以将表达式2.4完全转换成2.1,断言2.1、2.4中的概念和联系分别对应相等,断言的语义也相等,因此断言2.4与2.1等价。同理,断言2.5与2.2等价,断言2.6与2.3等价。

分析以上推导过程可以得到组合类和组合关联的语义变化,由于分离了部件D,添加了组合关联,复杂对象A对应的A2类的静态结构发生了三个变化:第一个变化是A2类中的数据不再是复杂对象A的完整数据,而是除去部件D以后的剩余部分,即A2类只包括部件C的数据,但领域建模时仍然以类A2的名字代表完整的复杂对象A,这种处理方式符合白然语言的习惯;第二个变化是类A:虽然只有部件C的数据,但其类名A:代表了复杂对象A,这种方式隐含了复杂对象A与部件C之间的1对1关系;第三个变化是虽然类A2只有部件C的数据,但是由于类名A2代表了复杂对象A,组合关联s2仍然表示复杂对象A与部件D的整体/部分关系。

3复杂对象动态操作语义的描述逻辑表示和实现算法

复杂对象作为值对象在领域模型中的结构具有特殊性,因此在数据访问层中增、删、改、查复杂对象时需要对这些动态操作进行准确的语义描述。本节根据2.3.3节的UML组合关联语义推导和语义变化分析,定义了领域模型中动态操作复杂对象的操作语义白动转换成语义表达式的转换规则,描述了操作复杂对象各部件的方式和顺序,并给m这些操作语义在数据访问层代码中的实现算法。建模T具按照操作语义表达式生成的数据访问层代码可以实现具有准确语义的UML组合关联。

3.1复杂对象动态操作语义的描述逻辑表示

领域模型中的动态操作可以用映射Sa表示,用于反映数据访问层增、删、改、查操作对数据库状态产生的变化。数据库状态也是对客观世界的映射结果,类似于描述逻辑知识库,也可以用解释I,:=(△II)定义。解释函数-I'的解释域与描述逻辑CATSbqr的解释域-1相同,数据库中存放的记录通过解释函数-I‘映射到客观世界中的对象,解释I,中的概念是解释I中对应概念的子集,因此数据库状态中的记录也满足描述逻辑CATSbqr的TBox和Abox知识库。映射S。作用于数据库状态对应的解释I上。

领域模型中动态操作复杂对象的语义可以根据定义1转换成CATSbqr的操作语义表达式。

定义1(动态操作复杂对象的语义到操作语义表达式的转化规则)给定一个组合关联的类图W,若组合类C和部件类D之间的组合关联为r,组合端的重数只能为[1..1],部分端的重数为[ni..n2]。类图W对应的知识库为cp(W),对于组合关联r,操作组合类C的同时也操作部件类D。ol和02满足断言C(01)、D(02)、r(02,ol)、r(oi,02)。组合类C的动态操作语义表达式的转换规则如下:

增加完整的复杂对象的表达示为

删除完整的复杂对象与添加复杂对象相似,删除各元素的顺序与添加相反,表达式为

查询完整的复杂对象的表达式为

修改完整的复杂对象的表达式为

在组合关联中,执行一次组合类对象的操作应涉及的部件类对象的数量与部件端的重数相符。

3.2复杂对象动态操作语义的实现算法

增、删、改、查的语义可以按照定义1的转化规则转化成操作语义表达式,优先级是从左到右,操作语义表达式的算法实现完全按照表达式的语义和优先级执行。由于篇幅原因,本文只给m增加操作的实现算法,删除、修改和查询算法可以按照类似的过程实现。

以2.2.2节中的TBox知识库K2为例,增加完整复杂对象A的动态操作语义表达式为

Ccreate=D0{02}.C0{ol}.r0{(0l,02)}

(3.1)

更新是两个解释中的差异。操作语义表达式3.1的语义是在原解释域I中增加更新createl中的一个销售单,使得解释I变更为解释I。这个过程需要增加销售活动对象ol、与o.组成销售单的销售商品项对象oz、销售单与销售商品项的联系(ol,02),增加的02对象和(ol,02)关系的数量与重数[1..*]一致,增加操作对应的实现如算法createA(Aa)所示。

4组合关联描述逻辑表示的应用

4.1销售单业务语义的描述逻辑表示

销售单是表示顾客所订商品的名称、规格、数量以及其他与顾客订货单有关信息的凭证,作为销售方内部处理顾客订货单的依据,用丁记录一次销售活动的信息以及在本次销售活动中所销售的若干个商品的信息。

对销售单进行语义分析,抽象出图4.1所示的示意图,以描述现实世界中的销售单,其中,销售单代表整个销售单,记为S,用于记录包含销售活动和销售商品项两部分的完整信息,以描述某次销售活动的完整情况;销售活动表示某次销售活动,记为SO,用于记录购买单位、日期、单据编号、经办人等信息,以描述某次销售活动的总体情况;销售商品项表示某次销售活动中所销售的某个商品,记为SI,用于记录商品的名称、规格、数量等信息,以描述销售某个商品的信息。

从整个复杂对象外部的更高抽象层次来看,1张销售单S包含2种属性:1个销售活动S0和至少1件销售商品SI。使用CATSbqr将销售单业务对象的TBox知识库表示为:

其中,S、SO和SI是概念,语义分别是:

Si={oIo∈销售单),

SOi={oIo∈销售活动),

SlI={olo∈销售商品项)。

st和si是联系,语义分别是:

stl={(o,o)l(o,o)∈销售单与销售活动的关系),

Sjl={(0,o)l(o,o)∈销售单与销售商品项的关系)。

表达式4.2中T的语义是

TI={oIoE参与销售单与销售活动关系的销售活动}。

表达式4.3中T的语义是

TI={oIoE参与销售单与销售商品项关系的销售商品项}。

4.2销售单类图的描述逻辑表示

实际工程应用中,在领域建模阶段一般用UML描述销售单,设计出如图4.2所示的类图。其中,SalesOrder表示销售活动,Item表示销售项,组合关联salesitem表示整个复杂对象与Item类间的强关联,其组合端和部分端的重数分别为[1..1]和[1..*]。为了更符合工程应用中的情况,图中增加了Customer、Product两个类。

从整个复杂对象内部的抽象层次来看,1个完整的复杂对象由1个销售活动实例SO和至少1个销售商品实例组成,销售单是销售活动和销售商品项的顶域。根据CATSbqr对类图的编码规则,图4.2转换成的CATSbqrTBox知识库为

其中,概念SalesOrder、Item和T的语义分别是:

SalesOrder'={olo∈销售活动),

ItemI={olo∈销售商品项),

Ti={oIoE销售单)。

联系salesitem-和salesitem变化后的语义分别是:

(salesitem-)I={(o,o)l(o,o)∈销售单与销售活动的关系),

salesitemi={(o,o)l(o,o)∈销售单与销售商品项的关系)。

表达式4.4中T的语义是

TI={oIoE满足销售单与销售活动关系的销售活动}。

表达式4.5中T的语义是

TI={oIoE参与销售单与销售商品项关系的销售商品项}。

4.3增加销售单操作语义的描述逻辑表示和实现

增加操作的实现算法完全按照增加的操作语义表达式的优先级和语义实现,删除、修改和查询算法实现也可以参照类似的方式。由于篇幅原因,本文只给m增加销售单操作的实现算法。增加整个销售单S的动态操作语义表达式根据定义1可以描述为

其中ol、02满足更新createl中的断言SalesOrder(ol)、Item(02)、salesitem(oi,02)。创建完整销售单对象S的动态操作语义表达式SalesOrder。reat。的关键代码实现如算法createSalesOrder所示。

5结束语

本文针对UML存在组合关联语义定义模糊,导致从领域模型自动转换为数据访问层代码的精确度不足的问题,提出了描述逻辑CATSbqr语言,使用CATSbqr准确地描述了UML组合关联的语义,并分析了组合类和组合关联的语义变化,另外,使用描述逻辑CATSbqr表示了动态操作复杂对象数据的语义,并通过实例说明了该方法的实用性,为实现领域模型到数据访问层的代码自动化提供了理论基础。

致谢在此,向本文提I叶{宝贵意见的评审专家表示衷心的感谢。

参考文献

[1]WinstonME,ChaffinR,HerrmannD.Ataxonomyofpart-wholerelations[J].Cognitivescience,1987,11(4):417-444.

[2]季文天,郭清菊,马杰.基于模型驱动的框架技术在数据采集平台中的分析与应用[J].软件,2014,35(3):121-124.

[3]BrownAW.Modeldrivenarchitecture:Principlesandpractice[J].Software&SystemsModeling,2004,3(4):314-327.

[4]洪立印;徐蔚然.一种结构化数据关系特征抽取和表示模型[J].软件,2013,34(12):148-151.

[5]叶新,潘清,董正宏.多领域建模仿真方法综述[J].软件,2014,35(3):233-236.

[6]OMG.formal/2011-08-06.uml-Superstructurespecification2.4.1[S].2011-08.http://www.omg.org/spec/UML/2.4.1/Superstructure

[7]

MichaelBlaha,JamesRumbaugh.UML面向对象建模与设计.第2版[M].北京:人民邮电出版社,2006:66-69.

[8]RumbaughJ.Controllingpropagationofoperationsusingattributesonrelations[C]//ACMSIGPLANNotices.ACM,1988,23(11):285-296.

[9]DeGiacomoG,LenzeriniM.What'sinanaggregate:Foundationsfordescriptionlogicswithtuplesandsets.INTERNATIONAL

[10]CalvaneseD,OrtizM,SimkusM.EvolvingGraphDatabasesunderDescriptionLogicConstraints[C]//DescriptionLogics.2013:120-131.

[11]CalvaneseD,DeGiacomoG,LemboD,etal.Tractablereasonmgandefficientqueryanswermgindescriptionlogics:TheDL-Litefamily[J].JournalofAutomatedreasoning,2007,39(3):385-429.

[12]CalvaneseD,DeGiacomoG,LenzeriniM,etal.View-basedqueryansweringandquerycontainmentoversemistructureddata[C]//DatabaseProgrammingLanguages.SpringerBerlinHeidelberg,2002:40-61.

[13]Thedescriptionlogichandbook:theory,impleruentation,andapplications[M].Cambridgeuniversitypress,2003.

[14]LiuH,LutzC,MilicicM,etal.FoundationsofInstanceLevelUpdatesinExpressiveDescriptionLogics[J].ARTIFICIALINTELLIGENCE,2011,175(18):2170-2197.

[15]BerardiD,CalvaneseD,DeGiacomoG.ReasoningonUMLclassdiagrams[J].ArtificialIntelligence,2005,168(1):70-118.

[16]MellorSJ,ScottK,UhlA,elal.MDAdistilled:principlesofmodel-drivenarchitecturepracticeandpromise[M].Addison-WesleyProfessional,2004.44-389.