ArchAJ

この前から書いていた、ArchJava っぽいことを @ (Attribute or Annottation) + AspectJ のソースを生成の話を、ちょっと具体的に。


ArchJava とは程遠いけど、雰囲気的には、以下のようなソースがあるとすると(あとで、ちゃんと実装上の問題とかをまとめてドキュメントにするけど):


/**
* @component
*/
public abstract class ComponentA {

/**
* @expected
*/
public abstract void myMethod();

public void method() {
myMethod();
}
}


/**
* @component
*/
public class ComponentB {

/**
* @provided
*/
public void myMethod() {
System.out.println("ComponentB.myMethod()");
}
}

public class Main {

public static void main(String[] args) {
ComponentA compA = ComponentA.connect( new ComponentB() );
compA.method(); // "ComponentB.myMethod()"
}
}

生成されるコードは:

public interface ComponentAPort {
/**
* @expected
*/
public abstract void myMethod();
}

public aspect ComponentAAspect {

public static ComponentA ComponentA.connect(ComponentAPort port) {
return new ComponentA_(port);
}

protected static class ComponentA_ extends ComponentA {

private ComponentAPort port;

public ComponentA_(ComponentAPort port) {
this.port = port;
}

public void myMethod() { port.myMethod(); }

}
}


public aspect ComponentAConnection {
declare parents: ComponentB implements ComponentAPort;
}
なんか色々と問題点(一番の問題点は、どんな利点があるのか、ということ)がありそーだけど、、、進行中。