Oop 关于面向对象的问题

Oop 关于面向对象的问题,oop,Oop,自从我学习面向对象编程以来,我就有过这样的问题。现在,我有一个很棒的论坛,我想问这个问题 假设我们正在使用EJB实现一个员工管理应用程序 现在,有两种方法可以做到这一点 通常,我们创建表示员工的实体(POJO)。然后我们创建一个EJB接口“EmployeeManager”,其中包含添加、删除、更新、检索和检索所有方法。这样我就可以使用“employee”实体作为数据传输对象 我们称EJB接口本身为“Employee”。实现可以称为“EmployeeImpl”,它包含字段和方法实现(添加、删除、更

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

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

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

  • 通常,我们创建表示员工的实体(POJO)。然后我们创建一个EJB接口“EmployeeManager”,其中包含添加、删除、更新、检索和检索所有方法。这样我就可以使用“employee”实体作为数据传输对象

  • 我们称EJB接口本身为“Employee”。实现可以称为“EmployeeImpl”,它包含字段和方法实现(添加、删除、更新、检索、检索所有)。如果我使用分层方法,其中我的业务逻辑需要访问员工详细信息,那么我需要传递“EmployeeImpl”(因为它包含值)

  • 你认为哪种方法更好

    我更喜欢第一个,因为它“看起来”不错,也不觉得尴尬。像

    EmployeeMgr empMgr = // JNDI lookup;
    Employee emp = new Employee();
    empMgr.add(emp);
    Employee employees[] = empMgr.retrieveAll();
    
    第二个看起来像什么(虽然我不确定)

    正如你所看到的,第二个看起来很尴尬

    我请求你们在这方面给我一些建议

    谢谢
    manju

    第一个当然更清晰,清晰应该是代码的目标。然而,就第一个问题而言,我将指导您:杰夫·阿特伍德(Jeff Atwood)将事物称为“某物管理者”(Something Manager)——这是不推荐的。

    在您的示例中,我不推荐第二个,因为它给员工类赋予了太多的责任

    虽然没有给出一个直截了当的答案,但我可以诚恳地推荐马丁·福勒的书。这对我个人来说是一个巨大的开眼界,并描述了几种不同的方法


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

    拥有一个用于持久化员工的separe类看起来更糟糕。而且更灵活,因为您可能希望使用DBEmployeeMrg、FileSystemEmployeeMrg、InMemoryEmployeeMgr和MockEmployeeMgr进行测试—所有这些类可能以不同的方式实现inteface EmployeeMrg

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

    争取适当的设计,而不是“OO合规”

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

    使用EJB的最佳实践是:

    • DataContainer类保存从DB或用户获得的数据;“波乔”
    • EJB具有在数据容器上操作的方法
    • DAO处理从数据库中持久化/检索数据容器
    EJB通常没有字段,除非它们被部署为无状态,这是很少需要的

    如果您使用的是EJB,这将是大多数人所期望的设计。它显然不是面向对象的,因为数据容器不包含真正的方法,而EJB/DAO不包含真正的数据

    这不是一件坏事;它分离了关注点,使您的系统更易更改和维护

    Employee emp = // JNDI lookup;
    emp.setName(); //set the properties
    emp.add();
    Employee employees[] = emp.retrieveAll();