1

我是德国大学的本科生。
我有一个团队编程课程 .. 我们必须使用 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 是一个 Bean
  • 我们有 3 个应用程序 Bean
  • 我只使用 1 个会话 Bean

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

4

2 回答 2

10

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

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

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

不要试图将所有内容都压缩到单个会话 bean 中,只是因为您希望会话范围内只有一个 bean。这将被称为God Object,这是一种反模式

例如,您有一些用户信息(例如全名、状态、角色...)存储在数据库中,当用户登录时,您希望在所有页面上显示这些信息(例如此处顶部的灰色条)所以)。这将是您可以将其实现为会话范围的 bean,用于所有页面(或者更好的是,在每个页面中包含的某些标题中)。只要用户登录并从数据库中获取一次信息,就会创建此 bean。

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

除此之外,我想评论一下您和您的团队使用的命名规则/样式:

  • 您应该选择一种语言(最好是英语)并坚持使用它,因此没有像“PasswordVergessen”这样的类/方法/变量名称
  • 每个类/方法/变量都应该有一个描述性和自我解释的名称,所以不要使用像“ApplicationBean1”这样的东西
  • 尝试将您的 faces-config 组织成块(将导航规则与 bean 定义分开等)
于 2009-06-22T17:33:20.487 回答
1

我想说西蒙已经非常恰当地回答了你的问题,几乎没有留下任何掩饰的余地。除了上述所有内容;我只想说重点应该放在 OO 设计上,因为它应该真正控制 bean 的数量,而不是头脑中的基本数字。

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

我可能会偏离重点;但如果你真的想看看应该如何控制你的豆子,那么请阅读 Jeff Bay 撰写的“ The Thoughtworks Anthology ”一章“Object Calisthenics”文章。编程的简单规则是(其中一些甚至令人难以置信):) 1. 每个方法只使用一级缩进 2. 不要使用 else 关键字 3. 包装所有原语和字符串 4. 每行只使用一个点 5 . 不要缩写 6. 保持小实体 7. 不要使用任何具有超过 2 个实例变量的类 8. 使用第一类集合 9. 不要使用任何 getter setter 属性。(我知道它不会以 JSF 方式工作)

但是有了这些规则,您将面临一些真正的挑战。但是您会看到,即使 bean 的数量很大,您的代码也设计得非常好。:)

简而言之,我同意您应该远离反模式,但大多数情况下一个会话 bean 就足够了,最好让所有 bean 都具有请求范围。只要您拥有设计良好且灵活的代码,bean 的数量并不重要。干杯。

于 2009-06-24T13:44:31.120 回答