Author: Anders小明
产品化和客户化两个词语是一个对孪生兄弟,一个没有强大客户化能力的软件是不能称为产品化的软件.产品化也就意味着软件公司的开发至少分为两个不同性质的角色:一个负责产品化,一个负责客户化.除去传统的参数化, 继承以及plugin技术外,aspectJ为我们提供另一种能力.
如前所述, 公司有两个不同角色的团队在开发和维护—研发组和项目组,更进一步,本文所说适应如下的开发团队结构:
一个研发组---多个项目组, 每个项目组需要定制化的东西各自不尽相同. 为了保证几个团队的工作的相对独立性,公司希望项目组在做客户化过程中不改研发团队所开发的代码,应用了已知的方法:参数化, 继承以及plugin技术外.
然而这些技术并没有覆盖到所有的问题, 问题描述如下
经过分析发现需要客户化的地方,是需要在Root类里加一个propertyA, 这个时候基于已有的能力,我们可以做的选择是要么项目组A在修改Root类,要么修改每个叶子类(LeafA....), 显然修改root类是一个不错的选择. 然而槽糕的是,项目组B需要是添加另一个properyB,于是项目组B也这么做了. 对于项目组A和B来说这样做是没有太多问题的.
但对于研发组来说问题却是很严重的, 由于研发组需要从项目回收代码,以便吸取优点改进软件,研发组不得不小心的维护各个版本,并处理项目组所做的修改.而同时项目组获取了修改研发组代码的权力,处于时间的压力,会产生不符合系统结构约束的代码.
很明显,这样的工作方式不利我们的工作,我们需要一个新的思路.
在正式提出新方法前,我想先介绍一下微软的DSL Tools以及C# 2.0,各位客官,还请耐心的看一下。
DSL Tools是微软开发的Domain Specification Language,目的是用更接近于业务的语言模型来描述业务问题,并生成运行代码。工具允许其用户定义各自的Domain Language,目标是软件工厂。DSL Tools面临的一个问题(也是公司目前面临),定义好的DSL以及生成代码,不可避免的出现不同客户存在细微的差异性,DSL Tools必须很好的解决它,事实上DSL Tools的确做到了——它基于是C#2.0 Partial Class技术。(有关于DSL Tools的更多信息可以参见MSDN)。
简单说的Partial Class的其实就是一个类的结构信息可以被存储在多个文件中,以下是个例子:
file1.cs(微软的一个文件可以定义多个类,所有其文件名不需要同类名):
public partial class CAgent {
private String name;
Property String Name{
get{
return name;
}
set{
this.name = name;
}
}
public void doSomethingA(){
....
}
}
file2.cs
public partial class CAgent {
private String code;
Property String Code{
get{
return code;
}
set{
this.code= code;
}
}
public void doSomethingB(){
....
}
}
虽然CAgent类被分解为两个文件,不过对于调用者类说,CAgent具体name以及code两个property,以及doSomethingA和doSomethingB两个方法。
现在你可以想象DSL Tools是如何解决客户化这个问题的了!
DSL Tools生成的所有class都是partial class,当对于CAgent(或者其它类)有需要客户化时,需要做的只是添加一个新的文件,用同样的类名加上一个partial的关键字,
public partial class CAgent 就可以添加新的属性和方法(如同我展示的那样,想象一下file1.cs是研发维护,而file2.cs是项目维护的)。也就说,DSL的研发团队和客户化团队的工作时相对独立的。
那么你一定会说,这个微软的C#,不幸的是公司用的是Java,java的语言规范不支持这样的能力。
是的,你说的很对,Java语言本身是不支持,不过我们有这样的手段——那就是AspectJ。
实际上AspectJ面世很久了,我接触它至少有一年半了,不过支持一直没有想到这样的用法,直到我研究了DSL Tools(我相信很多道理是相通的,我们目前面临的问题硅谷的那帮人也一样面对过)
下面是一个简单的例子:
OnType.java:
public class OnType {
public void doAction(){
System.out.println("OnType.doAction");
}
}
OnTypeAspect.aj
public aspect OnTypeAspect {
public String OnType.name = "OnTypeAspect";
public void OnType.doActionAspect(){
System.out.println("OnType.doActionAspect and name is "+ name);
}
}
Main2.aj
public class Main2 {
public static void main(String[] args){
OnType onType = new OnType();
onType.doActionAspect();
}
}
如你所见,程序是可以完整的运行。你的控制台打出了:OnType.doActionAspect and name is OnTypeAspect
不仅如此,AspectJ可以为已有的类添加新的接口,就像C#的partial class做的那样。
我以为aspectj是实现我们的目标的一个捷径,并且它是经过实践的,我不相信aspectj和微软的那帮人会闲着没事来支持这样的技术。BTW,我听说weblogic的jrockit准备在虚拟机一级上支持aspectj, 那么或许剩下的工作就是如何管理使用AspectJ了.
相关推荐
本文主要围绕"aspectjlib-1.5.3.jar.zip"这一资源展开,深入解析其核心组件和应用场景。 首先,"aspectjlib-1.5.3.jar"是AspectJ库的一个版本,版本号为1.5.3。这个库包含了AspectJ运行时所需要的所有类和接口,...
《AspectJlib-1.5.2.jar.zip:深入理解Java切面编程库》 AspectJlib-1.5.2.jar.zip是一个压缩文件,包含了AspectJ...通过理解和熟练运用AspectJ,开发者可以编写更加模块化、可维护的代码,提高软件的开发效率和质量。
aspectj-1.9.1.jar和aspectj-1.9.1.src.jar包。用于切面编程。 aspectj-1.9.1.jar和aspectj-1.9.1.src.jar包。用于切面编程。 aspectj-1.9.1.jar和aspectj-1.9.1.src.jar包。用于切面编程。 原来积分太高,我现在...
《AspectJlib-1.5.3源码分析与应用》 AspectJlib-1.5.3-sources.jar.zip 是一个包含AspectJ库1.5.3版本源代码的压缩文件,对于Java开发者,尤其是那些对AOP(面向切面编程)感兴趣的程序员来说,这是一个极其重要的...
在实际应用中,AspectJlib-1.5.2a.jar可以帮助开发者编写更干净、更模块化的代码。例如,通过定义切面,可以在方法调用前后自动添加日志记录,无需在每个方法内部手动插入。同样,它也可以用于实现细粒度的事务管理...
通过理解并熟练运用AspectJ,开发者可以创建更加灵活、模块化的应用程序,同时降低复杂度。在具体项目中,根据需求和环境,选择合适的版本和集成方式,将AspectJ有效地融入到开发流程中,是提升软件质量的关键步骤。
aspectj-1.7.0.jar aspectj的包
这个版本1.6.2的发布,是AspectJ项目中的一个重要里程碑,为开发者提供了强大的工具,以更优雅、模块化的方式处理横切关注点,如日志、事务管理等。 面向切面编程是一种编程范式,旨在提高软件的可维护性和可扩展性...
6. **编织增强(Advising Enhancements)**:AspectJ允许在已有的类和接口上添加方法、字段和初始化代码,实现对已有代码的无侵入式增强。 7. **集成其他Java框架**:AspectJ可以与Spring框架无缝集成,进一步简化...
aspectj-1.8.14-src.jar
aspectj-1.9.6-src.jar
aspectj-1.9.5.jar 官网下载地址:https://www.eclipse.org/aspectj/downloads.php
最新版本的aspectj-1.6.12.jar
标签:aspectj-1.6.10-src.jar.zip,aspectj,1.6.10,src,jar.zip包下载,依赖包
"aspectj-1.9.6.jar.7z" 文件是一个包含了AspectJ库版本1.9.6的压缩包,使用了7-Zip软件进行压缩,以提高文件传输和存储效率。 在Java开发中,AOP(面向切面编程)是一种设计模式,它有助于实现代码的模块化,将...
aspectj-1.9.0.BETA-3.jar
aspectj.jar jdk1.7 spring aop报错 请下载aspectj-1.9.1.jar 更换版本程序,再不行下载最新的aspectjweaver.jar
aspectj-1.8.0.jar
aspectj-for-spring-developersaspectj-for-spring-developersaspectj-for-spring-developersaspectj-for-spring-developers