大型网站的安全架构设计与实施外文翻译资料

 2022-10-27 15:43:40

英语原文共 8 页,剩余内容已隐藏,支付完成后下载完整资料


基于C#的产生式编程

摘要:

本文介绍如何通过扩展新的构造,提供产生式编程的C#语言。这些构造使得有可能处理这样的用户界面的产生的问题和某些横切关注点在一个不太容易出错和优雅的方式在不影响整体语言的完整性情况下。

关键词:产生式编程 泛型 反射

1、简介

现今新型软件系统在进行开发时很少是从头开始的,而会借助一些独立开发的组件的帮助。组件的复用程度取决于它能够在多大程度上实现所需的功能。随着基于组件的开发需求量的增加指定灵活和强大的手段成分和适应它们变得越来越重要。产生式编程的概念[1]正是针对这一问题。

随着泛型或参数多态出现,例如,在ADA,Haskell或Java中,程序组件复用于很多类型中变得可能。然而,这些泛型类型参数机制与此同时类型抽象机制:该类型的结构不能在参数化软件组件被利用 - 至多它可以被利用到绑定,被称为有界参数多态性[6]。因此,这是很典型的是通用性已成功地利用在编程集装箱库,例如,C 标准模板库,但无法超越。

我们的做法是不是像通用组件编程的容器,但是,解决普遍存在的横切关注点真正生成组件,在软件架构中像负载,性能和安全性尤其是减轻驱动力。也就是说,我们的目标基于源代码的软件方法 。 是当今软件工程的基石。重要的例子是像TopLink的透明数据访问层发生器和EJB或软件分发机制,如RMI存根生成和在CORBA IDL编译器。在一般情况下,一台 得到一个专有类型描述作为输入。它探讨的类型描述,并生成源代码。例如,对于一个透明数据访问层的 得到一个语义数据模型的描述,并生成数据库表,查询,访问代码和相应的接入码胶囊。除了商用 , 定制是从头在今天的项目开发特殊用途。然而,编程这种 的任务今天通用性概念不充分支持。是需要内省型和反射支持。使用反射API忽略了一点:它是不能令人满意,因为它是动态的,而不是类型安全的。

我们的方法需要另一个方向。它结合了参数多态,并从头开始的方式是强大到足以支持编程 有限的反映能力,但足够的简短定义新的类型安全的,可以静态地得到保证。它可以在 定义时,I.S.保证,一个发生器程序被出售之前,使程序不会挑起任何及其应用的某些类型的错误。

在本文中,我们演示通过实例工厂的语言怎么能用于解决在纯粹基于语言的生成规划问题,以及高度可重用。

2、基于工厂模式语言

工厂模式[4]介绍了代编译时子语言。这使得它可以编写代码,其中部分在编译时执行,执行导致新代码的生成计算。所有这一切发生在编译过程中,使程序员编写和重用参数化的代码段产生经常需要执行的变种份,根据一些实际进行参数调整。

相比于C#,使用工厂模式生成语言是有限的。 然而,这不是一个问题,因为它满足共同产生的所有需要任务。这些限制使得能够检查静态产生的代码中的某些安全属性,因而确保产生代码的质量。

让我们通过查看源代码示例了解基于工厂模式的语言。工厂模式源代码在两种方式上和c#的源代码很相似。首先c#语言自身是不会改变的,但是可以扩展。这说明任何普通c#代码一直是有效的。产生的语法会通过模板样式嵌入到普通的语法中去,以至于产生的语法能够被实际执行。第二、那些通过工厂模式产生的新语言函数在语法和语义上和c#很相似,虽然我们确信他们在c#语言中很容易被辨认出来。通过下面的例子我们将很会变得很清楚。

