AOP或称面向方面的软件开发(AOSD)于1997年在Xerox Parc创建,是一种相对先进的软件典范(Paradigm)。其思想很简单,通过使开发者每次只关注一个问题域来降低软件开发的复杂性。换句话说,人们在尝试解决一个业务问题(比如在互联网上销售产品)时无需考虑安全、线程、登录、数据访问和其他领域的问题。这被称为关注点的分离(Separation of Concerns)。通过分离这些领域或者方面,某一特殊方面的专家可以开发能够解决该方面问题的最好的解决方案,因此开发者无需再去掌握所有的行业。这样就有望产生健壮并且功能完善的软件,因为开发者只需做一名“软件问题域”的专家。
尽管这个例子没有任何用途,但它演示了G#的大量特性。首先,Client类使用了标准的C#语法——这在G#中是有效的,它只是简单地向控制台输出了消息“Hello World”。这个类定义下面是G#中新增的语言构造,称作生成器(Generator)。现在只需认为生成器是所有用于定义“如何生成代码”的代码的容器即可,这和类(Class)类似。Rename是这个生成器的名字,就好像Client是类的名字一样。接下来定义了一个名为ChangeIt的生成(Generation)。生成和方法类似,每次调用它都会执行一些动作,不同的是在调用生成的时候会通常产生代码。注意ChangeIt有一个目标(Target),在这里是来自Client类的Messenger方法。目标可以是任何(语言)构造,并且还可以包括通配符和正则表达式来指定一组项目作为目标。这表示由该生成所发出(Emit)的所有代码都将被注入到Messenger方法中。关键字pre规定了其后面花括号中定义的所有代码都将被注入到Messenger方法体中定义的代码之前。关键字post规定了其后面花括号中定义的所有代码都将被注入到Messenger方法体中定义的代码之后。因为用关键字static标记了这个生成,因此代码的实际注入是编译过程的一部分,理解这一点很重要。程序员将无法看到Messenger方法的变化,除非使用ildasm或Reflector来检查Messenger方法。此外还有一个目前还只是梦想的特性,就是能够生成动态的Region,这样在Visual Studio .NET中就能打开它来检查生成器都在客户环境中生成了哪些代码。稍后我们将讨论其他类型的生成。
private void Messenger(string message) { // From ChangeIt pre block. string oldMessage = message;
// From ChangeIt pre block. message = “Hello G#”;
// From the Messenger method body.
Console.WriteLine(message);
// From ChangIt post block. message = oldMessage; }