快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

和记娱乐的网址_博格自动化网进入



3处置惩罚模型

解析器 vs代码天生 (未评级)

平日大年夜家都邑倾向于天生代码,着实解析也是一种可用的选择,在我们完成我们的元数据模型后,由解析器读取这个元模型数据,可以查询或者遍历模型,可以直接谋略,进行互相处置惩罚,UI出现.

对解析与代码天生之间进行权衡, 代码天生的优点:

1. 加倍简单, 天生的代码我们可以反省,别的天生代码采纳的模板都是我们经由过程之前手写的代码抽象提炼出来的.

2. 比解析的要领更轻易调试

3. 经由过程扩展代码的要领,加倍强大年夜,定制性强,可以根据需求机动开拓出加倍强大年夜的功能,比解析器加倍有效

4. 直接可所以任何目标说话和平台,由于天生的目标说话代码是由模板节制的,我们只必要定制不合说话的模板即可。假如目标说话支持其它平台,那这种要领自然也支持,而解析器的要领要求直接运行在目标平台上

5. 应用天生代码的要领,使MD*模式加倍彻底. 直接模型驱动营业,驱动界面

解析的优点:

1.改动模型不用颠末 从新天生/从新编译/从新测试/从新支配 这些步骤,显着缩短了周期.

2.全部系统都基于模型, 以致可以做到直接在运行的系统里改动我们的模模型,使改动急速生效. (比如一些在线saas系统).

3.对付一些案例来说,解析器和模型会比天生代码还会省事

解析和代码天生的要领也可以结合应用,直接天生些XML款式的模型数据,然后由3GL说话,比如java解析器来解析,驱动全部系统的运行。别的一种措施理论上也是可行的,在解析器内即时直接天生代码,前进机能.

零丁的模型反省机制

元数据模型所表达并不必然是精确的,里面有大年夜量的用户输入。模型约束是必须的,并且要贯穿全部模型处置惩罚,约束不仅判断是否有差错,还要有详细的差错信息能够提示给用户. 模型和约束越多,用户呈现的差错也就会越多,不过这才能够包管目标系统的精确性。必然只管即便多地做约束反省!

约束反省在模型处置惩罚历程中应该只管即便的早,不能够把约束放到代码天生阶段,会使模板过于繁杂而且复用性差,你假如有不合的说话模板,还必要不合的反省实现。假如模型有问题,就不应该容许代码天生,否则只会带来更多的问题。

必要在模型处置惩罚历程中的不合阶段,模型的不合部分,反省不合的约束. 比如在转换之后必要反省,在保存分区必要反省,在用户的一些输入后必要反省,在用户对模型进行一些操作后必要反省

在模型的改进历程中,在每个级别都要进行反省,防止改动历程中的一些级联影响,别的必然要确保每个级别每个点都反省到,只是反省从上一级的精确输入是肯定不会掉败的,然则用户并不是的输入是弗成信的.

对反省结果信息分不成的级别,比如差错和警告,假如发生差错,就不能够进行下一步了,警告则不是。

不要改动天生的代码

纵然模型天生了代码,在大年夜多半环境下,手写代码照样必须的。以是我们要把手写的代码和天生的代码结合起来,更不能够每次天生把手写的代码覆盖掉落.大年夜多半对象供给了所谓的保护区,在保护区里你可以插入你的手写的代码,来保护不被覆盖。

这样也会有一些问题,天生代码并不是一次性的事情,当改动和完善,导致你的天生代码有了很多“沉积物”的时刻,会每每必要从新天生代码来洗濯这些“沉积物“,假如没有所谓的保护区,你就可以直接删除所有的天生代码整个从新天生了。

应用扩展的措施,向天生代码里面添加扩展点,采纳委托,接口,#include的要领,或者是应用反射,AOP模式,有些说话供给部分类(比如C#),这样我们能够使天生的代码文件与手写的扩展代码文件瓜分开来. 这样做也有毛病,假如你改动模型天生不合的代码,手动改动的代码并不会自动的响应重构(必要实践验证),别的这种主要会使代码的实现赓续增添,编译光阴也会增添.

跟着对象的赓续改良,可能会有更多的可行的措施,不过到现在为止,添加扩展的措施是问题起码的。

节制手写代码

天生器天生了一些模型元素的抽象类,期望开拓者实现抽象类并且要相符命名约定,然则假如我们只是天生,怎么才能提示开拓者来实现自己的代码呢?

