I used to think that attributes were the cat’s meow. After using them extensively, I discovered that they are just another layer of obfuscation that complicates the maintenance of the code. I realized that a much better implementation would have been to keep the the imperative code separate from the metadata declarative portions. As it stands, the source code combines both. What I think would be better is a separate, purely declarative, repository as a map of the imperative code and the desired attributes. This would have allowed the attributes to vary independently from the code. Consider changing a serialization attribute, like the XML attribute name, or a description of a property to assist the form designer. Good grief, I have to touch the code base to do that?
So that’s what I’ve learned over the years, is that the code and the attributes should actually have been kept physically separate.