On Jun 15, 2009, at 11:49 AM, Aristedes Maniatis wrote:
I take your point, but I still think "DataMapElement" is more
descriptive. Every class in Java is an Object, so using that word as
part of the name conveys nothing, except that it is sort of a
generic multi-purpose thing. At least DataMapElement is clear and to
the point. And there is no reason why an Element can be used to
describe theDataMap itself. Slightly odd, but not too confusing.
MappingElement then? Not tied to any particular class name and has no
implied ownership.
Shouldn't we have a rigorous class hierarchy so that common code can
be kept in superclasses where they belong?
I don't have the experience you do in creating java libraries meant
to be used by lots of people in different ways, but I can't see how
moving to interfaces for this one thing will help. If interfaces are
to be used, then perhaps the ultimate goal is that every 'data map
element' should be only an interface, allowing a user to swap in any
implementation they want without having to inherit from our classes.
I don't insist on using interface here, rather I oppose a common
superclass for .map and .query. Inheritance hierarchies can be tricky
- it's way too easy to mix together unrelated things, based on a
single coincidental shared property (no pun intended with "property
API" being developed here). So my rule of thumb is that when in doubt,
don't use a common superclass for the sake of elusive reuse of a few
lines of code.
In fact we probably don't need a common interface without code
reuse: .map and .query can handle properties separately in their own
hierarchies. For the sake of simplicity initially I would even ignore
queries completely, and concentrate on the mapping elements.
If not, then I think this half way mixture of inheritance and
interfaces is confusing. There is already a mixture of the two I
find sometimes disconcerting.
The current state of Cayenne is a result of evolution, not of a one
time design, so there are some rough edges for sure.
* DataMapElement.Property inner class... Why is this an inner class?
It
is exposed via public methods to the end users, so let's make it a
standalone class.
I thought inner class made sense here. The naming is convenient and
clearer: "DataMapElement.Property" rather than
"DataMapElementProperty" shows the fact that it is intrinsically
part of DataMapElement and not relevant as a "Property" outside of
that usage. This is just about naming and style, and the decision
based on what 'looked' right from the perspective of a user seeing
this class. You originally wanted just a Map<String,String> of
properties rather than a whole class, but I thought that this was a
way to capture more information in the future: properties might have
other attributes such as whether they travel to the client in ROP.
But really, they are just a slightly enhanced Map, so an inner class
seemed to capture that idea.
This is just a matter of API style consistency - in Cayenne we do not
have *public* inner classes at all. So I'd vote for
org.apache.cayenne.map.Property.
Also if there is a notion of properties order in the
element (is there?), I guess the property should be stored in the
list. Do we care about properties ordering or simply displaying
them in an alphabetic order is ok?
I'd say alphabetic is ok. Any scenarios when the order might be
important?
I don't think order is important, so the CM can display it in
whatever order makes sense.
If order is not important, and we don't have to store properties in a
list as a result, we may not even need to store Property.key inside
the property. To me a key is what a holder decided to name the
property, not something that a property itself knows about.
Andrus