假如详细的实现类被调用或者抽象措施被调用,在编译的时刻会有编译差错,开拓者根据差错的不合,实现自己的代码,然则这并不显着,由于还必要开和记娱乐的网址拓者去根据差错类型去排查。

有两个措和记娱乐的网址施办理这个问题:

1. 对天生的代码天生约束和反省,能够由IDE调用评价代码,假如有差错,把消息申报给开拓者,必须按照指定的要领实现了代码,差错才会消掉.

2. 有些时刻天生的代码不会履行,由IDE直接调用缺掉的部分。比如假如必要用户手写一个天生的子类,我们就可以天生以下这句:if (false) { GeneratedBaseClass x = new Manua和记娱乐的网址lSubclass() }.

关注天生的代码

不要以为天生的代码就可以扔掉落不管了,与天生代码集成时,你将不得不看天生的代码,在必然程度上懂得它,以致在某些时刻调试它。因些,要确保天生的代码文档规范,命名规范,代码缩进。着实这些在你的模板文件里都很轻易实现,别的在天生的代码里写上必要的信息,以供后期查看。

使天生的代码遵照和手写的代码相同的标准.

在一些异常成熟的情况下,可以天生100%的代码,而不用再手写代码来扩展实现,在这种环境下,这里所说的这些就不适用了。

包管天生的代码不偏离模型

在许多环境下,必要实现一些约束来验证一些属性的精确性,为了确保模型的数据都由代码保存,应用以下两种措施:

1.天生的代码不容许违抗模型的允诺.例如:不裸露工厂容许组件查找和应用其它组件(直接创建依附),而是要应用依附注入供给合理的工具引用.

2.应用布局阐发对象(依附反省器)验证手写代码,可以很轻易从模型秋这些布局阐发对象天生反省规则.

视点级处置惩罚

上面提到的视点不仅和模型设计有关,而且对付处置惩罚模型也很紧张。 有些时刻可能必要零丁的对不合的视点模型反省约束。有些视点可能更得当解释处置惩罚,而不是代码天生。 当天生代码时,也可能会斟酌基于视点分阶段天生.

别的还必要留意,已经有了一个应用模型分区进行瓜分的机制,每个分区应该被零丁处置惩罚。假如分区和视点同等,会很使得很轻易处置惩罚。

视点设置设置设备摆设摆设(未评级)

对付应用视点和分区的系统来说,当模型处置惩罚器运行时,常常会有一些选项必要指定:应用约束的一些子集验证全部模型;仅仅天生子系统的营业逻辑代码;或者是天生针对临盆情况的全部系统的支配代码.

应用零丁的模型来处置惩罚设置设置设备摆设摆设是一个不错的选择,这样为模型处置惩罚器绑定了“关注的范围”,经由过程处置惩罚”编译器设置设置设备摆设摆设”也作为一个模型,能够带来很多方便,天生模型数据到属性文件或者XML文件,使得更轻易处置惩罚.

关注模板

代码天生模板是模型处置惩罚历程中核心资产之一,它包孕着DSL表达的领域观点到实今世码的映射。跟着光阴,模板数量肯定会增添,掩护起来会有一些问题,关注以下这些技巧:

1.把模板分成一些小的模板,互相调用.

2.把一些通用的繁杂表达式提炼成措施,能够被所有的模板调用。

别的还有一个提示: 模板文件只为自己供给缩进要领即可,对付天生的文件,可以直接全局应用代码款式化对象来处置惩罚。

对付一个成功的框架天生代码,模板代码的需求总量削减,它们间的只有少数必要改进掩护.

M2M转换简化代码天生

在一些环境下,应用逐一个Model-to-model转换器代替代码天生,比如对付一个描述分层组件架构的DSL,大年夜多和记娱乐的网址半组件运行时平台不支持这样的分级布局,以是必要“扁平化”布局。在这种环境下,不要盘算应用代码天生器,而且斟酌先应用m2m转换,然后再写一个针对扁平没有分级模型的简单的天生器.

在这里评论争论的是模型转换中的单向转换,双向转换只在这里没有提到的极少数环境下应用。

应用M2M转换进行语义阐发(未评级)

model-to-model转换别的一个紧张场景便是可以为了更好的语义阐发,把一些模型转换成更轻易理解,更轻易验证,对象更轻易支持的别的的模型.比如对付一个并发,散播式系统的行径描述,可以把它转换成Petri网,再应用相宜的对象.

容许适配

