|
Posted by "Michael Sims" on 09/20/05 16:04
Murray @ PlanetThoughtful wrote:
> Once he understands how to solve class abstraction problems such as
> the one he is asking about, he will be better equipped to deal with a
> wider range of application development tasks.
I agree with this.
> This is not to trivialize your Metastorage project (or, to be more
> accurate, I know nothing about it, so it's not my place to trivialize
> it or otherwise), but to point out that 'out-of-the-box' solutions to
> fundamental coding development problems probably ultimately makes for
> a poorer programmer. I could well be wrong, but it seems this is a
> case of "give a man a fish" as opposed to "teach a man to fish".
I see your point, but I'm not so sure I agree fully. Manuel suggested
Metastorage (which makes sense, it's his project and he's most
familiar/comfortable with it), I suggested Propel because that is what I've
used. I think we both suggested existing ORM's for the same reason...
namely that properly implementing a full featured ORM is an extremely
difficult thing to get right. I don't know anything about Chris's skill as
a programmer, but he's bound to reinvent the wheel several times over, and
poorly to boot. I believe that implementing an ORM is one of those things
that you cannot fully understand and appreciate until you've tried to do it
and failed. IMHO it's only after you've built one that you realize what you
really need, and by then it needs to be rebuilt. It's kind of like Fred
Brook's "plan to throw one away; you will, anyhow", or at least it was for
me.
I think the whole DAO/ORM approach is something that most programmers who
are fans of OO stumble into as part of their natural development. I know
that in my earlier projects I had implemented some type of this pattern
without fully realizing that I had done so. It's just natural to consider
at some point that you should represent entities in your database as objects
(if you're an OO proponent). In one of my earlier PHP projects, I
implemented a very basic ORM that represented only single entities and
didn't quite handle multiple entities very well, or the relationships
between entities (this seems to be where Chris is currently). Then for the
next project I added better support for multiple entities and relationships,
but it was a half implementation, because I didn't represent the related
entities as full objects (for example, if a Customer has a list of phone
numbers, I had the Customer object return them as an array of strings rather
than an array of PhoneNumber objects). I also had no support for recursion
when saving or updated objects (for example, in Propel, you can create a new
Customer object, create 5 new PhoneNumber objects, attach them to the
customer, then call the save() method on the Customer and it will recurse
through all attached objects, saving each of them). Another thing I had
done halfway was support for querying objects (without using SQL).
Basically I had created different types of criteria that could be used, but
my support for criteria wasn't general enough. IOW, if I didn't forsee that
you would want a particular type of criteria, then you couldn't use it.
Propel gets this right by supporting any arbitrary criteria using their
Criteria object approach (and I'm sure Metastorage has similiar
functionality). If you can represent it using SQL, you can represent it
using Propel's Criteria.
My point is, I had implemented my own home grown ORM about 3-4 times, and
while each one was much better than the one that preceded it, I still wasn't
quite all the way towards a 100% general implementation. That's when I
found Propel. It got so many things right that I hadn't figured out how to
solve, as well as implementing things that I hadn't even considered yet.
Now, you could argue that going through all those iterations and refactoring
my own ORM helped me to improve my skills as a programmer, and you would be
right. That's where I agree with you, somewhat. :) However, I was many
many iterations away from improving my ORM to the point where it would be as
useful as Propel (and that's assuming it would ever be that useful). The
guys who developed it (and I'm sure the same goes for Manuel and
Metastorage) concentrated on making the best general purpose ORM they could
make. IOW their whole goal was to build an ORM, while my goal each time was
to develop one for the purposes of finishing whatever real project I
happened to be working on. That meant they were closer to the problem, had
more experience with it, and were willing to do more to solve it more fully
and generally than I was.
Originally I intended only to look at the code they had created and learn
from it, using their ideas in my project. I started that way for a few
days, but I realized that there was so much they had accounted for that I
didn't even think of that it would be better to simply use their tool rather
than trying to reinvent it.
I think it's important to point out, however, that I have learned just as
much from using Propel as I did from creating my own ORM....I didn't just
simply drop Propel into place and run with it. First of all, I modified it
a good bit to work better for my environment. Secondly, as a general rule I
don't incorporate any third-party code/libraries into my codebase without at
least doing a cursory review through the code. Since I was particularly
interested in how this problem was solved, I investigated it more thorougly
than I normally would.
I also think that it helps developers (as it did me) to periodically
investigate how others solve problems...not just by asking questions in
forums and getting pointers/gentle knudges, but by actually perusing code
for working projects that others have created. It helps bring some fresh
ideas and perspectives into your work, and prevents the whole development
"inbreeding" by injecting some fresh DNA into the pool. :) Often we as
individuals can't see the forest for the trees, so I think looking at
someone else's solution can help you to step back and view the full picture
that you might have been missing.
Now, with all that said, it's possible that Chris isn't to the point where
he would benefit much from plugging in another ORM...in order to learn from
someone else code you at least have to have a basic understanding of the
problem they are trying to solve, or it will all be greek to you. And if
that's the case then you're right, it might hurt more than it will help. So
let me amend my recommendation by saying "check out Propel/Metastorage if
you're willing to actually study the approach it takes as opposed to simply
plugging it in". :)
Sorry, I didn't mean to ramble on that long... :)
Navigation:
[Reply to this message]
|