Le 09-11-16 à 13:12, Alexander Klimetschek a écrit :

2009/11/16 François Cassistat <[email protected]>:
I think JCR+OCM is perfect for rapid development.

Please explain: why should adding a code layer be more rapid?


I see this from a RAD and object database perspective.

OCM provides a sort of CRUD interface on objects. Defining an object is simple and fast, then you specify the location and begin using it. No need to worry about structures and everything. Maybe OCM have limitations and is not optimal, but software is written fast and easier to be changed. This is perfect for iterative development where changes are likely to be asked.

I agree that the JCR layer might not cover all typical operations in
convenient methods, but you can provide helper methods for that (eg.
jackrabbit-jcr-commons) that make life easier but still only depend on
the JCR API.


It is true, but for me, if you generalize helper methods to the extreme, you get something that looks like OCM anyway. Maybe you can make something as complex and more flexible, and this could be a great thing.

The only complexity it
adds is on performances, I found the code to be more readable with OCM.

Maybe I do not have much experience with "low-level" JCR programming, but the problem with manipulating nodes is that you get all kind of variables which you never know how to name (parentNode, node, subNode[], nodeToDelete, newNode, etc.) and it becomes unreadable and when your code gets bigger.

I guess in most cases utility methods, as mentioned above, will solve
this. In addition, suggesting you have a simple node = object mapping,
I don't see why you shouldn't get the same "complexity" of variable
names with your DAO entities. And nobody forces you to use "node" in
the variable name. Using scripting, property access becomes even
simpler (see Apache Sling, Javascript or the ValueMap from the sling
api). Only in Java the "getProperty()" way of reading properties might
be a bit cumbersome, but IMO nothing that is so bad that it should add
a new layer, dependencies and more code:

  Node user = session.getRootNode().getNode("home/users/johndoe");
  user.getProperty("name").getString();
  ....


Yes, like I said, I lack experience manipulating nodes (before I tried JCR, I was using active records on my projects).

The problems I have with naming nodes variables are :
- If I made utility methods, you don't know how what the node is, your variable get named "nodeThing" generally. - When using a non-general method, you should already have something like an User object named user and you end up calling your node userNode because you don't know how to make the name distinct and easy to read.

Anyway, I just wanted to say that working with nodes add a certain complexity on your code because the code itself does not represent visually the tree's hierarchy since it is flatten (as could XSLT could be, by example). If you are working with many nodes on different location and doNotWantNamesToBeThatLong, this gave me readability problems.

I found myObject.save() to be straightforward and clean.

A problem with object.save() is often that you don't really know the
scope of the session/transaction. Explicit handling is better, eg. in
the context of webapps it's typically one session per request. JCR 2.0
goes fully onto this and deprecates Item.save() (albeit still
supported by Jackrabbit) and only allows a Session.save().


You are right.

A generalisation is never perfect, but when it fits for 95% of my needs, I can afford making exception cases for the other 5%.

Regards,
Alex

--
Alexander Klimetschek
[email protected]


François

Reply via email to