模型驱动设计(MDD)之灵活设计

模型驱动设计(MDD)之灵活设计,第1张

灵活设计可以使我们随着项目开发的进行,感到速度越来越快,而不是越来越慢,甚至 停滞不前。灵活设计是对领域建模的补充,当我们从领域中抓住那些隐隐约约的线索和概念原型后,就象准备好原料;下面就是通过迭代将原料锤炼成一定具体的形状,可以俗称“打铁”,那么打铁打到什么形状算可以了呢? 也就是最终希望达到什么样的设计呢?

有些软件打着“灵活性”旗号,却出现很多多余的抽象和间接层次,从而导致了复杂性,灵活性可能导致复杂性, 但是灵活性不是导致复杂性的必然原因,如何将灵活性的发展通往简单,其中精湛技巧就需要学习和不断实践, 正确的理论指导是必不可少的,模型驱动设计(MDD)提供这样一个科学的方法论。

在Eric Evans的“领域驱动设计”一书中专门探讨了这样提供灵活设计的模式和方法,下面简要述说如下:

明显意图的接口

接口的名称必须表达明显意图,而不是模棱两可,接口虽然是抽象,但是也不能抽象到别人不知你所云, 如果其他开发人员必须查看接口的实现子类才能搞清楚你这个接口的意图,那么你的接口抽象无疑是失败的,

使用明显意图的接口可以将整个子领域切分成一个个单独模块,每个模块使用带有明显意图的接口封装起来, 这种切割方式用来调整项目的焦点和对付大型系统的复杂性。

如果仅仅有大型系统开发经验,但是没有大型系统的分割经验,更重要的是良好设计理论基础,那些大型 系统开发经验也只是如过眼烟云,不会在你的程序生涯中占据多大的重要位置。

下面我们聚焦被划分成单个模块的内部设计模式:

边界影响

在软件中, *** 作分为:命令和查询,命令就是能够使 系统状态发生改变的 *** 作,如增删改等 *** 作。这些 *** 作都可能需要有副功能,如希望增删改完成后还要返回一些结果,这些主要功能之外的副业,也称为边界影响(side effect)。一些传统过程经验的程序员经常喜欢搞“一机多用”,喜欢将很多功能揉合在一起。

大多数 *** 作会调用其他 *** 作,造成任意深度的嵌套,这样形成一个树形结构的调用关系,这就容易使我们很难 预测调用一个 *** 作会产生什么样的结果,调用一个 *** 作变得谨慎,甚至战战兢兢,虽然Ioc或DI container使 得这种嵌套关系的管理变得容易,但是不能保证每个 *** 作本身的设计能降低复杂性,后者就是我们现在关注的。

为什么我们调用一个 *** 作时会变得小心,因为这个 *** 作设计时可能不执行主要功能,还有其他副功能,这些 副功能可以认为是一种多余副作用,解决办法很简单:设计这个 *** 作时消灭副作用;如果不能消灭,就将其 分离显式分离并单独表达出来。

所以,我们设计增删改命令和查询功能时,尽可能分离它们到不同 *** 作中实现,不要在增删改命令执行的同时 返回任何领域数据。

如果边界影响不能通过设计避免,那么我们就直面它,在增删改等命令执行同时返回数据,当这样做的同时, 我们就使用断言assertion来约束我们这样的设计,通过断言能够易于使用单元测试Junit等工具测试。从而 保证你的命令简单有规则。

总之还是那句有些哲学意义的话:对于边界功能,首先要去除它,如果不能回避它,就承认它,但是同时会约束它。

边界影响主要的是Service接口怎么做的问题。在实际项目中,Model和Service是相互结合不断重构的。那么Model和Service粒度是如何界定的?

模型驱动应用的核心和症结就在于一个长期困扰我们的问题:如何对复杂问题建模?对模型驱动的众多怀疑正是这个问题没能得到有效解决的明证。

一、MDA的规划及实现

MDA的规划其实是非常宏伟的,MDA显然充分意识到了问题的复杂性,所有严格区分了MDA四类模型:

1、计算无关模型(Computation Independent Model, CIM)

2、平台无关模型(Platform Independent Model, PIM)

3、平台特定模型(Platform Specific Model, PSM)

4、实现相关模型(Implementation Specific Model, ISM)。

其中3、4二个模型解决软件基础设施问题,也即如今热门的业务基础平台问题。模型驱动实现的关键在于,从PIM到业务基础平台如何对接。就MDA的规划来看,主要是通过模型交换。但可执行UML(xUML)显然给出了另一种快捷的方式。这样,就有二种模型驱动的实现方式:

xUML--就是使用动态执行引擎直接执行UML模型

模型交换--就是把PIM模型变换为容易执行的PSM模型

