In response to the recent threa(d|t)s, I just wrote:

http://www.jroller.com/comments/lsd?anchor=rethinking_attributes

for lazy people (though the blog page has embedded links), here's the scoop:

=== Rethinking attributes ===

The new JDK 1.5 attributes are nice (they're powerful and easy to read just like the .Net ones), but if you can't use them yet, you'll have to do something else (BeanInfo files, MBeanInfo files, xml files, javadoc attributes, bytecode hacking, ...). Its been the topic of (sometimes heated) debate over at avalon for far too long now. I think I've just figured out why.

Its obvious really. I should've listened to the little voice in the back of my head that said "too much magic, too much magic, too much magic...". What's the simplest thing that can possibly work to associate arbitrary attributes with any class or instance? This:

public interface Attributes
{
  /* stuff */
}
public interface AttributeProvider
{
  public Attributes getAttrbibutes()
}
class MyComponent implements AttributeProvider
{
  public Attributes getAttrbibutes()
  {
    /* implement contract */
  }
}

Who was it that jumped to language extensions, BeanInfo classes, coding conventions, javadoc tags, pagelong specifications, and worse? Shame on you! You should've thought of the simplest possible thing first!

If that had happened, and basic OO rules about decoupling and composition had then been followed, none of all the current attribute headache would have ever existed. We would just have

public interface AttributeHelper
{
MethodAttribute[] getAttributesFor( Object instance, String methodName );
MethodAttribute[] getAttributesFor( Class class, String methodName );
/* etc etc */
}
public class AttributeProviderBasedAttributeHelper
implements AttributeHelper { /* ... */ }
public class JDK15BasedAttributeHelper
implements AttributeHelper { /* ... */ }
public class QDoxAttributesAttributeHelper
implements AttributeHelper { /* ... */ }
/** Detects which delegate attribute helper to use based on some heuristics. */
public class IntelligentAttributeHelper
implements AttributeHelper { /* ... */ }


Fortunately, its not too late (its never too late). We can always refactor. Let's refactor. Jakarta Commons Attributes is nearly there already. We just need to make the internals of the Attributes class into a set of proper components (with an interface and multiple implementations), and then add a lightweight container (I can think of a few ;)) inside the facade.

--
cheers,

- Leo Simons

-----------------------------------------------------------------------
Weblog -- http://leosimons.com/
IoC Component Glue -- http://jicarilla.org/
Articles & Opinions -- http://articles.leosimons.com/
-----------------------------------------------------------------------
The contents of this e-mail are copyright (c) Leo Simons, and licensed under a Creative Commons License, available at
http://creativecommons.org/licenses/by-nc-sa/1.0/




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to