【问题标题】:Question about object-orientation关于面向对象的问题
【发布时间】:2008-09-22 22:36:28
【问题描述】:

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

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

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

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

  2. 我们将 EJB 接口本身称为“员工”。实现可以称为“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();

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

我请求你们给我建议。

谢谢 馒头

【问题讨论】:

    标签: oop


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      第一个肯定更清晰,清晰当然应该是您的代码的目标。但是,就第一个而言,我将指导您 here:Jeff Atwood 将事物称为“SomethingManager” - 不推荐。

      【讨论】:

        【解决方案3】:

        力求适当的设计,而不是“OO 合规性”。

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

        使用 EJB 的最佳实践是:

        • DataContainer 类保存您从数据库或用户获得的数据; “POJO”
        • EJB 具有在您的 DataContainer 上运行的方法
        • DAO 处理从数据库中持久化/检索 DataContainer。

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

        如果您使用的 EJB 将是大多数人所期望的设计。这显然不是 OO,因为 DataContainer 不包含实际方法,而 EJB/DAO 不包含实际数据。

        这不是一件坏事;它分离了关注点,使您的系统更具可变性和可维护性。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-06-18
            • 2014-07-10
            • 1970-01-01
            • 2011-07-25
            • 2011-02-01
            • 2010-10-01
            • 1970-01-01
            相关资源
            最近更新 更多