解救西西弗斯- 模型驱动架构

2024-02-27 02:32

本文主要是介绍解救西西弗斯- 模型驱动架构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

西西弗斯是古希腊神话中的科林斯国王,他被罚将一块巨石推到山上,但无论西西弗斯如何努力,每次石头到达山顶之前都不可避免地滚下来,周而复始,永无休止。

在《应用MDA》一书中,作者FrankelIT人比作现代版的西西弗斯,面对日新月异,层出不穷的技术平台,不可避免地不断重复一些工作。理想的“MDAer”,试图阻止这一悲剧的继续发生。今天,我们通过分析MDA的概念,了解其内涵,看看MDA是否有希望完成这个艰巨的任务。

MDA概述

MDA是由OMGObject Management Group,国际对象管理集团)于2001年提出来的。其核心思想是抽象出与实现技术无关,完整描述业务功能的核心平台无关的模型(PIMPlatform Independent Model),然后针对不同实现技术制定多个转换规则,通过这些转换规则及辅助工具将 PIM 转换成与具体实现技术相关的平台相关模型(PSMPlatform Specific Model),最后将经过充实的 PSM 转换成代码。MDA的目的是通过PIMPSM分离业务建模与底层平台技术,以保护建模的成果不受技术变迁的影响。

                                1.MDA的结构示意

1MDA的结构示意图,最内环是MDA的核心技术:MOFMeta Object Facility,元对象设施)、CWMCommon Warehouse Metamodel,公共数据仓库元模型)和UMLMDA的主要工作就是要把基于这些技术建立的PIM转换到不同的中间件平台上,得到对应的PSM

中间环上给出的是目前主要针对的实现平台:CORBAXMLJAVAWeb Services.NET。显然,随着技术的发展,这个列表将不断扩充。

最外环是MDA提供的公共服务如事务(Transactions)等,向外发散的箭头是指MDA在不同垂直领域的应用,如电子商务、电信和制造业等。

OMG网站的MDA首页上,图1的右边是OMG给出的一段解释,这段解释从2001年放上去后就没有改变过,相对于IT界的日新月异来说,这段解释堪称“化石”了。具体内容翻译如下:

MDA提供了一个中立于各开发商的开放的方法,以应对业务和技术变化带来的挑战。基于OMG制定的各项标准,MDA将业务和应用逻辑与底层平台技术分离开来。通过使用UML以及其他的OMG建模标准,来表达应用程序或者集成系统的业务功能和行为,得到的平台无关模型可以通过MDA实现到各种平台上的,如Web Services.NETCORBAJ2EE等。这些平台无关模型将应用的业务功能与行为同实现它们的技术特定的代码分离开来。随技术一起的,是为支持跨越不同平台的交互性而带来的无情的繁杂循环,MDA将应用的核心从他们的魔爪中保护出来。(在MDA的工作方式下,)不管应用了哪种具体的技术平台,系统的业务部分和技术部分都可以各自演进(而互不影响)。业务逻辑随业务需求的变化而改变,如果业务有需要的话,技术部分也可以随时享受到新的技术发展带来的好处。

MDA的定义,OMG的官方解释是:MDA提供了一种应对互操作性挑战的开放的、供应商中立的方法,它构建于OMG的既有建模标准之上,并充分利用了这些既有标准的价值。

可以注意到,OMG强调MDA必须基于OMG的各项标准。而软件业发展这么多年,太多的故事表明,成功的标准多半是顺其自然产生的。刻意而为的理想主义者的标准,如UML,在商业利益和其他各种因素的作用下,往往是困难重重。

 

近年来,MDA在工业界的发展非常迅速,诞生了很多优秀的开源和商业工具。软件巨头微软和IBM也都加入了这个战场,但是,这其中大多数的工具都并没有严格遵循OMG的标准,最典型的就是微软的VSTS了,难道说它们都不是MDA的工具和应用了?

因此,对于MDA,我们可以分为广义的和狭义的两种。广义的MDA认为,对于某种工具或者方法,不论是否严格遵循了OMG的各项标准,只要实现了系统业务逻辑和实现技术的分离,我们都认为它是支持MDA的,比如VSTSRational Rose。而相反,狭义MDA则不仅看效果,还要看手段,必须遵循OMGMDA的模型组织和元建模、建模、管理和执行的一系列标准的,才可以说是支持MDA的。显然,在这种定义下,VSTS并不是一个MDA工具。

狭义MDA

狭义的MDA指定者是严格的标准主义者,他们希望用一套基于一致语义基础的统一的元模型/模型管理框架将模型管理起来,并应用基于这个一致语义基础的各种标准来实现对模型的建模、元建模、转换等各种操作。

