Java Roundtrip Engineering

  SourceForge Logo




Here is the design and development information presented. If you want to comment anything on this page, or contribute any ideas, please do this in the JavaRE Open Forum at SourceForge.

  • Associations and Attributes
  • Modeling arrays
  • CVS
  • MagicDraw
  • Associations and Attributes

    I think Classifier Attributes in UML are flawed. Additionally, they create problems in reverse engineering.

    Since the very first day when I started with object oriented modeling, I have not felt at ease when working with associations and attributes. They have overlapping semantics that always makes me wonder which to choose in every case I encounter. When thinking more about this problem, I have come to the controversial conclusion that Attributes do not belong in Classifiers. An Attribute is just a special case of an Association, and therefore an unneccessary element in UML. I will try to explain below how I have reached this conclusion.

    When consulting the UML specification, one finds that Classifiers can be associated with StructuralFeatures. The only StructuralFeature available is Attribute. The two things with Attributes that have no correspondence in Association or AssociationEnd is that it can have an initial value and be a qualifier to an AssociationEnd.
    The initial value is an implementation detail that also does not belong in UML. But what about frozen Attributes? Well, AssociationEnds can also be frozen, but they have no initial value. The initialization of frozen AssociationEnds is deferred to the "creation of the source object" where it belongs - as an implementation detail.
    The second difference is the association with AssociationEnd. To this I have no invention, I only want the Attribute deassociated with Classifier.
    All Attributes can be replaced with Associations, and noone can tell the difference. This can even be automated.

    Lets take a look on code generation and reverse engineering.
    Automatic code generation for an association is not really possible, since an Association can be implemented in a variety of ways. The code generator will have to dictate the implementation policy for different associations, and if the programmer is not satisfied with this, he can not use the code generator or have to rewrite it. A possible soultion is to add stereotypes to the AssociationEnd to give directions to the code generator.
    Anyway, the result in most cases will be that both Associations and Attributes are generated as classifier attributes in the implementation language. This is most unfortunate for the reverse engineering of the code. What strategy should be used to determine what is what?
    One strategy would be to match attributes in the code with Attributes and Associations in the model to see if it already exists as either one. If it does not exist, the programmer has to be asked what the intention of the attribute is, Attribute or Association. But why ask when an Attribute can be substituted with an Association? Just generate the Association.
    The second strategy would be to generate Associations of all the attributes in the code. This would be simpler and not less expressive.
    The conclusion is that model attributes do not add any value to code generation, but makes it harder to reverse engineer the code.

    My conclusion is that the association between Classifier and StructuralFeature in UML should be removed. It is redundant.
    To improve the readability of class diagrams when everything is associations, I propose that associations should be possible to represent as text in the compartment where attributes are written today.

    But I don't decide the UML specification. I have to implement a solution for this in JavaRE. The strategy I will try is this.
    Generating code for Attributes is trivial. Associations will have to be considered more careful. Only named, navigable AssociationEnds without a stereotype will be generated as code attributes. If the programmer does not want code generated, a stereotype will have to be added to the AssociationEnd. All other Associations will be left unprocessed.
    When reverse engineering, JavaRE will check if the code attribute exists in the model as an Attribute. If this is the case, the Attribute will be kept as such. All other code attributes will be engineered as Associations.
    I am also thinking about generating only Associations and removing any Attributes from the model. This could be controlled with a command line parameter.



    Further work postponed. See introduction page.