没有合适的资源?快使用搜索试试~ 我知道了~
197网址:http://www.elsevier.nl/locate/entcs/volume76.html19页陈述式引用及其作为模式语言A. Herranz1 J.J. Moreno玛雅3School of Computer ScienceTechnical University of MadridCampus de Montegancedo s/nBoadilla del Monte 28660西班牙摘要本文介绍了专用语言Slam-sl的反射功能SLAM-SL是一种面向对象的规范语言,其中类方法由前置条件和后置条件指定反射功能允许在规范中管理这些前置条件和后置条件,这意味着语义反射是可能的。有趣的应用范围非常广泛:接口和抽象类的形式化规范,基于组件的软件的规范,设计模式的形式化,使用Slam-sl作为模式语言等。本文详细讨论了后两个优点。1动机我们最近提出了SLAM项目[13,20],这是一个系统,其中包括一个面向对象的规范语言,Slam-sl,这是由一个开发环境,除了其他功能,能够生成可读的代码在一个高级面向对象的语言支持。 Slam-sl语言是一种形式化的规范语言,它集成了代数规范(如OBJ语言家族[10,4]或Larch-LSL [11]提出的规范)和基于模型的规范(如Z [21],VDM [15]或Larch接口语言[11])。类方法的规范使用两个谓词(前置/后置条件),通过逻辑公式描述输入和输出之间的关系。在本文中,我们提出的语言,可用于一些有趣的应用程序的recruitive功能。一个面向对象的应答系统1电子邮件地址:aherranz@fi.upm.es2电子邮件地址:jjmoreno@fi.upm.es3电子邮件地址:noelia@lml.ls.fi.upm.es2002年由ElsevierScienceB. V. 操作访问根据C CB Y-NC-N D许可证进行。198它本身就是由可编程的第一类对象构建的在Slam-sl中,可以动态地检查和操作类、对象、方法、前置和后置条件以及其他语义语言元素。反射能力可以用在许多有用的应用中:根据类运算符的设计模式的形式化基于组件的软件,编译器构造,建模语言的形式化和操作(即UML,[7]),调试,模块操作等。语言的反应特征可分为语言的、结构的和行为的。语言和结构反射基本上是语法的,并且存在于许多面向对象的命令式社区(Smalltalk [8],Java,C# [3])和声明式编程社区(Lisp,Prolog,Maude [4])中的编程语言中。然而,行为反射允许管理语言元素的语义(Maude)。我们称声明性反射为依赖于声明性模型(逻辑、函数等)的行为反射特征。声明性的反射不仅允许操纵类和对象的语义,而且还可以对它们进行形式化的推理。在前面的列表中,只有特定语言Maude,基于重写逻辑,而重写逻辑又是一种应答逻辑,可以被认为具有声明性应答特征。然而,它们主要集中在模块操作上。SLAM-SL配备了口头/声明性的反射:(1)可以检查和操作面向对象的元素:类、方法等。(2)可以管理这些元素的声明性行为,如类不变量或方法的前置条件和后置条件。(3)这些元素的声明性质被包括在内,并强制执行形式推理例如,只有在某些语义条件才允许继承,即使在动态生成的类中也会保留这些条件。(4)可以声明性地将面向对象的特性建模为接口或抽象类。我们将详细介绍一对有趣的应用:将设计模式形式化为类操作符,并因此使用形式化方法作为模式语言。本文的组织如下:第2节介绍了Slam-sl,第3节介绍了Slam-sl的相关属性,第4.1节介绍了复合和装饰模式规范我们在第5节中提出了一些结论2面向对象规范。Slam-sl本节介绍了语言的主要结构,重点是将在以下部分中使用的相关功能SLAM-SL是SLAM项目[13,14,12]的一部分,SLAM项目是一个软件构建开发环境,能够以不同的高级面向对象目标语言(如C++)合成(合理的)高效和可读的代码199×- -\−或者Java。在其他功能中,用户可以以友好的方式编写规范,跟踪她的手工编码优化,或者在调试模式下通过自动合成断言检查这些优化据我们所知,这种新的功能是不存在于任何现有的系统。为了便于理解Slam-sl,我们将用一种具体的语法来展示它的元素,这种语法不一定与内部表示或环境表示4相对应,所以读者不应该注意具体的语法,而应该注意抽象的语法。Slam-sl程序是定义类和类属性的规范的集合方法行为的具体化是通过前置条件和后置条件给出的,但正如我们将看到的,它具有功能性2.1Slam-sl工具包与许多其他特定语言一样,Slam-sl有一个强大的工具包,其中包含表示布尔值、数字、字符和字符串、记录和元组、集合(序列、集合等)的预定义类型,字典(地图、关系等)。Slam-sl类型语法反映值语法,例如,类型"整数序列“被写为[1],其值被写为[1,2],元组类型可以被写为(Char,n),其值被写为('a',32),等等。 类型(x:Float,y:Float)定义了笛卡尔积Float Float,但是为了避免规范中的“样板”,选择器被定义。设p为(x>0.1,y>0.0),p表示元组(0. 1, 0)一些用于修改记录的语法糖已经通过except操作符(\)添加到Slam-sl例如,公式q= p\y −>1.0表示q代表(x −>p.x,y −>1.0)。集合和序列。集合类型表达式{String}将值组合在一起,如{“Hello”,“world”} 或{}。 集 合 上 的基本数学运算是预先定 义的(union+ ,intersection+,等等)。像[“Hello”,“world”]或[]这样的序列属于[ String ]类型。序列是索引数据集合。如果s是一个序列,则s(i)是第i个元素,1是序列的第一个索引(如果存在),并且t= s2 >“Earth”确定t表示[“Hello”,“Earth”]。对序列的重复操作是预先定义的(append+,insert,dom,rng,in等)。集合和序列都继承Collection的属性。集合是一个允许量化器的类。收集和 集合和列表解析、限制量化器和迭代遵循一个通用的“遍历”集合的抽象方案, S l a m - s l 引 入 了 以 下 表 达 语 法 :4事实上,Slam-sl程序是以XML格式存储的,其在环境中的表现形式可以定制。200Qxind[whereF(x)]withE(x)上面的Slam-sl表达式是一个量化的5表达式。Q是量化器符号,通过二进制运算和起始值表示量化的含义d是Collection类的对象。x是量化器范围内的变量。F是一个可选的布尔表达式,用于过滤集合中的元素。最后,E表示先前应用于集合中元素的函数。一些预定义的量化器出现在下表中,并有非正式描述:符号泛化exists存在,但带有falseexists1为exists,但将计数限制为1对于所有的真实与0求和prod×with 1countincwith 0(计数!)选择搜索最大最大过滤器map将函数应用于集合中的每个元素2.2类和类属性在Slam-sl中,类是通过指定其属性来定义的:名称,与其他类的关系,以及方法规范。我们将指定Stack类来表示对象的堆栈:类Stack继承 Collection状态为空stateNomEmpty(top:Object,rest:Stack)第一行声明了一个名为Stack的新类,并建立了Stack类从Collection继承属性。以状态定义属性开始的行,Slam-sl允许定义代数类型来表示语法结构表示类实例,在我们的示例中,值为Empty和NonEmpty(5,Empty)5.我们保留了“量化器”这个术语,因为它是逻辑中量化的一种概括。201分别表示空堆栈的状态和具有唯一对象(常数5)的堆栈的状态。阶级关系。Slam-sl可以作为一种编程语言。正如在任何其他(OO)编程语言中一样,我们不能像UML允许的那样区分类之间的每一种关系例如,聚集不能与组合区分开来,并且某些关联通过方法的语义是隐无论如何,我们可以列出以下可以静态捕获的关系:聚合:类的状态规范定义了类实例和其他类实例之间的聚合或组合继承:类属性可以从头开始定义,也可以从已经定义的类继承 这些属性的覆盖在Slam-sl中受到约束,不仅是签名,而且还有含义(见下文)。多态性:泛型多态性是通过允许在类型中引入参数来引入的Slam-sl允许延迟类的风格,但增加了一些功能,从理论(在OBJ术语[10]),以及ype类(a`laHask ell[16]),扮演一个更重要的角色比C++模板。方法质量标准。堆栈对象中的标准方法允许创建空堆栈,判断堆栈是否为空,读取堆栈顶部,以及push和pop元素。 Slam-sl帮助用户对不同类型的方法进行分类:构造器、修改器和观察器。让我们完成堆栈类的指定,并定义其方法:构造函数空前真空后结果=空modifierpush(Object)pretruepush(x)postresult = NonEmpty(self,x)observerisEmpty:BoolpretrueisEmptypostresult =(self =Empty)改良流行音乐pre notself .isEmptypoppostresult = self . 休息observertop:Objectpre notself .isEmpty toppostresult = self.top在Slam-sl中,操作由一组规则指定,每个规则都包含一个指示规则是否可以被触发的保护或先决条件,一个操作调用方案,以及一个将输入状态和输出状态联系起来的后置条件规则的一般形式如下:preP(x,self)202运算符(x)postQ(x,self,result)其中P(x,self)是一个Slam-sl公式,涉及参数(x)中的变量和消息的接收者(self),如果操作是观察者或修改者。Q(x,self,result)是另一个涉及参数中变量的公式,保留符号result表示函数的计算值,self表示方法调用之前消息的接收状态。一些让我们详细解释一下Slam-sl如何处理方法重写。假设你有一个类C,它有一个方法m,方法m有一个前置条件P和后置条件Q. 现在,C的子类C由于Slam-sl是一种形式化的规范语言,它强制以下语句成立:继承性质:(P→PJ)<$(P<$QJ→Q)封装。封装是编程语言中的一个重要特性,它允许用户控制耦合并最大化内聚。通常,封装并不总是在形式方法中进行管理在Slam-sl中,与其他面向对象编程语言一样,用户可以指定每个方法的可见性范围:public、protected或private。如果一个属性被表示为public,那么用户可以免费获得一个观察者,例如,在堆栈示例中,观察者顶部的定义可以通过这种方式避免状态为空stateNomEmpty(publictop:Object,rest:Stack)该语言引入了通过聚合继承的广泛概念让我们看一个例子,下面的Slam-sl规范为堆栈定义了一个只读包装器:ROStack类state(target:Stackaccept top,isEmpty)构造函数wrap(Stack)wrap(s)=(target−> s)现在,如果用户不希望客户端修改堆栈实例,可以返回一个包装器而不是堆栈这是一个相当未开发的功能。应用本节介绍的用更简洁的方式来完成堆栈示例203类Stack(T)继承 集合观察器为空状态为空状态NomEmpty(publictop:T,rest:Stack)构造函数empty =EmptyisEmpty =(self = Empty)调节器推压(T)push(x)= NonEmpty(rest−> self,top −>x)改良流行音乐pre notself .isEmptypop = self.休息抽象类在Slam-sl中,声明接口非常容易,即:没有状态的类和必须在子类中重新定义的方法声明这些方法的方法是指出前提条件为false。这意味着这种方法在任何情况下都不适用。请注意,仍然可以提供一个适当的后置条件。必须在所有派生类中保留此后置条件。那些没有定义的方法被隐式地认为有先决条件假和后置条件真。为了实际使用Slam-sl作为一种规范语言,可以引入专用的接口语法。我们只想强调一点,即它们可以以声明的方式具体化2.3语义在需要为规范语言提供的语义和为编程语言提供的语义之间存在差异 后者是为专家设计的:即程序员或程序操作的自动工具。然而,一个规范语言需要配备一个非常直观的语义,因为它的规范需要由非专家阅读,即。客户。从这个意义上说,Slam-sl的直观语义是(有序排序一阶)逻辑,每个函数f定义为:函数f(.)preP(x,self)f(x)postQ(x,self,result)可以通过这个简单的公式来理解阿克斯角 (P(x,s)→ Q(x,s,f(x,s))同样的思想强调了规范语言Z的W逻辑[17]。Slam-sl声明式反射的另一个优点是语言的所有元素都是由逻辑公式指定的(见下一节)因此,每个Slam-sl组件都可以以直观的方式理解另一方面,可以开发更详细的语义,以支持(自动)Slam-sl规范操作。2043相关特征在本节中,我们将介绍一些我们将在下文中使用的Slam-sl回应结构非正式地说,一种语言是一种语言,在这种语言中,它的模型的有趣方面可以在语言本身中表示和操纵重新编译使高级元编程应用成为可能,例如Slam-sl或其他语言的重新定义,以及解释器和基于组件的系统的开发。与其他反射语言一样,反射特性和虽然我们的例子不会使用这种组合,但很明显,许多其他例子(如C#中响应能力的应用程序中所示的组件指定)可以利用它。3.1类和类关系像 许 多 其 他 面 向 对 象 语 言 一 样 , Slam-sl 类 被 表 示 为 一 个 名 为 Class 的(Meta)类的实例。类的声明引入了类Class的不可变实例。让我们从阶级的定义开始:类Classpublic state(name:String,inheritance:{Class},stat:State,inv:Formula,methods:{Method})对所有方法中的m1,m2不变量|m1/= m2,其中m1.di =(m2)我们已经很自然地理解了“类是什么”:名称、继承关系、聚集关系和方法。类名是一个字符串,继承是Class的一组实例,聚合是由State的一个实例加上表示不变量的Formula的一个实例表示的,最后,我们添加了一组Method的实例。类中的不变式建立了类的两个方法必须在签名中区分6。换句话说,方法重载是允许的,但必须有不同类型的参数请注意,由于这种声明性的规范,Slam-sl能够识别类必须填充的属性,这比Java或C#的仅是语法的响应特性要强大得多。让我们来看看国家加非国家类的定义6事实上,不变量应该包括一些与继承相关的其他所需属性在第2.2节中规定了一些规则,但为了简单起见,我省略了它们205关于我们类声明state(publicname:String,type:Class)不变名称isIdentierpublic constructor(String,Class)观察者isSubtype(Declaration):Boolean isSubtype(d)=self.类型. isSubtype(d.type)DecCollection类state(decls:{Declaration})构造函数makeEmptyDecpublic修饰符add(Declaration)−cl−as−s−State继承DecCollection在类的有趣操作中,让我们展示其中的两首先,我们将引入一个构造函数来创建一个类。Slam-sl自动生成现场观察员7。当一个类只是一个接口时,通过检查状态是否为空以及方法的所有前提条件是否为false来检测。公共构造函数makeClass(String,Class,State,Formula,Methods)makeClass(name,inh,st,inv,methods)=(name,inh,st,inv,方法)public observerisInterface:Bool方法中的isInterface = st.isEmpty和forall m关于M.doNothing3.2方法类建模方法可以通过以下方式指定类方法方法状态(kind:MethodKind,visibility:Visibility,name:String,sig:ArgSig,return:Class,prec:Formula,postc:Formula)公共构造函数makeMethod(MethodKind,Visibility,String,ArgSig,Class,Formula,Formula)makeMethod(k,v,n,sg,rt,pr,ps)=(k,v,n,sg,rt,pr,ps)public observertypeSig:[ Class]7只有当用户状态属性是'public'时,但我们在本文的其余部分都206typeSig =将 sig中的 d映射为 d.typepublic observerinvokation:[ String ]invokation =map din sigwith d.name具有以下先前定义:类ArgSig继承 DecCollection我们已经介绍了几个有用的操作:构造一个方法,仅使用参数类型抽象类型签名(除了前置和后置条件之外,名称几乎不相关),以及使用参数名称组成方法调用。在 它 们 之 上 , 我 们 可 以 描 述 一 些 关 于 方 法 的 有 趣 操 作 。 第 一 个(isCompatible)表示两个方法何时等价(相同的名称、类型和等价的前置条件和后置条件)。 第二个(canInherit)指定了一个方法何时可以覆盖另一个定义。 它们必须具有一致的定义(相同的名称和参数/返回类型),并且继承属性必须保持不变。public observerisCompatible(Method):Bool isCompatible(m)=kind = m. kind,name = www.example.com,typesig = m.typesigand return = m.returnand(precimplies m.prec[m.invokation/invokation])andpostc(impliesm.postc[m.invokation/invokation])public observercanInherit(Method):Bool canInherit(m)=kind = m.kind, name = m.name,sig.长度= m.sig.长度和(对于所有 iin sign.dom(一)。isSubtype(m.sig(i)和m.return. isSubtype(m)和(m.prec意味着 prec[invokation/m.invokation]),(postc暗示 m.postc[m.invokation/invokation])最后,我们指定操作来决定两个方法何时真正不同(直到参数名称),以及一个方法何时实现一个接口方法(即前提条件为false):public observerdiffuser(方法):布尔diffuser(m)=名称/= m.name或(name= m.name和(签名)长度/= m.sig.长度或(存在于签名.dom(一)。type/= m.sig(i).类型)207−|−|−|−|−|−public observerdoNothing:BooldoNothing =(prec = falseand postc = true)为了简单起见,我们假设类Method和Class的所有记录组件都是公共的。事实上,好的面向对象方法建议将它们设为私有,并声明足够的方法来访问它们。我们省略了这样的定义,以避免过多的规范。3.3公式可能,最有趣的Slam-sl相关属性是那些与配方管理相关的属性。Slam-sl运行时环境可以像编译器一样管理公式,这意味着公式可以在运行时创建和编译,因此用户可以指定管理类和类行为的程序。以下公式的具体说明反映了Slam-sl中的抽象语法:类公式状态常数(布尔值)state变量(String)stateAnd(Formula,Formula)stateOr(Formula,Formula)public constructormakeTruemakeTrue = Constant(true)public constructormakeFalsemakeFalse = Constant(false)public constructor(String)makeVariable(s)= Variable(s)stateImplies(公式,公式)stateEquiv(公式,公式)stateExpression(表达式)public构造函数makeAnd(Formula,Formula)makeAnd(f1,f2)=$f1和f2$...public modifiersubstitute(String,Expression)substitute(var,expr)=结果=caseselfConstant(c)>self变量(v)>如果v = var则表达式(expr)其他自我And(f1,f2)>And(f1.substitute(var,expr),f2。 substitute(var,expr))或(f1,f2)>或(f1. substitute(var,expr),f2。substitute(var,expr))隐含(f1,f2) >隐含(f1. substitute(var,expr),f2。 substitute(var,expr))Equiv(f1,f2)> Equiv(f1.substitute(var,expr),f2。substitute(var,expr))| 表达式(e)−> e[x/expr]使用上述接口编写公式会产生不可读的规范,因此我们使用Slam-sl自己的表示法编写公式的实例,208$...$符号,并允许编译器解析句子并生成表达式。参见构造函数makeAnd的定义。引入了替换操作的语法糖:f[x/e]是公式f,将所有对变量x的引用替换为表达式e. 请注意,我们在替换操作的定义的最后一行中使用了表达式的语法4应用4.1作为类操作符的设计模式作为Slam-sl的响应特性的应用,让我们展示如何将设计模式[9]形式化为类操作符。一个给定的(初步)设计是设计模式的输入。这种设计被建模为类的集合。操作的结果是通过修改旧类和/或创建新类获得的另一个设计,同时考虑设计模式的描述。例如,假设你有一个类叶子的集合(例如Line,Circle,Rectangle,...)共享一些操作(例如,绘制、旋转、调整大小,...)你想把所有这些都组合在一个更广泛的对象中,这个对象要么把所有这些都作为特定的情况,要么也可以把其中的一些收集在里面(例如,一个图)。Composite模式被认为是一个操作符,它接受类(leaf)作为输入,并返回两个新类Component(仅仅是一个接口)和Composite(用于组件的集合),其中公共操作作为方法,并修改leaf中的类以继承自Component。更具体地说,设计模式被建模为一个类,其中有一个函数apply,即类操作符。此函数的前提条件收集了成功使用模式所需的逻辑条件基本上,这意味着模式的前提条件建立了模式的适用性,即模式描述中的各个部分例如,在我们上面提到的Composite模式中,前提条件需要确保叶子中的所有类都定义了具有相同签名的公共方法另一方面,后置条件包含模式描述的意图和结果部分的大部分元素在Composite模式中,后置条件建立了输入类leaf现在继承自Component,并引入了Composite和Component类第一个继承自第二个。复合状态是组件的集合,其方法通过迭代调用相应的叶方法来描述。为了描述所有这些元素,相应的特征扮演着重要的角色,因为它们允许检查参数类并将新的类描述为结果。设计模式可以通过(多态)类DPattern来描述。apply方法描述了模式的全部行为209通过接受一个类集合作为参数(以前的设计)并返回一个新的类集合。类参数(来自polumorphic定义)有时需要指导模式选择参与模式的类,方法等。这个参数由一个专用的构造函数存储在模式中类DPattern(T)state(arg:T)public constructorinstantiate(T)instantiate(x)发布结果。arg = xpublic functionapply([Class]):[Class]继承用于派生具体的设计模式。它还需要实例化类型参数并为状态提供值。请注意,设计模式变体在我们的模型中很容易得到支持。让我们通过[9]中的一些例子来描述该方法 我们为分类的每个组成部分选择了一种模式:创造模式、结构模式和行为模式。一个图形描述补充了使用基于OMT的符号的形式定义,该符号再次取自[9]。更深层次的讨论以及更多的例子可以在[19]中找到4.2复合模式复合模式是对象结构模式的一部分。它用于组合对象,引入树结构来表示部分-整体层次结构。使用该模式,客户端可以统一地处理单个对象和对象的组合。当我们把它当作一个类操作符时,我们有一个基本对象的集合作为参数(称为叶子)。结果组件只是所有叶子类中所有公共方法的接口,加上一些添加、删除和查询内部对象的方法Composite继承自Component并存储组件的集合结果还收集了通过从Component继承而修改的叶子中的所有类。Composite中的方法可以分为两部分。一方面,我们有方法来添加和删除组件,还可以查询组件集合(getChild)中的第i个元素。另一方面,我们有叶子的所有通用方法,它们通过迭代调用所有组件中的相同操作来进行非常简单的指定。参见图1了解完整的Slam-sl规范。210叶operation()叶operation()叶operation()叶operation(){}{}\叶operation()儿童小儿全胃肠手术operation()add(Component:)remove(Component:)operation()复合叶operation()add(Component:)remove(Component:)组件综合结果classComposite继承DPattern()public functionapply([Class]):[Class]letmin commonMethodsequiv(对于所有clin leaves, min cl.methods)pre(notleaf .isEmpty)和(notcommonMethods.isEmpty)apply(leaves)后置结果=[component,composite]+在叶子中映射c\ inh。插入物(组件)哪里分量=makeClass(“Component”,,makeEmptyDec,$true$,mapmin(commonMethods + [create,add,remove,getChild])其中m\prec =$false$和postc =$true$)复合材料=makeClass(“Composite”,,[makeDec(children,[component])],$true$,[create,add,remove,getChild]+map min commonMethods gen(m))create =makeMethod($constructor$,$public$,“create”,makeEmptyDec,$true$,$(result =[])$)add =makeMethod($modifier $,$public$,“add”,[makeDec(“c”,component)],$true$,$(result = children.插入(c))$)remove =makeMethod($modifier $,$public$,“remove”,[makeDec(“c”,component)],$true$,$(result = children.remove(c))$)getChild =makeMethod($observer$,$public$,“getChild“,[mkeDec(“i“,Nat)],$true$,$(result = children[i])$gen(m)= m prec =$(对于具有m.prec [this/c]的子节点中的所有c) $和postc =$(result = map c in childrenmakeCall(m.name,[ c] +m.invokation))$Fig. 1. 复合模式规范。2114.3装饰模式装饰者模式被归类为对象结构,它用于动态地将额外的责任分配给对象它可以被看作是下面的类操作符:一个具体组件的集合和一个装饰器的集合被用作参数。它们共享一些操作,模式将这些操作抽象为两个步骤。首先,一个新的Decorator类抽象了装饰器的操作然后,另一个新创建的类Component为具体组件和decor-ator抽象操作class参数用于将类序列拆分为具体的组件和装饰器。具体的组件被强制从Component继承,而装饰器则从Decorator继承,并修改公共方法以添加对装饰器操作的调用。Decorator类在状态中包含一个Component,并将公共方法设置为public。它们被实现为对存储组件中等效操作的简单调用。最后,组件仅仅是通用方法的接口。由于缺乏空间,该模式规范已从最终版本的文件中删除。4.4设计模式组合将设计模式视为类上的操作符,允许我们通过操作符组合来创建新的设计模式。例如,可以将复合设计模式应用于叶的集合,然后可以将装饰器应用于新设计。在[9]第二章中的案例研究中,文档编辑器的设计是由几种设计模式的应用指导其中一些设计模式应用于前一个设计模式的结果(的一部分)由于设计模式已经被建模为类操作符,我们可以指定它们的组成:int findDuplicate();composite. apply([border,scroll,character,rectangle,polygon]);return(3);mono = decorator.apply(decorator.prefix(3)4.5作为模式语言的Slam-sl设计模式在类操作符方面的形式化和使用特定语言的(声明性)响应特性有很多优点:(1) 对模式的连贯规范对于提高它们的理解和推理它们的性质是必不可少的。212(2) 开发支持设计模式的工具是可能的。事实上,我们有兴趣在现有的开发环境中引入它们该工具可以允许将设计模式应用到您正在处理的项目中。该项目应根据我们的描述采用设计模式进行修改。通过这种方式,我们可以将设计模式应用于已经存在的代码和“每天”存在的(3) 模式可以通过简单地应用函数组合来组合(4) Slam-sl的函数语义可以修改为支持函数逻辑语义。函数逻辑语言融合了函数语言和Prolog类语言的主要特征这意味着,原则上,我们可以将具体的设计模式识别到现有的设计/规范中。在文献中,我们可以找到设计模式的其他形式化[1]中的工作集中在基于面向对象模型的架构设计模式的形式化,该模型集成了面向过程的方法来描述模式。[18]提出了一种形式化设计模式的时态行为的方法虽然两者都使用规范语言进行形式化,但它们没有提出任何支持工具,也没有使用反射[5,6]中提出的项目更侧重于提供与现有代码交互的工具他们使用基于(有限形式的)口头规范的元编程语言一个工具可以读取它并产生他们所谓的技巧,基本上是一个操纵程序的算法。他们还设计了一种用于指定模式的可视化语言(LePus)。他们分享我们的一些目标,甚至更多,但我们声称我们可以用更简单的方法获得类似的权力事实上,由于其声明性的反射特性,Slam-sl可以被认为是一种模式语言。一旦你可以将模式建模为一个类操作符,Slam-sl就可以用来指定它,这个指定可以用来指导相关的工具将模式应用到现有的设计和程序中。4.6基于规范的软件规范基于组件的软件是软件构造中最有前途的新课题之一,在这种软件中,程序由多个组件组成,这些组件由开发团队、开发环境或第三方提供商提供。 组件是一个软件组成单元,它具有一系列接口和填充需求。一个组件可以独立于时间和空间与其他组件进行开发和集成,以产生新的软件应用程序。在处理软件组件时,一个重要的问题目前的系统只是提供了查阅这些人的姓名和签名的可能性,213服务组件的这些文档通常是非正式的,不能被其他组件自动查阅。由于这些原因,Slam-sl可用于指定软件组件。一方面,如果我们将组件指定为Slam-sl类,我们就有了组件的不同服务的正式定义。 另一方面,另一个Slam-sl组件可以通过使用相应的功能来查询此信息。记住,给定一个类,我们可以检查它的方法,它们的签名以及前置和后置条件。按照我们的小示例,假设我们有一个组件,可以通过Stack类提供堆栈操作然后,我们可以编写另一个组件,它可以通过表达式Stack.methods咨询Stack的方法,通过例如push咨询其中一个方法的签名。签名,或者甚至像在top.postc中那样检查其中一个的后置条件。请注意,这需要通过在“标准”Slam-sl规范中引入以透明方式结合语言和元语言的相关特性来完成然而,还有一些其他方面,如组件之间的通信协议,也需要组件规范。Slam-sl的并发扩展是未来工作的一部分,应该用于软件组件的完整规范。5结论本文还介绍了SLAM的声明性反射特性。相对于其他响应式语言的主要优点是,类方法的语义可以被检查(通过咨询前置和后置条件),这对于许多应用非常有用,比如指定设计属性和灰盒框架的定义[2]。我们的结论是,声明性反射是一个关键特性:(1)一个简单的形式化的设计模式的类操作符。(2)支持允许将设计模式应用于现有代码的具体工具(3)基于构件的软件的规范和开发。(4)UML的形式化、建模和操作[7],其中语言Maude及其相应的能力用于建模UML,检查UML设计的属性,并支持UML扩展。Slam-sl可以用于相同的目的。(5)为每个Slam-sl元素提供逻辑语义。软件设计模式的精确定义是在其实现中允许工具支持的先决条件因此,模式的全面规范不仅对提高对模式的理解和正确推理至关重要,而且对支持模式使用的自动化也至关重要。我们对设计模式形式化的建议是将它们建模为类操作符。我们并不是说设计模式是类操作符。我们的论点是,它们中的大多数可以被看作是类操作符,这种观点很有趣214在理解和使用自动化方面的优势当然,我们的方法不一定比别人“好”。事实上,不同的针对性集中在一个特定的方面,产生不同的工具。我们只鼓励这样一个事实,即它非常简单,很容易在现有的开发工具中自动化。相反,目前还不清楚所有的设计模式都可以建模为类操作符(例如,工厂方法只能以非常棘手的方式被视为类操作符作为未来的工作,我们计划将我们的想法,以具体的工具,在软件开发过程中引入设计模式我们也有兴趣进一步探索使用SLAM进行组件规范和开发。引用[1] P. Alencar,D.Cowan和C.卢塞纳架构设计模式的形式化方法In M.Gaudel和J.Woodcock,编辑,FMESpringer Verlag,1996年。[2] M. Buechi和W.真恶心灰盒方法:当黑盒规范隐藏太多时。 技术报告TUCS-TR-297 a,图尔库大学,芬兰,1999年。[3] C#语言规范。标准草案ECMA/TC 39/TG 2/2000/3。[4] M. Cl avel,F. 你好,S。 E ker,P. Lincoln,N. Mart's-Oliet,J. 梅塞格尔,以及J. 克萨达一个
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功