第一个例子展示了通过工厂模式怎么生成基本类型。在这里我们定义参数化的类 — — 类工厂 — — 可用于生成编译时的普通类。工厂语言定义了几个这种生成器 ︰ 除了类工厂我们有,例如,工厂为生成的方法和类型的集。所有这些类生成器接受声明类似于那些普通的方法的参数。按顺序使用工厂的参数和处理信息在我们的工厂利用工厂表达式,形成 C# 表达式的一个子集。这类工厂表达式可以用 @ 符号括起来和放置在某些源的代码位置为了生成定制的代码。

public class Stack(Type T)

{

private Stack s = new Stack();

public void push(@T@ x)

{

s.push(x);

}

public @T@ pop()

{

return (@T@) s.pop();

}

}

在第 1 行,我们声明类工厂堆栈有一个单一类型参数 T,可在工厂体中变量 t。我们称这样的变量要用于生成,因此可以只在生成器代码中访问发电机的变量。具有泛型类型的主要点是,键入变量可以替代类型。在我们的案例生成器变量 T 作为类型作为它的变量保存元表示类型在 C# 中的类型值语言。要使用由我们插入厂表达式 @T @ T 给定的类型

要生成一个类型的地方。这是在行 5,9 和10。

工厂表达式可以计算值比在更复杂的方式我们的第一个示例。除了访问变量和文本,它们也可以包含调用的 C# 方法和构造函数和一些基本的运算符。还可以调用工厂。只有副作用禁止,因为这可能违反安全。某些类型的检查不会受到任何更多可能。

而代之以适当的厂表达式的语法元素,可以执行代祷 [3],我们可以生成定制的代码部分类型一样,标识符和值。正如我们所看到的类型的工厂表达式类型可以用来生成的类型。字符串类型工厂表达式可以用来生成的标识符。为了生成静态类型安全堆栈 myStack

字符串与堆栈厂,例如,你会写字符串类型适用工厂表达并将该表达式,定义的 myStack 包括 @ 标识︰

@Stack(String)@ myStack = new @Stack(String)@();

该工厂语言提供文本的类型。字符串的计算结果为一个类型对象表示字符串类型。构造函数具有相同的名称作为它们的类型,因此类型类型工厂表达式用于生成的第一个参数新的运算符。

在下一个示例中,我们将看到构造,它用于迭代的一代。的例子是方法工厂的 ToString 方法创建的对象的字符串表示形式。本厂拥有单一类型的参数的类型,其中表示的类型的生成的方法应是成员,即,该方法应为其工作的对象的类型。字符串表示形式创建由串联的字段名称和对应字段的值对象。这种方法使用,例如,当上打印的对象控制台和它可以用于调试目的很有用。

override public String ToString(Type T)()

{

String s = '';

@foreach(F in T.GetFields())

s = @=F.Name@ ': ' this.@F.Name@ ' ';

return s;

}

在第 4 行中,我们使用 @foreach 控制结构,类似于普通foreach 循环,但在编译时执行。访问类型为 T 的结构通过标准的 C# 反射 API,和我们遍历所有的字段。信息关于字段可以从读取新的迭代器变量 F 在循环体中。在我们连接生成的 5 行文字,普通字符串的字符串,和生成的标识符字段的内容。括工厂表达在 @= 和 @ 表示生成的文本;在我们的例子 @=F.Name@ 生成字符串文字。表达式 this.@F.Name @,相反地,生成字段的标识符。

它是很容易生成包装的程序工厂。以下示例演示生成给定一个子类的类工厂。的由此类实现安全代理的功能。工厂可以通常被用于支持实现设计模式 [5]如代理、 观察员或模板方法模式。

class SecurityProxy(Type T) : @T@

{

@foreach(M in T.GetMethods())

@if(M.IsPublic)

override public

@M.ReturnType@ @M.Name@(@M.GetParameters()@) {

if(/* access permitted */)) {

base.@M.Name@(@M.GetParameters()@);

else

throw new SecurityException();

}

}

