2013-06-13 3 views
1

Я задаюсь вопросом, как я разрабатывал свои JavaBeans. Например, у меня есть следующие:OO Design JavaBeans

Employee - basic employee information: 
    private String employee_id; 
    private String first_name; 
    private String last_name; 
    private String phone; 
    private String deptNo; 
    etc.. 

WorkflowPlayer - details about an employee in a system workflow: 
    private String workflow_instance_id; 
    private String employee_id; 
    private String role_class_id; 
    private String role_required; 
    private Employee employee; 
    private RoleClass roleClass; 

RoleClass - details of a type of role (Approver, SecurityReviewer, Originator, Instructor, Manager, etc..) 
    private String role_class_id; 
    private String name; 
    private String label; 
    private String description; 

Эти три модели также соответствуют непосредственно к таблицам базы данных (Служащий это читать только просматривать для меня, если это имеет значение)

Тогда на мой взгляд, я хотел бы сделать что-то вроде
workflow_player.employee.first_name
workflow_player.roleClass.label

приемлемым сделать работнику переменную экземпляра Является ли это? Или я должен быть вместо этого расширения WorkflowPlayer с Работником, а затем сделать
workflow_player.first_name

это имеет смысл для сотрудника, но не для roleClass.
workflow_player.description // NO!

Я просто хочу, чтобы использовать последовательную [исправить] характеристика

ответ

2

Да, это нормально, чтобы сделать Работнику переменную экземпляра, если вы имеете в виду на него из другой таблицы. Подкласс в этом случае неправильный, потому что из вашего описания это звучит так, как рабочий процесс не является специализированным видом сотрудника. Спросите себя, являются ли жизненные циклы этих объектов одинаковыми или разными, и если подкласс подменяется для суперкласса во всех ситуациях.

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

Существуют определенные шаблоны, в которых в объектно-реляционном сопоставлении используются подклассы: таблица для иерархии классов, таблица для каждого подкласса, таблица для конкретного объекта и т. Д. The Hibernate documentation describes them. Вы должны использовать наследование при сопоставлении объектов с таблицами, когда ваши таблицы попадают в один из этих шаблонов. Даже если вы не используете Hibernate, это все еще хороший пример для подражания.

+0

Прохладной, потому что это модель я применяла во всем. Однако просто уточнить. Вы говорите: «похоже, что рабочий процесс не является специализированным видом сотрудника». У меня есть класс рабочего процесса, но выше я имею в виду «workflowPlayer». workflowPlayer - это сотрудник с несколькими другими свойствами (их роль, рабочий процесс, в котором они находятся, и т. д.). Но когда я показываю этот объект в jsp, я хочу также отображать их имя, а не только их employee_id, который является PK/FK между двумя таблицами db. От этого зависит ваш ответ? – jeff

+0

@jeff: это может быть сотрудник, я не знаю. Я попытался добавить критерии для определения подкласса. –

2

Я считаю, что классы ролей - отличный дизайн, и многие разработчики не используют их. Это соответствует каноническому использованию ролевых классов: когда субъект участвует в разных действиях, и в рамках этих действий вид этого типа отличается. Хорошим примером может быть следующее. Предположим, мы моделировали расчет заработной платы. У нас есть пользователь, который является одним из сотрудников, которые платят, и администратором приложения. В Java мы должны были бы моделировать это как классы ролей, потому что у нас нет множественного наследования, но это действительно более точное представление, потому что класс ролей, если он дает какое-либо дополнительное поведение или свойства, делает это в контексте собственного поведения. Например, любые полномочия, которые необходимо предоставить администратору в платежной ведомости, ограничены этой сферой.

Это также не является ни одной из ситуаций: в платежной ведомости вы можете показать, что некоторые сотрудники также являются менеджерами. Вероятно, это было бы лучше всего сделать с наследованием, но класс ролей по-прежнему действителен, опять же, как способ представления участия.

2

Вы не можете сопоставить JavaBean напрямую с таблицами, поскольку OO - это не то же самое, что Relational (Database).

Вы можете использовать ORM, например Hibernate, чтобы правильно отобразить JavaBean для таблиц SGBD.

С точки OO зрения, бобы должны быть как то

public class Employee { 
    private String id; 

    private String firstName; 
    private String lastName; 
    private String phone; 
    private String deptNo; 
} 

public class WorkflowPlayer { 
    private String id; 

    private String roleRequired; 
    private Employee employee; 
    private Role roleClass; 
} 

public class RoleClass { 
    private String id; 

    private String name; 
    private String label; 
    private String description; 
} 
+0

Единственная разница, которую я вижу, - это усечение моего первичного ключа и переформатирование имен переменных. Это приложение, не реализующее ORM на данный момент. – jeff

Смежные вопросы