为了使我们的模型驱动能够满意更多的项目, 要包管我能够以非侵入的要领直接适应一些调剂:

1. 我们可以为每个模型元素都添加哈希映射键值对,用于寄放一些附加的信息,这些信息可以被模型处置惩罚的其它地方应用.

2. 代码天生模板能够非侵入性的定制,直接支持天生不合的代码. 可以采纳工厂和多态. 不这这个要权衡,没有需要所有的都必要做到容许调剂,可以分为公有和私有,私有的模板就没有需要了.

级联效应

开始MD*措施时,可以先定义PIM模型,然后转换成少抽象,平台特定的PSM模型,着末天生代码.不过根据我的履历,最好是从底部开始,先定义一个DSL来描述系统的软件架构,然后定义一个天生器来自动完成和实现技巧相关的繁重的事情。 直接在DSL中对目标架构的架构观点抽象。

接着在稳定的基础的抽象上建立特定的营业领域,可以应用M2M转换把更抽象的观点和架构说话中已经存在的抽象映射起来,把他们“喂”给已经存在的天生器.而对付不能够映射到底级的架构抽象供给特定天生器天生代码作为架构天生器视点的“营业逻辑实现”(取代之前必须手写的代码).

留意永世也不要改动中心阶段模型,它们是用于通报的,平日以致不被存储。他们是于你的级联级的各个阶段的”数据扩展形式”.假如你想在你的目标模型中添加信息,请应用注释模型。

注释模型

应用model-model 转换可能会碰到和代码天生同样的问题,有需要在更进一步地处置惩罚前手动标识转换步骤的结果,此中一种措施是在创建后颠末一个转换来改动模型,不过这种措施会碰到和代码天生时的保护区一样的问题。

更好的办理规划是创建一个零丁的模型--注释模型, 直接引用中心模型中的元素,指定一些附加的模型数据,下流的处置惩罚器将处置惩罚由上游的model-to-model转换器和注释模型组合后的创建的模型.

比如,你从面向工具数据模型创建关系数据模型,你可能自动地把OO模型的类的名称当成数据库中表的名字,假如你必要改变这些名字,应用一个注释模型指定一个备用名称,下流的处置惩罚器就知道注释模型中的名字覆盖了原本模型中的名字.

分类行径

为了更有效的实现行径, 把行径归类成几种,比如基于状态,或者基于营业规则. 为这些行径供给特定的DSL,在很多环境下,你只必要异常有和记娱乐的网址限的设置设置设备摆设摆设参数就可以天生行径了.

不要忘怀测试

在MD* 中,测试是很紧张的环节.

1.约束反省也是测试的一种形式,就比如法度榜样说话中的编译器

2.测试代码天生器的时刻,不要测试天生代码的语法,直接编译代码,应用单元测试,测试代码的语义.

3.针对转换的结果中的详细数据写一些约束反省来测试模型转换

4.测试代码天生器,建立一个测试模型来测试说话的所有的功能,这是天生器开拓者来做的,而不是天生器应用者.

假如天生器颠末完备的测试,相对成熟后,没有需要再用天生器在项目里测试天生的代码,不过仍旧可以用单元测试测试全部系统.

真正的天生系统和测试不要应用同一个模型,由于可能会导致在差错的系统长进行的差错测试反而测试经由过程.

4.处置惩罚和组织

迭代

一些人借MD*来利用瀑布型,花几个月光阴开拓说话,对象和框架.这并不是一个成功的措施.而是应该采纳迭代的要领. 可以先开拓一小部来深刻理解,先建立说话的一小部分,构建一小部分天生器,开拓一个小例子模型来验证所做的.然后再慢慢来按照需求实现.

观点与说话合营成长

构建说话,使你加倍清晰观点和理解领域.相辅相成.

文档是必须的

构建了DSL和模型处置惩罚器还不够够让MD*成功,还必须和用户沟通,让DSL和处置惩罚器能够应用起来,这时刻就必须有文档来阐明说话,编辑器,天生器,怎么来手写代码,怎么来集成等等.同样可以录制视频,截图,评论争论都是不错的选择.

按期评审

DSL限定在某些方面限定用户的一些自由,只能在DSL的限定内表达工作。而且一些实现的抉择并不是由DSL的应用者抉择的,而是直接由模型处置惩罚器直接处置惩罚了。

纵然再好的DSL,用户仍旧会犯差错,可能会滥用DSL。必然要按期Review,相称紧张,也很关键。在Review中发明的常常性的差错,有可能便是应用者常常犯的错,我们就可以添加一个约束反省来自动反省这个问题。或许这并不是差错,而用 期 的是对的,这时刻就可以适当地调剂一个说话了。

