On Fri, Sep 28, 2007 at 09:22:01AM +0200, Dami Laurent (PJ) wrote:
>  
> 
> >-----Message d'origine-----
> >De : Matt S Trout [mailto:[EMAIL PROTECTED] 
> >Envoyé : jeudi, 27. septembre 2007 22:44
> 
> >Don't confuse class -names- with the nature of classes. 
> >MyApp::Model:: is
> >*adapters* that make a model available to MyApp, not where 
> >your domain model
> >logic itself should live.
> >
> >I usually these days have MyApp::Web for the catalyst app 
> >instead of MyApp so
> >I can deploy things like MyApp::DataStore from a separate dir tree.
> 
> 
> Makes a lot of sense to me. So the model can be used not only from the 
> catalyst App, but also from batch jobs, command-line utilities, etc. And the 
> Catalyst model *adapters*, as you call them, merely load the appropriate 
> external modules, that's all.
> 
> But then comes a question about writing Catalyst code : which is best between 
> a) and b) below ?
> 
> # a) go through the adapter for every method call
> $c->model('Some::Model::Adapter')->do_stuff()  
> 
> # b) directly call the external model after it's loaded
> My::External::Model->do_stuff()                 
> 
> 
> I tend to prefer b) because the code dealing with business logic always looks 
> the same, either within the Catalyst app or within the command-line 
> utilities. And if there is some global state in the external model (like 
> sharing the DB connection, or setting/changing properties on that 
> connection), it makes it very clear to every client that they are interacting 
> with the same common global state. Finally, it saves a couple of method calls.
> 
> My colleague prefers a) because it's the usual, "oficial" Catalyst way, and 
> because if we ever need some reverse interaction from the model to the 
> controller, we can add stuff in the adapters, playing with ACCEPT_CONTEXT.
> 
> Any other opinions in this debate ?

I always use approach (a) because I don't tend to deal in terms of class data.

Personally, if you can call

My::External::Model->do_stuff()

then clearly you're using class methods to hide magic global variables. I
don't really believe in magic globals.

DBIC models simply -can't- function that way of course, since we don't do that.

In the case of Model::DBIC::Schema of course

$c->model('Foo::Bar') is just convenience for

$c->model('Foo')->schema->resultset('Bar')

-- 
      Matt S Trout       Need help with your Catalyst or DBIx::Class project?
   Technical Director                    http://www.shadowcat.co.uk/catalyst/
 Shadowcat Systems Ltd.  Want a managed development or deployment platform?
http://chainsawblues.vox.com/            http://www.shadowcat.co.uk/servers/

_______________________________________________
List: [email protected]
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/[EMAIL PROTECTED]/
Dev site: http://dev.catalyst.perl.org/

Reply via email to