views:

260

answers:

2

Hi .
I'm a undergrad Student at a German University.
I have a team Programming Course .. where we have to use JavaEE/JSF to make a social networking site .. like LinkedIn.
Anyway my group has created a lot of beans. Which IMHO is too much .

    <?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="1.2" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"&gt;
    <managed-bean>
        <managed-bean-name>SessionBean1</managed-bean-name>
        <managed-bean-class>egispartnerprofile.SessionBean1</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>ApplicationBean1</managed-bean-name>
        <managed-bean-class>egispartnerprofile.ApplicationBean1</managed-bean-class>
        <managed-bean-scope>application</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>RequestBean1</managed-bean-name>
        <managed-bean-class>egispartnerprofile.RequestBean1</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>Hauptseite</managed-bean-name>
        <managed-bean-class>egispartnerprofile.Hauptseite</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>PasswordVergessen</managed-bean-name>
        <managed-bean-class>egispartnerprofile.PasswordVergessen</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>registery</managed-bean-name>
        <managed-bean-class>egispartnerprofile.registery</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>Page1</managed-bean-name>
        <managed-bean-class>egispartnerprofile.Page1</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <validator>
        <validator-id>login.EmailValidator</validator-id>
        <validator-class>Login.EmailValidator</validator-class>
    </validator>

    <managed-bean>
        <managed-bean-name>Bewertung</managed-bean-name>
        <managed-bean-class>group52.infoholders.Bewertung</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>Mitarbeiter</managed-bean-name>
        <managed-bean-class>group52.infoholders.Mitarbeiter</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>Nachrichten</managed-bean-name>
        <managed-bean-class>group52.infoholders.Nachrichten</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>Benutrzer</managed-bean-name>
        <managed-bean-class>group52.infoholders.Benutzer</managed-bean-class>
        <managed-bean-scope>application</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>view$MainPage</managed-bean-name>
        <managed-bean-class>egispartnerprofile.view.MainPage</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>view$NavigationBar</managed-bean-name>
        <managed-bean-class>egispartnerprofile.view.NavigationBar</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>view$PartnerProfilePage</managed-bean-name>
        <managed-bean-class>egispartnerprofile.view.PartnerProfilePage</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>view$PartnerProfileChange</managed-bean-name>
        <managed-bean-class>egispartnerprofile.view.PartnerProfileChange</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>view$ProfilePage</managed-bean-name>
        <managed-bean-class>egispartnerprofile.view.ProfilePage</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <navigation-rule>
        <from-view-id>/Page1.jsp</from-view-id>
        <navigation-case>
            <from-outcome>case1</from-outcome>
            <to-view-id>/view/MainPage.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>
    <navigation-rule>
        <from-view-id>/view/MainPage.jsp</from-view-id>
        <navigation-case>
            <from-outcome>case1</from-outcome>
            <to-view-id>/view/ProfilePage.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>
    <managed-bean>
        <managed-bean-name>view$ProfileChange</managed-bean-name>
        <managed-bean-class>egispartnerprofile.view.ProfileChange</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
</faces-config>

Actually :

  • Ever Site is a Bean
  • We have 3 Application Beans
  • I just use 1 Session Bean

I think they missunderstood the purpose of Beans.(did they? or am I wrong ?!)
How can i make them clear ... that 1 Session Bean is ( or could be) enough?

+6  A: 

It doesn't look like there are too many beans, but of course it depends on what the beans do and how they are used. The "one bean per view" rule is quite common and there is usually nothing wrong with this. Of course, if you can write some beans that are more general and can be used on many/all views, you should certainly do this, just try to keep their purpose clear and focused on a single task.

The fact that most of your beans are request-scoped is good. Only beans which have to keep some state during the whole duration of a user session should be put into session scope (hence the name). This also keeps the per session memory consumption low. Application scope is usually used for beans that have to be created once and are used by all users of your site. Like global variables/singletons, you should use them sparingly.

But about your idea that one session bean is enough: There is no general rule how many beans have to be in which scope. Design and develop the beans and then decide in which scope they need to be. As I said, it's very likely to have the number of beans in session scope lower than the number of beans in request scope, but if a bean has to be in session scope to work properly, you shouldn't be afraid of it.

Don't try to squeeze everything into a single session bean, just because you want to have only one bean in session scope. This would be called a God Object, which is an anti-pattern.

So for example, you have some user information (e.g. full name, status, role...) stored in a database, which you want to display on all pages when a user is logged in (like the grey bar at the top here on SO). This would be something you could implement as a session-scoped bean which is used on all of your pages (or better yet, in some header which is included on every page). This bean would be created as soon as the user logs on and fetches the information just once from the database.

In an online store, another session scoped bean could be used for storing the shopping basket of the user. Yet another session scoped bean could be used for managing a separate shopping list...

Apart from that, I would like to comment on the naming rules/style you and your team uses:

  • You should decide on one language (preferrably English) and stick to it, so no class/method/variable names like "PasswordVergessen"
  • Every class/method/variable should have a descriptive and self explaning name, so don't use somthing like "ApplicationBean1"
  • Try to organize your faces-config into blocks (separate navigation rules from bean definitions, etc.)
Simon Lehmann
"its very likely to have the number of beans in request scope lower than the number of beans in session scope" - did you mean to say this the other way around?
Mike Spross
@Mike: Of course... I changed it.
Simon Lehmann
+1  A: 

I would say that simon has answered very aptly to your question and leaves little ground to cover up. In addition to all the said things; I would just say that focus should be on OO design as that should really control the number of beans and not a rudimentary figure in head.

A tightly coupled 3 bean code is as bad as a code containing 2000 beans with no real purpose. It's the design that must guide you.

I may deviate from point; but if you'd really like to see how your beans should be controlled then read "The Thoughtworks Anthalogy" chapter "Object Calisthenics" essay written by Jeff Bay. The simple rules for programming is (Some of them even unbelieveable) :) 1. Use only one level of indentation per method 2. Don't use the else keyword 3. Wrap all primitives and String 4. Use only one dot per line 5. Don't abbreviate 6. Keep entities small 7. Don't use any classes with more than 2 instance variables 8. Use first class collection 9. Don't use any getter setter properties. (I know it won't work JSF way)

But with these rules you'll be posed with some real challenges. But you'll see that even though number of beans is huge, you have perfectly well designed code. :)

In short, I agree that you should move away from anti-pattern but most of the time one session bean is enough and it's good to have all beans with request scope. Number of beans is immaterial as long as you have well designed and flexible code. Cheers.

Priyank
Here's a direct link to the "Object Calisthenics" essay mentioned: http://www.xpteam.com/jeff/writings/objectcalisthenics.rtf
Mike Spross