知人善任

MD*里能够让大年夜家都做最长于的事情:

1.对付目标技巧专家,可以深入钻研目标架构中的一些技巧细节,钻研的更深更透,这样才能够最佳处置惩罚要领,才能够把这些常识抽象整天生器模板,才能够复制起来广泛应用。他们只必要和天生器和说话设计者沟通就行了。

2.说话设计者和领域专家一路定义抽象,符号,约束。和平台专家,架构师一路定义代码天生器或者是说冥器。

你必须确保你团队里的人都懂得说话设计,知道领域工具和理解目标平台,都要有MD*这此思惟,否则MD*措施就不会成功.

领域用户必要写法度榜样吗?

域用户并不是法度榜样员,他们只是描述领域常识,假如让领域用户理解你的DSL,可能并不是他们的同伴,而你的说话不得当这个领域,这时刻必要不停关注了。

领域用户vs领域专家 (未评级)

建立DSL时这两个角色可以发挥不合的感化,领域专家介入领域阐发和DSL本身的定义,域用户 可以应用DSL来表达详细的领域常识。

元数据级产品

一样平常是少部分人开拓的这些说话,约束,天生器,被多部分人来应用。这必要建立好的机制,必要时时时地就让天生器的部分开拓者直接介入实际的开拓项目,让他们懂得这些是否真的适应实际的利用。

兼容组织

MD*可能必要跨项目事情,利用在多个项目和情况下时,必要很好的处置惩罚好跨领域。

忘掉落宣布的真实案例

许多新的软件开拓措施经由过程宣布案例来鼓吹,虽然经由过程例子来展示一些用场,然则并不根据案例就做出真正的抉择。来抉择DLS和MD*是否得当的独一措施便是做一个原型。

5开放的问题

在我们停止这个最佳实践的时刻,还有一些悬而未决的问题,为此,社区和对象供给商必须找到让人知足的办理措施:

(1)混杂符号,没有可用的对象直接支持把文本符号直接嵌入在图形模型中.或者应用类似公式化的编辑器,半图形语法构建DSL. 软件有这方面的趋势,然则对象还跟不上.

(2)说话模块化和组合在某些情况下也是一个寻衅, 尤其是文本说话,基于解析技巧,组合解析必要不太好处置惩罚, Jetbrains的MPS把文本模型作 为元数据布局存储是有上风的, MetaEdit+在说话模块化方面处置惩罚的异常好.

(3)元数据级的重构在大年夜多半系统中是不支持的. 这个着实没有太大年夜的寻衅,我觉得只是还没有人做.

(4)模型/代码重构就没有这么简单. 对付依附于从模型自动天生代码,而手写的自己的代码,假如改动模型,从新天生代码, 怎么处置惩罚手写的代码? 常常是不做任何处置惩罚, 而抱负环境下是盼望手写的代码能够自动改变,能够直接适应模型的变更

(5)模型自动迁移也是一个没有办理的问题. 你的说话变更后你将若何处置惩罚你的模型?全扬弃他们,由于他们已经不能够再打开了? 在新的编辑器打开他们,然则原本模型中的一些标记与新说话不兼容?自动考试测验迁移?这些都是可选择的规划,然则真不知道最好的做法是什么样子.

(6)模型调试即在模型级别上调试正在运行的系系统. 虽然你可以手工构造特定的办理规划,然则还没有事情直接支持这样的调试器的实现.

(7)解释和代码天生平日被觉得两种选择,而不是一个统一体. 你可能必要的只是一个解析器,那么你可以在解析器对照慢的地方部分选择应用代码天生.只还在钻研中,没有可用的处置惩罚.

(8)处置惩罚宏大年夜的模型,或者是模型数量过多时也是一个问题.若何扩展根基的架构?在一些器械改变后若何做影响阐发? 若何导航浏览大年夜而多的模型?若何有效率地搜索和查询他们?若何慢慢地出现他们?

(9)天生的模块若何组合? 若何定义这些模块的接口?若何这些模块已经间接依附于你天生的代码了,该若何处置惩罚?

太多寻衅了,让我们开始吧!

原文: http://www.jot.fm/issues/issue_2009_09/column6/index.html

转自:http://www.cnblogs.com/lonely7345/archive/2010/04/08/1707076.html

您可能还会对下面的文章感兴趣: