阿飞外传

模型驱动思想
随笔 - 35, 文章 - 2, 评论 - 17, 引用 - 3
数据加载中……

2005年4月19日

ruby-core



包中的是ruby的核心类(算是M2+M3级)
外面的User是M1级。 虚线是instance_of关系
具有金穗带构架,Object.instance_of?(Class) = true, Class.ancestors.include?(Object) = true

不是很明白,中间杀出个程咬金:Module

总体原则是,核心类簇中继承链中的叶类作为实例化关系的祖先, 即Class

一些特征:
1)特定于某对象的方法(单例类实例的方法)
  str = "sdfsdf"
  def str.foo
    puts "a per object method"
  end

2)DSL特征,在Module类中增加方法,以便用户类在定义时调用。

class Module
  @@doc = {}
  def doc(str)
    @@doc[self.name] = str
  end
  def Moduel.doc(aClass)
    aClass = aClass.name if aClass.class <= Module
    @@doc[aClass]
  end
end

class User
  doc "here is the doc for user"
end
 
3)条件定义

def foo
  if $DEBUG
    def foo
      puts "debug version"
    end
   else
  end
end 

4)匿名类

class User
   @class_val = 123
   class <<self
     def aClassMethod
       puts @class_val
     end
   end
end
 

posted @ 2006-09-21 18:44 阿飞外传 阅读(226) | 评论 (0)编辑

简单rails开发环境



--- vi 编辑,ctrl-w + l/h 右左切换,shift+p将左边的文件在右边打开,:Ex打开当前编辑文件所在的目录
ctrl+PageUp/PageDown切换shell tab



--- WEBrick启动



--产生器调用。

posted @ 2006-09-03 22:59 阿飞外传 阅读(137) | 评论 (0)编辑

关于MDA的长期等待

 

很久没有写blog了,有工作原因、有对MDA的思考和(初浅)实践原因。

下面谈一点关于MDA的感受。

1. PIM-PSM-CODE

这是MDA眼中最MDA的软件开发方法,也有工具如OptimalJ实现了这种范式,当初在成立mdachina.net的时候,这个工具被俺之辈如视MDA之珍宝,俺则是把它的文档全看了,例子也做了一些。以为自此可以draw & run with a true MDA tool,可是事实并非如此。

OptimalJ对于PIMPSM同步做的不好,几个PIM->PSMPSM->PIM来回下来,建模者估计会对OptimalJ的模型同步逻辑(通过某种标记表示模型的是否可更新)晕倒。

OptimalJ对于CODE模型缺乏更逻辑的分离机制。在CODE保护块中编程而不是利用语言分离机制(如类继承,import之类),将导致很难管理机制与手工代码的逻辑边界,增加了代码的混乱。也许除了用不同颜色区分手工代码与机制代码之外,还要加上另一层UI(模型)表示这种区别?,明明PIMPSM清楚地表示了业务模型和技术模型,到了CODE模型,基本上是另外一回事了(因为PIMPSM具有广谱效应:一个模型映射为多个代码段),可是要在CODE模型中增加手工代码,除了保护段外没有更好的、更逻辑的方法,则是很令人失望的。

当然不只是OptimalJ才有这种问题,其它号称true MDA工具的,也有类似的问题。这里不一一表来。

2.       仍是重复工作

当前MDA的主流还在与3GL做相同的工作,类描述,代码生成,粒度太小,做个小应用还累的半死:安全,集群、cache等等还要手工编码(设计就没图了)。因为几乎所有的MDA工具都有一个底层假设的边界:OptimalJ/ArchStyler只做了常用J2EE的建模和自动生成,androMDA要好一点,除了常用J2EE还有一些轻量级框架,而那种像VExtUML则只能在更小的范围内可以自动化。事实上,一旦需要超出MDA工具的底层假设边界,则一切得自已实现:codemodeling, metamodeling, code generator designCMMC)。然后再是模型集成,这不是一件容易的事,似乎MDAMDD之类的方法学,强烈地依赖于开发团队有自治建模/元建模的能力,在现在这种快速delive系统的时代,谁有时间做metamodeling,除了俺这种没事找事的人。