MDA更多的是从白盒视角规划了业务基础平台的实现架构。可执行UML的模型驱动程度无疑更高。且较之MDA采用PSM来解决对多平台的支持,xUML则是类java跨平台的方式,显得更为敏捷。

二、计算的逻辑模型或逻辑服务模型

更重要的是,xUML实际上消解了PIM与PSM的区分,而专注于计算的逻辑模型。所以,在关于《新一代企业信息系统研究与开发纲要》的对话中,我用不严格的语言表术了这个问题:

从现实的观点出发,逻辑层(或服务层)才是模型驱动的关键。就一般而论,业务模型与技术体系的松散耦合,是以逻辑服务层为中介的。所以,我得出一个结论:一套良好的服务元语义,可能是模型驱动系统的关键。

这里,我把计算的逻辑模型称为逻辑服务模型,是想融合进SOA的思想(而不是技术)。所谓一套良好的服务元语义就是指一种xUML的规范。显然,这里一个隐含的前提是,UML语言本身并不能直接作为这种规范,需要在其上扩展,尤其是融合DSL,方能构建出良好的服务元语义。

当然,这里出现了抛开UML另起炉灶的观点。从理论上,这也是可行的。比如,Microsoft就可能这样做。但是,这个成本太高,也只有Microsoft玩得起。事实上,模型驱动的思想很早就出现了。如今通过MDA流行起来,实际上是得益于UML的成功。抛开UML谈模型驱动,明显缺乏根基。最近UMLChina上的一个消息微软: "UML and more" 的延期和期待表明,就是财大气粗的Mcrosoft也并不想赤地抛开UML闹革命。所以:

UML无疑还是需要的,它是“模型驱动应用”具备现实可行性的前提。重要的不是抛弃UML,而是如何完善和拓展UML,以构造一套良好的逻辑服务建模规范。

在我前面的一系列随笔中,多次提到业务本体分析的意义。实际上也是在探索拓展UML的可能方式。把“本体”概念与UML关联,无疑很有希望开拓一个全新的领域。当然,这个难度很大。我曾经在转帖:CYC+CRM:知识商务的未来之路 中说:

就已有成果看,如CYC给出的知识体系,同ERP类企业建模产生的抽象业务体系,在概念的分类上有较大的交叉;尽管从理论上讲融合起来是可能的,但实际上将可能是长期的过程。

Bartender脚本可以使用许多不同的方法来获取其他对象的值。其中一种方法是使用“Get”函数,它可以从其他对象中获取值。例如,如果要从一个文本框中获取值,可以使用以下代码:

var value = Get("TextBox1");

另一种方法是使用“Find”函数,它可以搜索整个文档,以查找指定的对象。例如,如果要搜索文档中的所有文本框,可以使用以下代码:

var textBoxes = Find("TextBox");

最后,Bartender脚本还可以使用“GetProperty”函数来获取对象的属性值

在 Animation---set Driven Key---set这个就是驱动关键帧,上面为驱动者属性,下面为被驱动者属性,你想用驱动者属性驱动被驱动者属性,就先选好各自的属性,然后点一下下面的KEY按钮,希望采纳

把用户请求参数封装到一个javabean中,Action中使用一个独立的modle实例来封装用户的请求参数和处理结果,action完成业务逻辑调度,使用2个类来分解action任务,这就是模型驱动。

1) 新建插件项目:在RSA中选择"File-> New ->Project…"新建插件项目,选择"带转换的插件"模板,它是RSA为构建新的转换提供的实现机制。

选择之后Wizard会自动提示输入新建转换源和目标模型类型及相关联的属性,并为转换创建规则定义

2) 基于RSA提供的模型转换框架,实现具体的模型转化规则。RSA的模型转换插件项目向导(Wizard)会自动生成模型转化框架

在RSA中使用Transformation实现模型驱动的软件开发

我们实现了三个示例转换Analysis to Design, BM Business to Use Case,BM Use Case to Analysis,并以插件的方式嵌入倒RSA(如图31)。

图31 三个示例转换

基于这一框架,用户需要根据具体转换实现需求,完成ClassRule和OperationRule的具体实现,完成具体的Transformation的转换逻辑。

以下是使用RSA进行模型驱动开发的步骤:

1.首先建立一个RSA项目及一个简单的业务模型,也就是CIM;

2.通过BM Business to Use Case转换,将业务模型(CIM)转换为用例模型(PIM1);

3.进一步通过BM Use Case to Analysis将上一步骤产生的用例模型(PIM1)转换为分析模型(PIM2);

4.再将设计模型(PIM2)转换为设计模型(PSM);

5.最后将设计模型(PSM)转换为代码。

以上就是关于模型驱动设计(MDD)之灵活设计全部的内容,包括:模型驱动设计(MDD)之灵活设计、如何建模:ODM、CIM及模型驱动的层次、bartender脚本如何获取其他对象值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10156941.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存