On Mar 3, 2011, at 1:52 AM, Tony Drago wrote:

> // ANNOTATIONS OMITTED FOR BREVITY
> class MyController {
> 
>    public String deleteUser(Integer userId) {
> 
>        userService.deleteUser(userId);
>        return "redirect:/listUsers";
>    }
> 
>    public ModelAndView addUser(User user) {
> 
>        userService.addUser(user);
>        return new ModelAndView("/showUser", user);
>    }
> } 
> 

And here's where it fails. The KISS idiom is paramount here. Stripes Action 
Beans are (typically) small enough where the encapsulation simply isn't 
necessary, and in fact gets in the way because, as others have mentioned, when 
you're working with many similar methods, pretty soon, they all have similar 
signatures. While it's explicit, it's redundant.

Also, MVC REQUIRES this style because the controller is not thread safe. IMHO, 
the fact that Servlets are not thread safe makes sense to me from a simplicity 
of the implementation and design of the basic framework. The fact that other 
frameworks KEEP that "feature" is, frankly, just insanity. ActionBeans are 
created (typically) fresh with each request, so they don't need to encapsulate 
logic and parameters at the method level, the Class is the level of abstraction 
and encapsulation.

With Classes we get neat things like inheritance. We have a large chunk of 
refactored code and handlers in our system that is shared among our 
ActionBeans. Our Entities have common ancestry, which our factored out routines 
and resolutions can work with. But Stripes binds to the Entities themselves, 
correctly. So, our ActionBeans might have List<User> in them, while the common 
code works with List<Entity>. With Methods as your sole level on encapsulation, 
you can't have a handler that takes "List<Entity>" because you'll lose the rest 
of your model when the system binds to it. Since our binding is done at a 
higher level, in the class, we can bind to List<User> and then call a 
resolution and treats them as List<Entity> without losing information. You lose 
that kind of flexibility when Methods are your sole level on encapsulation.

Stripes use of the "ActionBean as Controller/Model" also fits well in the 90% 
use case. The simple fact that you're populating your "ModelAndView" is 
something that Stripes doesn't have to do. Every method has to enumerate its 
parameters (redundantly in the 90% use case), and then enumerate the objects 
going in to the ModelAndView, again, in the 90% use case, redundantly. Stripes 
factors all that boiler plate away. This, IMHO, simplifies the code.

I'll be the first to admit that on edge case, with really complicated 
ActionBeans, it can get a little busy. Also, Stripes potentially lets other 
things that we don't want populated, to be populated (i.e. some piece of the 
model not used by the resolution). But, I'd rather deal with that rare bit of 
busy than fight the repetitive, redundant boiler plate in the 90% case.

There's little stopping folks from writing redundant, wordy code (because, as 
we all know, Java isn't wordy enough) with Stripes. *I* embrace the fact the 
Stripes lets me NOT do that. Expedience and practicality in the every day work 
outweighs design purity every time in my book.

Regard,

Will Hartung
"Bulldozing Ivory Towers since 1979"


------------------------------------------------------------------------------
Free Software Download: Index, Search & Analyze Logs and other IT data in 
Real-Time with Splunk. Collect, index and harness all the fast moving IT data 
generated by your applications, servers and devices whether physical, virtual
or in the cloud. Deliver compliance at lower cost and gain new business 
insights. http://p.sf.net/sfu/splunk-dev2dev 
_______________________________________________
Stripes-users mailing list
Stripes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/stripes-users

Reply via email to