关于面向对象的问题

时间:2008-09-22 22:36:29

标签: oop

自从我学习面向对象编程以来,我就遇到过这些问题。现在,我想到了一个很棒的论坛。

假设我们正在使用EJB实现员工管理应用程序。

现在,有两种方法可以做到这一点。

  1. 通常,我们创建代表员工的实体(POJO)。然后我们创建一个带有add,delete,update,retrieve,retrieveAll方法的EJB接口“EmployeeManager”。这样我就可以使用'employee'实体作为数据传输对象。

  2. 我们称EJB接口为“Employee”。实现可以称为“EmployeeImpl”,它具有 fields 以及方法实现(添加,删除,更新,检索,retrieveAll)。如果我使用分层方法,我的业务逻辑需要访问员工详细信息,我需要传递'EmployeeImpl'(因为它包含值)。

  3. 您认为哪一种方式更好?

    我更喜欢第一个,因为它“看起来”很好并且不会感到尴尬。像

    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();
    

    如您所见,第二个看起来很尴尬。

    我请求你们就此提出建议。

    由于 馒头

4 个答案:

答案 0 :(得分:3)

在你的例子中,我不建议#2,因为它给了Employee类太多的责任。

虽然没有给出直接答案,但我可以诚恳地推荐Martin Fowler的书Patterns of Enterprise Application Architecture。对我个人来说,这是一个令人大开眼界的事情,并描述了几种不同的方法。

我还认为开源Hibernate是持久化实体的绝佳工具。我相信你会在那里找到很多好的投入。

答案 1 :(得分:2)

第一个肯定更清晰,清晰度肯定是您的代码的目标。但是,就第一个而言,我会指导你here:杰夫阿特伍德把事情称为“SomethingManager” - 不推荐。

答案 2 :(得分:2)

努力进行适当的设计,而不是“OO合规”。

顺便说一下,EJB根本不是面向对象的。

使用EJB的最佳做法是:

  • DataContainer类包含您从数据库或用户获得的数据; “的POJOs”
  • EJB具有对DataContainers进行操作的方法
  • DAO处理从数据库中持久化/检索DataContainer。

EJB通常没有字段,除非将它们部署为无状态,这很少需要。

如果您使用的是大多数人期望的设计的EJB。它显然不是OO,因为DataContainers不包含实际方法,并且EJB / DAO不包含实际数据。

这不是一件坏事;它将问题分开,使您的系统更易于改变和维护。

答案 3 :(得分:0)

使用separare类来持久化Employee看起来更像是OO。而且更灵活,因为您可能希望使用DBEmployeeMrg,FileSystemEmployeeMrg,InMemoryEmployeeMgr和MockEmployeeMgr进行测试 - 所有这些类都可以以不同的方式实现接口EmployeeMrg。

为了缩短您的代码,您可能希望员工能够自行保存 - employee.save()而不是employeeMrg.save(员工) 当员工自行保存,更新甚至删除时,我可以理解设计,但绝对不需要一名员工通过id加载另一名员工并加载员工列表。