Hi,

This is a summary of the differences between Spring and Guice http://code.google.com/p/google-guice/wiki/SpringComparison

From it: 'From our experience, most AOP frameworks are too powerful for most uses and don't carry their own conceptual weight. Guice builds method interception in at the core instead of as an afterthought.' Likewise with Platformed, but again, there is no directly comparable concept of binding in the style of guice. Although guice is great I still don't think it solves the underlying problem (its solves parts), this is only because solving the problem requires engineering discipline, not a framework. For example, if you annotate a method to do some before or after logging (how I suggested in the second mail, a sample is below), you are effectively binding a system policy to a component. That's wrong and is part of the point of the Spring design, I.e. the XML part describes system policy (guice still uses XML in some cases).

It is possible to take existing James classes and break them into smaller pieces which can be recomposed into many more combinations (the point of components?). I've looked briefly at the POPServer implementation and this could easily be broken down into smaller chunks, each doXXX could be separated off into its own class for instance I.e. the method becomes a component. If done like this they could now be re-used by spring, guice or mine.

I just received an email, thanks.

If the framework needs so much text to be explained....something that people is 
able to grasp without reading pages of docs.

Sorry, my fault, too much/too little, I was thinking a bit out loud. You don't really need to know about the details of the framework.

You propose a new container framework using interfaces to be
implemented. in 2009 this is a bad practice, currently frameworks use
@annotations, AOP, agnostic (pojo) dependency injection. If we want an
interface based framework then Avalon does a damn good job here,
already.

The above statements should answer that, I am not asking you to use my interfaces, I am asking you structure James functionality in way that makes them usable in more systems.

You also will need a good understanding of other frameworks so to
publish a comparison and use common terms defining what makes your
framework special. What is the most similar framework around, what
does your framework do better? Does your framework try to solve
container issues (class loading, component isolation,
component reloading, deployment) or application assembly (dependency
injection, component configuration, service discovery/linking,
configuration)?

I do have pretty a good understanding of frameworks and the answer to this is mostly yes, but it misses the point, I am not trying to sell my framework. Back to the beginning, all components that contain logging code are flawed. At present my framework doesn't have this flaw, but that because it doesn't as yet have any flawed components (but it can support them). The problem is with components, take this example:

RIGHT:

class RealMethod{
   public void realMethod(){
      //No logging, just does something useful.
      ...
   }
}

//How some AOP frameworks implement cross cutting concerns.

class LoggingRealMethod extends RealMethod implements Loggable{
   public void realMethod(){
       //Before logging
       logger.log( ... );
       //The real method
       super.realMethod()
       //After logging
       logger.log( ... );
   }
}

//How my framework might use it

class RealMethodOperation extends RealMethod implements Operation{
   public void operate(){
      super.realMethod();
   }
}

WRONG:

class RealMethod{
   @LogBefore
   @LogAfter
   public void realMethod(){
      ...
   }
}

The problem of cross-cutting concerns cannot be solved with a framework alone, the components must really be designed with cross-cutting concerns in mind. Avalon did a very noble job of encouraging good component design (based on principles of the time), that's the point of a framework. The solution to the problem is engineering discipline, a deeper separation of concerns, simple as that. If you want to add logging in a declarative fashion, components can't contain their own logging code and should probably instead provide the framework information about its loggability (with annotations for example) that open up opportunities for the framework (well components of the framework) to monitor them.

I hope this clarifies my objectives, if done right, James could be suitable for many frameworks/projects. You might also want to ask questions such as does spring or guice support declarative logging? I suppose the answer is probably yes, if the components where designed appropriately. The only thing that makes the framework 'special' is that it encourages best practice in its approach to component design (like Avalon did). Common sense alone will tell you that declarative logging requires components with no internal logging code. Imagine doing away with if( logger.isLevelEnabled()) logger.level( "etc" ) and instead drop your component in a debugging system with a verbose logging policy or dropping a component into a production system with a minimal logging policy. Wouldn't that be sweet?

Regards,

Simon














---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to