[Catalyst] ways to do stuff and why
brian.kirkbride at deeperbydesign.com
Fri Aug 18 22:29:32 CEST 2006
leonard.a.jaffe at jpmchase.com wrote:
> Brian Kirkbride <brian.kirkbride at deeperbydesign.com> @ 08/18/2006 01:57 PM:
> > At this point, if I want code reuse I have two reasonable choices:
> > A) Create business logic modules, ie. MyApp::Logic::CreateTrial, etc
> > B) Write my own business logic methods in
> > Either is valid and from what I gather Java developers like the Logic
> route. I
> > chose (B) because I already have the classes and the logic is
> *usually* just
> > operating on that class's data model.
> [Insert snarky Java comment here]
> B couples my business logic too tightly with the ORM. ORMs fall out of
> The whole point of MVC is loose coupling. Method A does not have that
> tight coupling.
> This is a bit of good advice I've picked up along the way:
> Loose coupling of objects. Code to the abstract class (API) not
> the implementation.
> Sometimes it helps to forget about ORM's for a minute. The hash or
> array of data returned
> by DBI is still your Model. It you want objects, you have to roll your
> own, around the DBI data.
> Roll your own around the DBIC data, use object composition, rather than
> inheritance. The coupling
> is looser, and that makes your code less brittle.
I'm leaning toward this as well, you might have convinced me with the
composition argument. I had been thinking of it in terms of inheriting from the
I've moved from a home-grown ORM to Class::DBI to DBIx::Class in this project's
history. The business logic methods in the model classes had to change each
migration. Not a big deal, because it usually changing ->find to ->retrieve or
something that simple.
But not having to ever change a controller, script or CRON job by way of a set
of Logic:: proxy classes would be nice. Generally these bits don't have to know
much of anything about the model implementation so it hasn't been much to
change. But when iterating over result sets it's hard to avoid the model
Maybe I'll spend the weekend whipping up some proxy classes to sit between my
model and the rest. I that the business logic methods in the model would be
moved into these classes as well.
More information about the Catalyst