在第 1 行,我们声明类型参数 T 和指定生成的类是子类的 t。在行 3 我们遍历所有方法 M t。我们想要保护只有那些可以实际上访问从外面,因此以下的方法一代人的一种包装方法是有条件的和唯一对公众进行方法。我们使用的条件生成的 @if 构造。的后一部分生成重写各自的公共方法定义由 M 表示的方法。在第 6 行我们生成一个返回类型,标识符和用适当的厂表达式的参数。虽然可以生成类型类型对象与一个字符串对象,参数列表的标识符声明可以生成与 ParameterInfo 对象的数组,因为它是提供的方法如何。正如我们可以看到在哪里我们调用的 8 号线原始的方法,这类数组也可以用来生成一个对应

实际参数列表中。在第 7 行我们生成代码来检查如果方法允许访问。这部分高度取决于实际应用,所以我们在此示例中漏掉了。如果给定的权限请求的方法称为,否则会引发异常。

工厂及生成编程一般的另一个应用程序是代的系统接口,将它的 GUI,数据库接口、 web接口或 API。下面的工厂代码勾勒出一个类工厂,生成用于编辑的给定对象的字段选择 GUI 窗体。很多任务的界面生成可以用相似的方式完成。本示例可以被视为只是编程语言基于实例的基于模型的用户界面开发 [2] — — 模型是描述编程语言的类型系统。

class EditForm(Type T, FieldInfo[] V) : Form

{

@foreach(F in V)

// declare widgets needed to edit field F

@T@ X;

@constructor@(@T@ x) {

this.X = x;

@foreach(F in V) {

// initialize widgets

// set event handlers

}

}

@foreach(F in V)
// define event handler

}

我们定义声明一个参数 T,应编辑对象类型的类工厂。V 参数保存 FieldInfo 对象的数组代表的应该是可编辑的 T 字段的子集。首先,在行3-4,我们迭代生成小部件,我们需要建设的适当的 GUI。对于大多数字段,这可能是一个标签和一个文本框。在第 6 行我们声明一个成员变量包含要编辑的对象。在行8-14我们生成一个构造函数。使用生成的构造函数标识符关键字的构造函数。它存储要编辑的对象,并设置了窗口小部件和其事件处理程序适当。在行 16-17 我们生成事件处理程序这传播更改在 GUI 中 X 的字段的相应变化。在图 1 中我们看到如何输入和输出的一代人可能看起来像。

3、结论

生成器的子语言的集成使 C# 功能强大的语言创建的通用组件。可以开发的发电机是强大得多的只是泛型类型。它们在语义上语义上基于宿主语言 C# 和因此容易理解,但启用类型和代祷的反思。因为生成器使用普通的 C# 类型他们是容易扩展。

工厂才有可能得以实施的面向对象设计模式,生成各类的接口和生产优化代码。虽然语言构造都经过精心挑选的以使这些生成任务成为可能,他们也被为了要呈现静态安全检查可能的所以,可以预先防止生成错误。

在项目网站上,www.factory.formcharts.org。可以找到更多有关工厂和研究与实现

参考文献:

[1] K. Czarnecki and U. Eisenecker. Generative Programming - Methods, Tools,

and Applications. Addison-Wesley, 2000.

[2] P.P. da Silva. User Interface Declarative Models and Development Environments: A Survey. In Proceedings of 7th International Workshop on Design,

Specification and Verification of Interactive Systems, LNCS 1946, pages 207–

226. Springer, June 2000.

[3] Franois-Nicola Demers and Jacques Malenfant. Reflection in Logic, Functional and Object-oriented Programming: a Short Comparative Study. In

Proceedings of the IJCAIrsquo;95 Workshop on Reflection and Metalevel Architectures and their Applications in AI, pages 29–38, August 1995.

[4] Dirk Draheim, Christof Lutteroth, and Gerald Weber. Factory: Statically

Type-Safe Integration of Genericity and Reflection. In Procee

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[153254],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。