可以举个例子来解释“基于一致语义基础”。比如在UML之前,有几十种不同的面向对象建模语言,不同的语言对相同的概念有不同的叫法,例如现在UML中的类的操作,曾经被叫做“责任”、“函数”、“服务”和“方法”。这样,假设有两种建模语言aMLbML,基于aML建模得到的系统模型和基于bML建模得到的模型,相互之间用的不是一种语言,不能相互理解,很难交互,需要一个翻译。这样往往带来额外的开销和效率的损失。而有了UML这个统一的建模语言之后,这些问题就迎刃而解了。

MDA的架构中,UML只是“unified modeling language”,是应用于面向对象设计和开发领域的建模语言,而不是“universal modeling language”,不是万能的建模语言。比如数据仓库、软件过程管理等不同的领域,都各自有自己特定的术语,比如系统设计人员,满口说的是“类”、“接口”、 “方法”、“关联”,软件过程建模人员满口说的是“角色”、“活动”和“工作产品”、“文档”。为了表达的清晰方便,OMG为不同的领域定义各自的领域特定语言。例如,UML应用于OO设计与开发,给系统设计人员用;而为软件过程建模人员,OMG定义了SPEMSoftware Process Engineering Metamodel),其中定义了软件过程建模需要用到的各种抽象概念和关系结构。

但是,这些不同的领域建模语言之间也有交互的需求,例如UML模型中的一个构件,可能对应于SPEM模型中的一个工作产品。为了保证不同领域的模型之间的交互,这些不同的领域建模语言也需要一个“一致的语义基础”。这也正是MDA的核心,OMG为此给出的答案是MOF。、

                                       2. MDA的模型和标准

如图2所示,MDA中将模型和元模型分为四层,其中:

M0层是实例层,这一层是M1层模型的实例化。例如,对应UML模型的具体的一个程序。

M1层是模型层,是建模人员通常所面对的模型,例如图中的UML模型,是分析和设计,包括开发人员最为熟悉不过的了。

M2层称为元模型层,其中对应的是M1层模型的元模型,如UMLSPEM等。M2层元模型中提取了不同领域的抽象概念和关系结构,为M1层的建模提供了建模符号。也即,M2层提供对应不同领域的领域建模语言。

M3层是元元模型层,MOF就位于这一层。MOF提供了定义M2层元模型所需要的更抽象一级的建模支持。MOFM2层所有元模型的元模型,同时,它也是自描述的,MOF可以描述MOF元模型自身。注意,在MDA框架中,M3层只有MOF这一个模型,它是MDA中最基础和核心的标准,它为MDA框架中的所有模型/元模型提供了统一的语义基础,使得基于MOF的统一的模型操作成为可能。

如上所说,MOF解决了M2层不同元模型之间的交互性。其中重要的一点是MOF支持自省(introspection)机制,在MOF中,定义了操作基于MOF的各级模型和元模型的统一的反射接口如RefBaseObject, RefObject,RefAssociation, RefPackage1

Reflective::RefBaseObject //获取所有的MOF对象

Reflective::RefObject //获取所有对象(对应MOFclassifier的对象)

Reflective::RefAssociation //获取所有Association对象

Reflective::RefPackage //获取所有Package对象

通过这些接口,遵循MOF的程序实现可以在不了解一个对象接口的情况下使用这个对象,即,可以遍历各层的对象结构,找到需要的对象并进行相关操作。例如创建、更新、访问和调用M1层对象实例的操作。

在实际使用中,需要使用编程语言来实现这些接口。为利用标准化的好处,需要定义从MOF到这些(MDA之外的)编程语言之间的映射。例如,定义Java中实现RefObject( ) 接口的规格,这样可以保证一个JavaMOF实现可以被其它用户统一地使用。

如图2右边部分所示,OMG定义了从MOFJavaXMLIDL等的映射。其中最早定义的是从MOFIDL的映射。到XML的映射就是XMIXML Metadata Interchange)标准;Java的映射就是JMIJava Metadata Interface;正在制定中或即将制定的还有到WSDL.NET的映射。目前,XMI已经广泛应用于各UML建模工具中,用于存储模型并在不同工具之间导入导出;JMI也广泛应用各种基于JavaMDA工具中,例如AndroMDA中就用了SunJMI实现MDR

除了图2中出现的MOFJMIXMI之外,MDA中还有两个重要的标准需要提一下,那就是QVTOCL

QVTQuery/View/Transformation):模型转换标准,为基于MOF的元模型/模型之间的转换提供标准的转换规则描述语言;

