> -----Original Message-----
> From: Ted Husted [mailto:[EMAIL PROTECTED]]
> Ideally, any chaining or nesting should take place behind a 
> business facade. When someone starts nesting or chaining actions, 
> it's an indicate that the actions are being used to implement the 
> facade. 

But what if the chaining is to accomplish something that is entirely
presentation-layer specific?  I've always wondered about stuff like this.
Most of the Action chaining I've implemented is because the pages that
assemble an ActionForm don't collect all its information in one place: page
one supplies property X, page two supplies property Y and so on.

To illustrate: suppose you have a business method somewhere like this:

  frobnicate(int frequency, int squishiness, String message)
    throws CannotFrobnicateException;

Note that there are no presentation layer details here.  The idea here is
that you call it, supplying all three parameters, and it either works or it
doesn't, and a whole lot of presentation-layer-agnostic business logic is
buried behind it.

Now suppose you want to hook an Action up to call this method in certain
appropriate cases, being a good Struts developer and not wanting to embed
the business logic directly into the Action.  It would probably look
somewhat like this:

  public ActionForward perform(...) { // or execute()...
    final int squishiness = actionForm.getSquishiness();
    final int frequency = actionForm.getFrequency();
    // ...and so on...
    // ...get the Frobnicator...
    try {
      frobnicator.frobnicate(frequency, squishiness, message); 
    } catch (final CannotFrobnicateException kaboom) {
      //...handle it...
    }
  }

All fine and good.  But now additionally suppose that the web pages that
aggregate the frequency, squishiness and message that are destined for the
frobnicator are spread out, i.e. the frequency is captured on one page, the
squishiness on another, and so on.  Wouldn't it make sense to actually code
this Action differently, so that if it detects for any reason that, say, the
squishiness parameter is missing it could just forward off to the
GetSquishinessAction?  E.g., taking most of the code from above:

  public ActionForward perform(...) { // or execute()...
    final int squishiness = actionForm.getSquishiness();
    if (squishiness < 0) {
      return mapping.findForward(GO_TO_GET_SQUISHINESS_ACTION);
    }

    final int frequency = actionForm.getFrequency();
    if (frequency < 0) {
      return mapping.findForward(GO_TO_GET_FREQUENCY_ACTION);
    }

    // ...and so on...
    // ...get the Frobnicator...
    try {
      frobnicator.frobnicate(frequency, squishiness, message); 
    } catch (final CannotFrobnicateException kaboom) {
      //...handle it...
    }
  }

Surely *this* kind of logic (forwarding to another Action when you don't
have the parameters you need because of presentation layer limitations)
isn't business logic, but is presentation logic, and surely it belongs in
Actions, whether chained or not?

My gut reaction is that this is defensive programming: if your business
method requires three parameters, then it's not really "business logic" to
make sure that the method is supplied with three parameters, right?  I mean,
if your presentation layer (the web in this case) is, for whatever reason,
incapable of always supplying all three parameters at once, then shouldn't
logic like this (including Action chaining) be in place?

I'd be curious to hear what you think about this.  I always get faintly
queasy when I hear the term "business logic" because I'm never really sure
what it means.  :-)

Cheers,
Laird

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to