Сколько бобов должно быть достаточно? - PullRequest
1 голос
/ 22 июня 2009

Я студент старших курсов немецкого университета.
У меня есть командный курс по программированию ... где мы должны использовать 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>

На самом деле:

  • Когда-либо Сайт - Боб
  • У нас есть 3 прикладных компонента
  • Я просто использую 1 Session Bean

Я думаю, они неправильно поняли цель Бобов. (Они? Или я не прав?!)
Как я могу объяснить им, что 1 Session Bean (или может быть) достаточно?

Ответы [ 2 ]

10 голосов
/ 22 июня 2009

Не похоже, что есть слишком много бобов, но, конечно, это зависит от того, что бобы делают и как они используются. Правило «один бин на представление» довольно распространено, и обычно в этом нет ничего плохого. Конечно, если вы можете написать некоторые бины, которые являются более общими и могут использоваться во многих / всех представлениях, вы, безусловно, должны это сделать, просто старайтесь, чтобы их цель была ясной и фокусировалась на одной задаче.

Тот факт, что большинство ваших bean-компонентов имеют объем запроса, это хорошо. Только бины, которые должны сохранять некоторое состояние в течение всей продолжительности пользовательского сеанса, должны быть помещены в область сеанса (отсюда и название). Это также снижает потребление памяти за сеанс. Область применения обычно используется для bean-компонентов, которые должны быть созданы один раз и используются всеми пользователями вашего сайта. Как и глобальные переменные / синглтоны, вы должны использовать их экономно.

Но о вашей идее, что одного сессионного компонента достаточно: нет общего правила, сколько компонентов должно быть в какой области видимости. Проектируйте и разрабатывайте бобы, а затем решайте, в каком объеме они должны быть. Как я уже сказал, очень вероятно, что количество компонентов в области сеанса будет меньше количества компонентов в области запроса, но если компонент должен находиться в области сеанса для правильной работы, вам не следует его бояться.

Не пытайтесь втиснуть все в один сессионный компонент, просто потому, что вы хотите иметь только один компонент в области действия сеанса. Это можно назвать Объектом Бога , который является анти-паттерном .

Так, например, у вас есть некоторая информация о пользователе (например, полное имя, статус, роль ...), хранящаяся в базе данных, которую вы хотите отображать на всех страницах, когда пользователь вошел в систему (например, серая полоса на сверху здесь, на SO). Это было бы то, что вы могли бы реализовать как сессионный компонент, который используется на всех ваших страницах (или, что еще лучше, в некотором заголовке, который включен на каждой странице). Этот компонент будет создан, как только пользователь войдет в систему и получит информацию только один раз из базы данных.

В интернет-магазине для хранения корзины покупок пользователя может использоваться другой bean-объект сессионной области. Для управления отдельным списком покупок может быть использован еще один сессионный компонент ...

Кроме того, я хотел бы прокомментировать правила / стиль именования, которые вы и ваша команда используете:

  • Вы должны выбрать один язык (предпочтительно английский) и придерживаться его, чтобы не было названий классов / методов / переменных, таких как "PasswordVergessen"
  • Каждый класс / метод / переменная должен иметь описательное и самообъяснимое имя, поэтому не используйте что-то вроде «ApplicationBean1»
  • Попробуйте организовать ваши лица-конфигурации в блоки (отделить правила навигации от определений бинов и т. Д.)
1 голос
/ 24 июня 2009

Я бы сказал, что Саймон очень удачно ответил на ваш вопрос и оставляет мало оснований для прикрытия. Помимо всего сказанного; Я бы просто сказал, что следует сосредоточиться на дизайне ОО, поскольку это должно реально контролировать количество бобов, а не элементарную фигуру в голове.

Тесно связанный код 3 bean-компонентов так же плох, как и код, содержащий 2000 bean-компонентов без реальной цели. Это дизайн, который должен направлять вас.

Я могу отклониться от точки; но если вы действительно хотите увидеть, как ваши бобы должны контролироваться, прочитайте эссе « The Thoughtworks Anthalogy », написанное Джеффом Бэй. Простые правила для программирования есть (некоторые из них даже невероятные) :) 1. Используйте только один уровень отступа для каждого метода 2. Не используйте ключевое слово else 3. Оберните все примитивы и строки 4. Используйте только одну точку в строке 5. Не сокращайте 6. Держите сущности маленькими 7. Не используйте классы с более чем 2 переменными экземпляра. 8. Используйте коллекцию первого класса 9. Не используйте какие-либо свойства метода получения. (Я знаю, что это не сработает JSF)

Но с этими правилами вы столкнетесь с некоторыми реальными проблемами. Но вы увидите, что, хотя количество bean-компонентов огромно, вы прекрасно разработали код. :)

Короче говоря, я согласен, что вам следует отойти от анти-паттерна, но в большинстве случаев достаточно одного сессионного компонента, и хорошо, чтобы все компоненты имели область запроса. Количество бобов не имеет значения, если у вас есть хорошо разработанный и гибкий код. Приветствия.

...