3.关于复用

的确,在MDA上下文中,模型(设计)复用变的更加真实,就是除了设计图纸的交流以外,还要在建模工具、代码生成器层面上做到复用的保证。IP之父也说过类似的话:复用DSL和产生器比复用结果组件好的多。可是若结果组件与模型没有太大差别(就像当前PIM这种低级抽象),或者结果组件具有高度的可配置性(如EJBSpring BeanXML配置),那么DSL和产生器复用与高度可配置的组件复用并没有本质差别,前者更增加了开发费用。

奇怪的是,至今在MDA环境下,大家还在研究UML类图、状态图、对象图之类的语言级别的模型语义。对于含有领域级别的丰富语义的模型,很少见到公开发表。幸好有一个MDA学者做了这方面的初期工作,在那里我们可以看到应用商业构架型技术构造的领域模型,如:CRM应用的模型(moneyorderperson等一套可复用的类)。可是,这方面的工作还少的可怜,试想我们做系统时,有多少次在使用money, orderperson概念,有多少次在重复地为money, orderperson建模?,从这个角度讲,领域模型库确实有用。但是领域模型库要到真正的结果组件,按MDA的走法,同样存在PIM-PSM-CODE的问题,还有不同的建模工具所导出的模型版本问题、UMLCASE工具依赖的问题。这个痛苦的现实使得领域模型库更多是做为信息交流而不是drive MDA机器。

 4.关于丰富的应用

从当前MDA实践来看,除了一些trivial的系统可以快速开发以外,大的、另类的系统基本上是没有公开发表过。我们不能凭一两个(或是多个)成功的trivial应用(petstorecafeshop)就有足够的勇气说:任何系统都可以用MDA方式解决。前面已说了,一旦需求超出MDA工具所能提供的边界,你将走上:(CMMC)的不归路,虽然有:GME(Generic Metmodling Environment)EMF,之类的元建模工具,这些工具的逻辑其实不容易把握,除了在“元”字闹鬼以外,基本上与应用域无关,或者只是trivial地表示一个应用域的概念和工具内实例化(而不是代码生成,这些工具都假设你可以很好地做代码生成工作),其它事情,you must CMMC

于是,俺最初幻想有这么一个工具具备强大的元级能力(像smalltalk这种具有真反射能力的语言、工具和环境,像objecteeringUML内置的模型操纵语言和强大的uml profile与插件绑定),可以实现CMMC的复杂工作,现实情况是它们仍然只是一种元建模的枷锁,元建模真的要这样做吗。

5.关于元建模

元建模一直被认为是MDA的高阶应用,动不动就要MOF重型扩展来解决领域建模的问题,其实在俺看来:重型扩展基本没有必要,而且导致模型重复,试想重型扩展是不是还要再建一遍类似的MOF::Class,MOF::Attribute,MOF::Association概念?,UML profileMOF重型扩展更好,因为UML profile不需要重复设计MOF/UML结构。

6.关于LOPGPMDD

MDA的路一旦走的不顺,什么变种的方法都来了,LOPLanguage-Oriented Programming),GPGenerative Programming),MDDModel-Driven Development),MDSDModel-Driven Software Development),它们或多或少地采用了翻译范式:由高层抽象到底层实现,以更灵活的领域概念表示手段。现在看来,没有具体领域的涉及和积累,这些工具或方法只能是说教。

待修正。。。

posted @ 2006-03-07 15:33 阿飞外传 阅读(715) | 评论 (1)编辑

Is MOF the kernel language of MDA langs family

Fig.2.4 shows a segment extracted from the book Concepts, Techniques, and Models of Computer Programming(ctmCP)

To seperate the Practical lang (P, PL) from the Kernel lang (K, KL),  we can use a namespace liked mechanism to rewrite the PL prog as follows:  
P::fun K::{ P::Sqr P::X K::} P::X K::* P::X K::end
P::B K::= K::{ P::Sqr K::{ P::Sqr P::A K::} K::}

