自从我学习面向对象编程以来,我就遇到过这些问题。现在,我想到了一个很棒的论坛。
假设我们正在使用EJB实现员工管理应用程序。
现在,有两种方法可以做到这一点。
通常,我们创建代表员工的实体(POJO)。然后我们创建一个带有add,delete,update,retrieve,retrieveAll方法的EJB接口“EmployeeManager”。这样我就可以使用'employee'实体作为数据传输对象。
我们称EJB接口为“Employee”。实现可以称为“EmployeeImpl”,它具有 fields 以及方法实现(添加,删除,更新,检索,retrieveAll)。如果我使用分层方法,我的业务逻辑需要访问员工详细信息,我需要传递'EmployeeImpl'(因为它包含值)。
您认为哪一种方式更好?
我更喜欢第一个,因为它“看起来”很好并且不会感到尴尬。像
EmployeeMgr empMgr = // JNDI lookup;
Employee emp = new Employee();
empMgr.add(emp);
Employee employees[] = empMgr.retrieveAll();
第二个看起来像(尽管我不确定),
Employee emp = // JNDI lookup;
emp.setName(); //set the properties
emp.add();
Employee employees[] = emp.retrieveAll();
如您所见,第二个看起来很尴尬。
我请求你们就此提出建议。
由于 馒头
答案 0 :(得分:3)
在你的例子中,我不建议#2,因为它给了Employee类太多的责任。
虽然没有给出直接答案,但我可以诚恳地推荐Martin Fowler的书Patterns of Enterprise Application Architecture。对我个人来说,这是一个令人大开眼界的事情,并描述了几种不同的方法。
我还认为开源Hibernate是持久化实体的绝佳工具。我相信你会在那里找到很多好的投入。
答案 1 :(得分:2)
第一个肯定更清晰,清晰度肯定是您的代码的目标。但是,就第一个而言,我会指导你here:杰夫阿特伍德把事情称为“SomethingManager” - 不推荐。
答案 2 :(得分:2)
努力进行适当的设计,而不是“OO合规”。
顺便说一下,EJB根本不是面向对象的。
使用EJB的最佳做法是:
EJB通常没有字段,除非将它们部署为无状态,这很少需要。
如果您使用的是大多数人期望的设计的EJB。它显然不是OO,因为DataContainers不包含实际方法,并且EJB / DAO不包含实际数据。
这不是一件坏事;它将问题分开,使您的系统更易于改变和维护。
答案 3 :(得分:0)
使用separare类来持久化Employee看起来更像是OO。而且更灵活,因为您可能希望使用DBEmployeeMrg,FileSystemEmployeeMrg,InMemoryEmployeeMgr和MockEmployeeMgr进行测试 - 所有这些类都可以以不同的方式实现接口EmployeeMrg。
为了缩短您的代码,您可能希望员工能够自行保存 - employee.save()而不是employeeMrg.save(员工) 当员工自行保存,更新甚至删除时,我可以理解设计,但绝对不需要一名员工通过id加载另一名员工并加载员工列表。