Take at look at:
http://www.corej2eepatterns.com/Patterns2ndEd/PatternRelationships.htm

More specifically the Application Service pattern
http://www.corej2eepatterns.com/Patterns2ndEd/ApplicationService.htm

BTW, its a great book!

robert

> -----Original Message-----
> From: Paul Barry [mailto:[EMAIL PROTECTED]
> Sent: Thursday, April 15, 2004 1:13 PM
> To: [EMAIL PROTECTED]
> Subject: Struts, Business Logic, DAOs
> 
> 
> I have a question about business logic.  The best way I can think to 
> explain this is with an example.  I know this is kind of long, but I am 
> trying to keep this as simple as possible while still being able to 
> illustrate the point.  Let's say I have Users and Widgets.  I would have 
> Business Objects for each one, something like this:
> 
> public User {
>    public int getId();
>    public boolean isAdmin();
> }
> 
> public Widget {
>    public int getId();
>    public User getCreator();
> }
> 
> Now assume I am using a DAO like this:
> 
> public WidgetDAO {
>    public void delete(int id);
> }
> 
> Assume the implementation of this DAO would delete a row from the widget 
> table in the database.  So using struts I would have an action with a 
> method like this:
> 
> execute(...) {
>      WidgetDAO.delete(widgetId);
> }
> 
> Assume the widgetId came from an ActionForm, the details are irrelevant. 
>   The point is this would all work fine, you could call the action with 
> a URL like /deleteWidget.do?widgetId=4 and it would delete widget 4. 
> Also, assume there is other logic already handling logging in the user 
> so there is a UserBO object in a session attribute, which is used to 
> populate the creator property of the Widget.
> 
> But now let's say I have 2 business rules:
> 
> 1.  users that are admins can delete any widget
> 2.  non-admin users can only delete widgets they created
> 
> So specifically from the objects above, you can delete a widget if 
> user.isAdmin() returns true or widget.getCreator().getId() == 
> user.getId().  The question is where should this kind of logic go?
> 
> You could get away with putting it in the action, but in a real world 
> application this type of logic would be much more complicated and 
> probably get re-used across different actions.  The Struts guidelines 
> even say this:
> 
> "Rather than creating overly complex Action classes, it is generally a 
> good practice to move most of the persistence, and "business logic" to a 
> separate application layer. When an Action class becomes lengthy and 
> procedural, it may be a good time to refactor your application 
> architecture and move some of this logic to another conceptual layer; 
> otherwise, you may be left with an inflexible application which can only 
> be accessed in a web-application environment."
> 
> http://jakarta.apache.org/struts/userGuide/building_controller.html#action_classes
> 
> I doesn't seem like this logic belongs in the DAO either, because if you 
>   don't want that kind of logic mixed in with code to get the data out 
> of the database.  Does it belong in the business objects, maybe by 
> expanding the Widget object like this?
> 
> public Widget {
>    public int getId();
>    public User getCreator();
>    public boolean canDelete(UserBO);
> }
> 
> And then canDelete would in turn call a DAO to check that?  Or would a 
> separate layer be better, like this:
> 
> public WidgetLogic {
>      public boolean canDeleteWidget(User, Widget);
> }
> 
> 
> Are there any best practices or sample applications that you know of 
> that have a good example of a business logic layer?
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 

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

Reply via email to