【问题标题】:How to structure object: OOP, composition如何构造对象:OOP、组合
【发布时间】:2014-06-30 20:45:22
【问题描述】:

我有一个对象,我们称之为请求,它与其他几个对象有关联,例如:

Employee submitter;
Employee subjectsManager;
Employee pointOfContact;

还有几个值属性,如字符串、日期和枚举。

现在,我还需要跟踪另一个对象,即主体,但这可以是 3 种不同类型的人之一。为简单起见,我们只讨论两种类型:员工和顾问。他们的数据来自不同的存储库,他们有不同的字段集,有些是重叠的。所以说一个员工有一个

String employeeName;
String employeeId;
String socialSecurityNumber;

而顾问有

String consultantName;
String socialSecurityNumber;
String phoneNumber;

一个糟糕的想法是,Request 有一个 Consultant 和一个 Employee,setSubject(Consultant) 分配一个,setSubject(Employee) 分配另一个。这听起来很糟糕。我的主要目标之一是避免“如果主题是这种类型,那么就这样做......”逻辑。

我的想法是,EmployeeRequest 和 ConsultantRequest 可能应该扩展 Request,但我不确定 setSubject 是如何工作的。我希望它是基类中的一个抽象方法,但我不知道签名是什么,因为我不知道参数是什么类型。

所以从界面的角度来看是有意义的。一个重要的接口是这些 Request 对象将被传递给我不拥有的单个 web 服务。我将不得不以一种有些复杂的方式来映射对象的字段,这在一定程度上是有意义的。对于姓名和 SSN 等字段,映射很简单,但许多未在所有类型的人中排列的字段被转储到串联的字符串 AdditionalInfo 字段 (wump wump) 中。所以他们都会有一个 getAdditionalInfo 方法、一个 getName 等,如果有任何字段不对齐,他们可以用那个做一些特殊的事情。

这让我觉得 Request 本身不一定是子类,但可以包含对 ISubjectable(或其他)的引用,该引用实现了获取通过 web 服务发送的值所需的接口。这听起来很不错,并且防止了很多“如果主题是员工,那么就这样做......”

但是,我有时仍需要访问只有特定类型主题具有的附加字段,例如在显示或编辑页面上,这样我就回到了“如果主题是员工的实例,那么转到编辑员工页面...”虽然这可能是不可避免的,如果是这样,我可以接受。

为了完整起见,我将提到“所有可能字段的联合”方法——我也不想这样做。

界面方法是最明智的还是我做错了?谢谢。

【问题讨论】:

    标签: oop inheritance composition


    【解决方案1】:

    想到一个通用的解决方案;也就是说,如果您使用的语言支持它:

    class Request<T extends Subject> {
        private T subject;
    
        public void setSubject(T subject) {
            this.subject = subject;
        }
    
        public T getSubject() {
            return subject;
        }
    }
    
    class EmployeeRequest extends Request<Employee> {
        // ...
    }
    
    class ConsultantRequest extends Request<Consultant> {
        // ...
    }
    

    您可以类似地使 setSubject 方法像您在帖子中描述的那样抽象,然后在您的子类中单独实现它。或者你甚至可能不需要继承 Request 类:

    Request<Employee> employeeRequest = new Request<>();
    employeeRequest.setSubject(/* ... */);
    // ...
    int employeeId = employeeRequest.getSubject().getEmployeeId();
    

    【讨论】:

      猜你喜欢
      • 2015-04-27
      • 2018-10-01
      • 1970-01-01
      • 2022-11-17
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 2010-09-10
      相关资源
      最近更新 更多