Above shows that the constructions of KL can be  reused in a PL prog.
 
if PL is UML and KL is MOF:

1) how are MOF first-class concepts reused in UML, is an instance of MOF subset of an instance of UML?

2) how is an instance of UML translated into an instance of MOF?

3) how is an instance of MOF running and the result is still an instance of MOF?

4) if HUTN is a text lang for MOF, how is a HUTN prog running and the result can still  be described by HUTN?

Although the second question is partially solved by UML2MOF(a sub-tool of MDR), but i think the new abstractions of UML, such as Action, Message, Event are thrown away by UML2MOF.  That is to say that NO MOF first-class concepts are corresponding to them, such as the translation from an instance of UML::Message to an instance of MOF::Class will lose the meaning of UML::Message. This is key problem of MDA langs family.

This also give us a  tip: using what formalism (MOF,UML,CWM) to describe a grammar of a target lang is NOT the key concern, we can use any metamodel to describe the grammar, but can we give the real meaning to the target lang?

posted @ 2005-08-21 23:11 阿飞外传 阅读(560) | 评论 (1)编辑

graduated

so  i  should  drop the  post  'i  need  a  job'. Thanks to all the people in MDA QQ groups.

posted @ 2005-08-12 15:43 阿飞外传 阅读(489) | 评论 (1)编辑

语言内实例表示机制 类型信息隐藏 MOF自描述


语言内实例表示机制:一个语言除提供自定义类型描述外,是否提供了自定义类型的相应实例的描述机制,并提供实例与类型的兼容性确认(validation)?,提供语言内实例表示机制的语 言有:XML(XMLSchema/XMLDoc),maude(类别规范/对象项),UML(UML::Class等/UML:: InstanceSpecification),MOF(MOF::Class/MOF::Object)。上面的列表应该是远不完全的。 Smalltalk提供尽可能多的inspect及全反射(inspect me, change me)是否是与不能提供实例表示机制有关?

类型信息隐藏:将类型信息编码成某个类型库的实例,如:用MOF::Object实例描述MOF,用UML::InstanceSpecification描述UML,a XML Schema is a XML Doc。

MOF自描述:用MOF::Object等类型的实例描述MOF。

当用两个内容无关的类型库分别描述:自定义的类型 和 前者的实例时,就是用内容无关的类型描述内容相关的类型及其实例。或者说是语言ontology与内容ontolog的正交性,或者说内容 ontology及其实例以密文方式嵌入到语言ontology实例的明文中。

语言内实例表示机制对于MDA而言是重要的,意味着:you can touch and change your instances by type-in your instances,更少控制的实例化(because you can type-in your instances of your types, even the object identifiers),在closed world里定义语言的操作语义变得更方便,and more(actually, i don't know)

相关联系:prototype based OO -XMLSchema/XMLDoc-语言类型/内容类型-自描述-动态语言-全反射-数据与程序的不可区分(lisp)

posted @ 2005-08-12 14:52 阿飞外传 阅读(539) | 评论 (0)编辑

图模式-续


--图模式(文法的设计模式)。

(omod PERSON is

    inc HUMAN .

    inc CONVERSION .

    inc CONFIGURATION .

    class Person | name : String, age : Int .

    subclass Person < Human .

    op getName : Object -> String .

    op setName : Object String -> Object .

    msgs name : Oid Oid -> Msg .

    msgs name-r : Oid String -> Msg .

vars X O : Oid .

vars N N1 : String .

vars A : Int .

eq  getName(< X : Person | name : N >) = N .

eq setName(< X : Person | name : N>, N1) = < X : Person | name : N1 > .

rl [Person.name] :  name(X, O) < X : Person | name : N >  => < X : Person | > name-r(O, N) .

endom)

posted @ 2005-04-19 21:18 阿飞外传 阅读(1054) | 评论 (1)编辑