Hi Baz,

Would you believe ³it depends²?!

If I only needed the ability to save, I¹d call:
Remote.cfm?object=user&method=save&firstname=peter&lastname=bell& . . .

I¹m still trying to decide on error returns for remote methods ­ I¹d
probably return an Error bean containing 0..n records in an XML packet, but
it¹d depend on the use case

If I also needed the explicit ability to validate separate from a save
(maybe for a ³check that this form is valid² button in flex), I¹d also have
a validate() method and would call
Remote.cfm?object=user&method=validate&firstname=peter&lastname=bell& . . .

Best Wishes,
Peter


On 1/15/08 3:16 PM, "Baz" <[EMAIL PROTECTED]> wrote:

> This is exactly where I wanted the conversation to go!
> 
> So Peter - if you did have a flex app, and you wanted to save a user what
> would you do? At minimum you would have to pass in a struct of user values to
> some webservice - but then what? Would you validate in that method? Or would
> you have your flex controller first call a validate() webservice method, then
> depending on the results the save() webservice method?
> 
> Brian I see you handle the inherent problem by having a custom RESULT
> structure that you return - I understand why you do this - cuz I do it too -
> but doesn't it kinda suck? When do you stop using it? At one point I was
> thinking that I should use it as a return for any service function. The object
> would have properties like: Status, MessageCode, Payload. This would let me
> handle almost any cases and keep a standard interface to interact with.
> 
> Baz
> 
> 
> On Jan 15, 2008 11:15 AM, Peter Bell <[EMAIL PROTECTED]> wrote:
>> Hi Brian,
>> 
>> I'll disagree with you here. The calling code has to know three things:
>> * How to pass information to the service in the format it wants
>> * How to tell whether the save succeeded
>> * How to pass any error messages in a way the display will want to see them
>> (actually, it'll probably just be a conduit for the information, so it is
>> more likely the view will have to know this).
>> 
>> It needs to know how to pass well formed data to the service otherwise the
>> save won't work. It needs to tell whether the save succeeded as otherwise it
>> won't be able to make the controller decision to say whether to cflocation to
>> another screen or to redisplay the form (or whatever approach you're using),
>> and it needs to pass the errors along in a way the view can understand as
>> otherwise the view won't be able to display the correct error messages.
>> 
>> So, whether you make it:
>> If UserService.isValid()
>>     UserService.save();
>>     location("UserList");
>> Else
>>     Display Form
>> 
>> OR
>> 
>> Success = UserService.Save()
>> If Success 
>>   location("UserList")
>> Else
>>     DisplayForm
>> 
>> (o rmore likely, a variant where "Success" is really ErrorCollection and you
>> test whether ErrorCollection has any members, or is ErrorBean and test
>> whether ErrorBean.hasErrors())
>> 
>> In any of these cases you are performing both a command and a query. The
>> command is to save the data and the query is whether it was saved
>> successfully. Nothing wrong with turning that into a single mixed method call
>> (some purists might say you should keep commands and queries separated, but
>> I'm not that picky), but it isn't reducing the amount of information required
>> or the knowledge of the API. You're just doing the command and the query in a
>> single line so it isn't making the controller any dumber ­ just more concise.
>> 
>> Best Wishes,
>> Peter
>> 
>> 
>> 
>> On 1/15/08 12:56 PM, "Brian Kotek" <[EMAIL PROTECTED]> wrote:
>> 
>>> 
>>> 
>>> On Jan 15, 2008 11:57 AM, Adam Haskell <[EMAIL PROTECTED]> wrote:
>>>> I'm much more comfortable with doing 2 calls in my service,
>>>> model.validate(); model.save(), instead of Model.save() and have the save
>>>> do the validation. Doing model.save makes my service not much more a facade
>>>> which isn't what I want. Additionally in our environment we have multiple
>>>> validaters, some of which should not, in my opinion, be part of the
>>>> domain's concern. An example of this would be Enterprise vs domain specific
>>>> validation. Something like name is 35 characters and does not have cross
>>>> sit scripting is Enterprise concerns and part of the validation across all
>>>> applications irregardless of domain. Where as address must be in the US is
>>>> domain specific to Contest entries. The converse is true too though if you
>>>> put too much in the service layer your domain model becomes anemic.
>>> 
>>> See, I disagree here. I don't think it should be the job of the calling code
>>> to know that this is a two step process. I would call
>>> myService.save(someData) and the validation would happen inside the model.
>>> If you have some higher-level validation that would take place outside of
>>> the actual business object, I would still do that in the service; that is
>>> its job. I would do that validation inside the service, or more probably I
>>> would build it into the Validators, which means the Validator might
>>> internally be leveraging several specific Validators to do it's job. So I
>>> might do 
>>> 
>>> myService.save(userData);
>>> 
>>> and inside the service I might do:
>>> 
>>> user = createUser(userData);
>>> result = createResult();
>>> if (user.isValid()) {
>>> result.setSuccess(true);
>>> }
>>> else {
>>> result.addErrorMessages (user.getErrorMessages());
>>> result.setOriginalData(userData);
>>> }
>>> return result;
>>> 
>>> 
>>>  
>>>> 
>>>> Adam Haskell
>>>> 
>>>> 
>>>> 
>>>> On Jan 15, 2008 8:31 AM, Alan Livie < [EMAIL PROTECTED]> wrote:
>>>>> 
>>>>> Good anecdote but I am confused!
>>>>> 
>>>>> You said 'in this case the
>>>>> Service should be earning it's keep and making sure the documents are
>>>>> valid
>>>>> and ready for it's client, the model. '
>>>>> 
>>>>> Are you sure about this? Shouldn't the model be responsible for making
>>>>> sure things are valid - ie look after itself.
>>>>> 
>>>>> I see the service more as a smart api that delegates to the model for
>>>>> all the business logic and also can provide 'application-specific'
>>>>> functionality like logging, email notifications etc
>>>>> 
>>>>> But maybe I'm misunderstanding it or taking the anecdote too
>>>>> seriously! It's more accurate than the MVC song at least :-)
>>>>> 
>>>>> Alan
>>>>> 
>>>>> On Jan 15, 12:47 pm, "Adam Haskell" <[EMAIL PROTECTED]> wrote:
>>>>>> > I've used this anecdote before, and I think it is amusing so I'll use
>>>>>> it 
>>>>>> > again.  The way I think about it is The model and View are going
>>>>>> through a 
>>>>>> > divorce and the controller and service are the lawyers. Now thinking
>>>>>> about
>>>>>> > it in these terms, would it make sense for the Controller (the View's
>>>>>> > lawyer) to be taking care of the Model's Affairs, in this case
>>>>>> validating 
>>>>>> > documents for the model? That doesn't make much sense, in this case the
>>>>>> > Service should be earning it's keep and making sure the documents are
>>>>>> valid
>>>>>> > and ready for it's client, the model. Sure the Controller might throw
>>>>>> in 
>>>>>> > some JS for the View to do some preliminary checking so the always
>>>>>> bitchy,
>>>>>> > soon-to-be ex, spouse won't complain but it really is the spouses
>>>>>> lawyer's
>>>>>> > duty to inform the spouse that the documents are valid, or  return the
>>>>>> > documents to some one telling them to try again, no deal. That being
>>>>>> said
>>>>>> > Brian's earlier statement about calling something from Flex really has
>>>>>> > helped me clear up what should go where. Anecdotes provide a means to
>>>>>> > getting over the hump but once you are over the hump real life
>>>>>> programming
>>>>>> > drives the point home and Brian's example/thought process is spot on.
>>>>>> >
>>>>>> > Adam Haskell
>>>>>> >
>>>>>> > On Jan 14, 2008 11:53 PM, Brian Kotek <[EMAIL PROTECTED]> wrote:
>>>>>> >
>>>>>>> > > It depends on what you mean by "appropriate methods", but if you're
>>>>>>> > > talking about something similar to what Peter used an an example:
>>>>>> >
>>>>>>> > > If (Order.isValid())
>>>>>>> > > {
>>>>>>> > >    Order.save();
>>>>>>> > > }
>>>>>>> > > Else
>>>>>>> > > {
>>>>>>> > >   Screen = OrderForm;
>>>>>>> > >   Data = Order;
>>>>>>> > > };
>>>>>> >
>>>>>>> > > No, I wouldn't be doing that in the Controller (and I think we might
be
>>>>>>> > > getting some miscommunication here because I'm pretty sure Peter and
>>>>>>> Sean 
>>>>>>> > > wouldn't either). My Controllers are very dumb. The only thing they
>>>>>>> do is
>>>>>>> > > ask the Model to perform some business logic (via the service
>>>>>>> layer), and
>>>>>>> > > then invoke the appropriate views or execute a redirect. That covers
>>>>>>> 99% of 
>>>>>>> > > what my Controllers do.
>>>>>> >
>>>>>>> > > The problem with doing something like the above in the Controller
>>>>>>> means
>>>>>>> > > that the model is no longer neutral and self-contained. I can't call
>>>>>>> the 
>>>>>>> > > service layer from Flex now, because the logic that checks validity
>>>>>>> and does
>>>>>>> > > saving is executed by the Controller, not the Model. I would have a
>>>>>>> method
>>>>>>> > > in my service named something like "
>>>>>>> orderService.saveOrder(orderData)",
>>>>>>> > > and internally that service layer method might create an Order,
>>>>>>> validate it,
>>>>>>> > > save it, and return a success or failure result that the Controller
>>>>>>> can then 
>>>>>>> > > use to determine how to proceed (cflocation or redisplay form with
>>>>>>> errors,
>>>>>>> > > for example). I'm pretty sure that this is what Sean and Peter are
>>>>>>> also
>>>>>>> > > talking about.
>>>>>> >
>>>>>>> > > On Jan 14, 2008 9:11 PM, Baz <[EMAIL PROTECTED]> wrote:
>>>>>> >
>>>>>>>> > > > Sean, Brian, it seems you are both on board with getting a
>>>>>>>> newUserBean()
>>>>>>>> > > > from the service in the controller then calling the appropriate
>>>>>>>> methods on
>>>>>>>> > > > that UserBean later on in the controller. Do you also handle
>>>>>>>> queries or
>>>>>>>> > > > multiple objects in the same way that Peter does? That is, do you
code
>>>>>>>> > > > gateway-type methods into your service that interact with a
>>>>>>>> DAO/Gateway to
>>>>>>>> > > > return multiple instances of your object?
>>>>>> >
>>>>>>>> > > > Baz
>>>>>> >
>>>>>>>> > > > On Jan 14, 2008 4:40 PM, Brian Kotek < [EMAIL PROTECTED]
>>>>>>>> <mailto:[EMAIL PROTECTED]>  > wrote:
>>>>>> >
>>>>>>>>> > > > > Absolutely, I didn't mean to imply that the service actually
does
>>>>>>>>> > > > > everything itself.
>>>>>> >
>>>>>>>>> > > > > On Jan 14, 2008 7:35 PM, Sean Corfield <
>>>>>>>>> [EMAIL PROTECTED] >
>>>>>>>>> > > > > wrote:
>>>>>> >
>>>>>>>>>> > > > > > On Jan 14, 2008 1:19 PM, Brian Kotek < [EMAIL PROTECTED]>
wrote:
>>>>>>>>>>> > > > > > > I think he is saying that his controllers only interact
with
>>>>>>>>>> > > > > > services. The
>>>>>>>>>>> > > > > > > easy rule of thumb for me is: if this was called by Flex
instead 
>>>>>>>>>> > > > > > of my HTML
>>>>>>>>>>> > > > > > > controller, would it still work? The answer should be
>>>>>>>>>>> "yes". Which
>>>>>>>>>> > > > > > means all
>>>>>>>>>>> > > > > > > logic of any consequence (beyond doing something like a
>>>>>>>>>> > > > > > cflocation, which is
>>>>>>>>>>> > > > > > > specific to the HTML view anyway) should be handled in
the model.
>>>>>> >
>>>>>>>>>> > > > > > Right, but that can still be in the domain object rather
than the 
>>>>>>>>>> > > > > > service. You just need to expose the API via the service
>>>>>>>>>> for remote
>>>>>>>>>> > > > > > interaction. It doesn't mean all the business logic is in
the
>>>>>>>>>> > > > > > *service* which is at the heart of Baz's question, I
believe. 
>>>>>>>>>> > > > > > --
>>>>>>>>>> > > > > > Sean A Corfield -- (904) 302-SEAN
>>>>>>>>>> > > > > > An Architect's View --http://corfield.org/
>>>>>> >
>>>>>>>>>> > > > > > "If you're not annoying somebody, you're not really alive."
>>>>>>>>>> > > > > > -- Margaret Atwood
>>>>> 
>>>> 
>>>> 
>>>> 
>>> 
>>> 
>>> 
>>> 
>> 
>> 
>> 
> 
> 
> > 
> 



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"CFCDev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/cfcdev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to