OCLObject Constraint Language):对象约束语言,用于配合UML和其它M2层元模型,精确地描述模型语义。

标准化的好处毋庸置疑,基于这些标准,工具厂商可以开发自动化的工具。理想情况下,开发人员只需关注于业务建模,开发PIM。从PIM如何得到最后面向具体技术平台的可执行的应用程序,都由自动化的MDA工具来解决了。

这些看上去好像很理想化,似乎是可以解决软件危机的“银弹”了。但事实上,现实总是残酷的,首先,将开发工具从高级语言变为抽象层次更高一些的建模语言,可以起到一定的作用,但还是不能解决软件开发的根本复杂性。其次,就是目前这样一个理想化的MDA架构和相关标准,也是千呼万唤出不来,即使出来也还要反复修改,无法稳定。例如,MDA中重要的QVT标准,从2002年发布RFPRequest for Proposal)至今,还没有第一版的标准出来。

广义MDA

实现理想框架的复杂性和难度,对OMG日渐官僚的不耐,以及更重要的商业利益和其他各种因素合在一起,促使软件开发商们纷纷踏上了其他的探索之路。

不管白猫黑猫,抓到老鼠就是好猫。对软件开发者以及各种使用者而言,只要实现了业务逻辑和底层技术平台的分离,能够保证当年辛辛苦苦建模的成果不随着技术平台的变化而像西西弗斯推石头上山那样,一遍一遍不可避免地重来,它就是MDA

3 基于MDA的开发过程

如图3所示,对应传统的需求-分析-设计-开发-测试-交付过程,基于MDA的开发过程由模型和模型之间的转换组成。最终的应用程序也可看做模型,它是对应最终实现平台(如机器码)的PSM

MDA开发过程中,按照时间顺序,首先由需求人员建模得到PIM(有些地方将完全不包含技术设计的这个模型称为CIMComputation Independent Metamodel,即计算无关模型,我们也将它看作一种PIM),在需求分析阶段都可对PIM进行精化;然后在对应传统开发的设计阶段,进行PIMPSM模型转换,最后是从PSM到最终程序的转换,对应为传统开发的开发编码阶段。

为支持以上过程,需要有些人做一些相关的准备工作,例如,在进行领域建模时,需要有对应的领域元模型,用以作为方便的建模语言。在进行PIMPSM的转换时,自动化工具需要根据转换规则来进行,而转换规则需要有人来事先提供。这些元模型和转换规则都是可以一次写好,重复使用的。

在微软的VSTS中,提供了定义领域特定语言DSLDomain Specific Language),也就是我们上面所说的领域元模型,并支持从基于DSL的模型到程序代码的生成以及双向工程。

微软是典型的背叛标准者,把MDA的思想全盘接受,换个名字,然后决然抛弃了MDA的核心标准UMLMOF 。同时,微软又是绝对的现实主义者,他从切实提高开发效率出发,提供至少在目前阶段更容易被开发者所接受的MDA开发支持。我认为,从这个意义上说,VSTS是广义的MDA工具。

其他很多工具,由于商业宣传等因素,只要和模型转换、代码生成等挂上钩的,往往也声称自己是MDA工具。按照上文我们分析的,只要实现或者部分实现了业务逻辑和技术细节的分离,都可以说是广义的MDA工具,比如基于Velocity面向特定平台的J2EE的代码生成工具XDocletMiddlegen等。

Brooks在人月神话中提到,软件开发问题的原因在于软件的根本困难:概念结构的复杂性、不一致性、可变性和不可预见性,因此没有可以彻底解决问题的“银弹”。不管是狭义的MDA还是广义的MDA,都只能帮助开发人员降低开发时所面对的复杂度,并不能解决根本的问题。回到文章开始提到的问题,MDA可能难以解救西西弗斯,但是,我们相信它是向着这个方向努力的,即使只是给软件业的西西弗斯们送个千斤顶,让大家喘口气儿,也已经是很大的功劳了!

最后,给大家推荐几个链接:

1. www. Modelbased.net        上面给出了MDA等各种工具的列表介绍,还经常更新。

2. yuandafeng.googlepages.com   我试图开始整理的一个MDA资源页面。

其他我想要推荐的链接,在2上面也可以看到了。

参考文献

[1] http://www.omg.org/mda/

[2] 模型驱动架构MDA介绍,袁峰,非程序员,总第32期,

[3] http://blog.csdn.net/yuandafeng/archive/2004/12/13/215191.aspx

[4] http://www.omg.org/technology/documents/modeling_spec_catalog.htm

这篇关于解救西西弗斯- 模型驱动架构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/750955

相关文章

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta