多少豆应该够了?

时间:2009-06-22 16:51:49

标签: jsf java-ee javabeans

我是德国大学的本科学生 我有一个团队编程课程..我们必须使用JavaEE / JSF来建立一个社交网站..就像LinkedIn一样 无论如何,我的小组创造了很多豆子。恕我直言的太多了。

    <?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">
    <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>

实际上:

  • Ever Site is a Bean
  • 我们有3个应用程序豆
  • 我只使用1个会话Bean

我认为他们错过了Beans的目的。(是吗?还是我错了?!)
我怎样才能让它们清楚...... 1会话Bean是(或可能)足够吗?

2 个答案:

答案 0 :(得分:10)

它看起来不像豆子太多,但当然这取决于豆子做什么以及如何使用它们。 “每个视图一个bean”规则很常见,通常没有任何问题。当然,如果你可以编写一些更通用的bean并且可以在很多/所有视图上使用,你当然应该这样做,只是尽量保持其目的清晰并专注于单个任务。

大多数bean都是请求范围的这一事实很好。只有在用户会话的整个持续时间内必须保持某种状态的bean才应该被放入会话范围(因此名称)。这也使每会话内存消耗保持在较低水平。应用程序范围通常用于必须创建一次并由站点的所有用户使用的bean。像全局变量/单例一样,你应该谨慎使用它们。

但是关于你的想法,一个会话bean就足够了:没有一般规则,有多少bean必须在哪个范围内。设计和开发bean,然后决定他们需要在哪个范围内。正如我所说,会话范围中的bean数量很可能低于请求范围中的bean数量,但如果bean必须在会话范围内才能正常工作,那么你不应该害怕它。 / p>

不要试图将所有东西都压缩到一个会话bean中,只是因为你想在会话范围内只有一个bean。这称为God Objectanti-pattern

因此,例如,您有一些存储在数据库中的用户信息(例如全名,状态,角色......),您希望在用户登录时在所有页面上显示该信息(例如,在这里SO)。这可以作为会话范围的bean实现,它可以在您的所有页面上使用(或者更好,在每个页面上包含的某些标题中)。用户登录后立即创建此bean,并从数据库中只提取一次信息。

在在线商店中,可以使用另一个会话范围的bean来存储用户的购物篮。另一个会话范围的bean可用于管理单独的购物清单...

除此之外,我想评论一下你和你的团队使用的命名规则/风格:

  • 你应该选择一种语言(最好是英语)并坚持下去,所以没有类别/方法/变量名称如“PasswordVergessen”
  • 每个类/方法/变量都应该有一个描述性和自我解释的名称,所以不要使用像“ApplicationBean1”这样的东西
  • 尝试将faces-config组织成块(与bean定义分开的导航规则等)

答案 1 :(得分:1)

我想说西蒙已经非常恰当地回答了你的问题并且没有多少理由掩饰。除了所说的所有东西;我只想说重点应放在OO设计上,因为它应该真正控制豆子的数量,而不是头脑中的基本数字。

紧密耦合的3 bean代码与包含2000 bean的代码一样糟糕,没有任何实际用途。这是必须指导您的设计。

我可能偏离了观点;但是如果你真的想看看你的咖啡豆应该如何控制,那么请阅读杰夫湾写的“The Thoughtworks Anthalogy”章节“对象健美操”。编程的简单规则是(其中一些甚至是不可信的):) 1.每种方法仅使用一级缩进 2.不要使用else关键字 3.包装所有基元和字符串 4.每行只使用一个点 5.不要缩写 6.保持实体小 7.不要使用任何具有2个以上实例变量的类 8.使用头等集合 9.不要使用任何getter setter属性。 (我知道JSF无法正常工作)

但是根据这些规则,你会遇到一些真正的挑战。但是你会发现即使bean的数量巨大,你也可以完美地设计代码。 :)

简而言之,我同意你应该摆脱反模式,但大多数情况下,一个会话bean就足够了,所有bean都有请求范围。只要您具有设计良好且灵活的代码,bean的数量就不重要了。 欢呼声。