2014-06-30 31 views
0

我有一个对象,让我们把它的请求,有协会其他几个对象,如:如何构建对象:面向对象,组成

Employee submitter; 
Employee subjectsManager; 
Employee pointOfContact; 

而且几个值的属性,如字符串,日期和枚举。

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

String employeeName; 
String employeeId; 
String socialSecurityNumber; 

而一个咨询顾问

String consultantName; 
String socialSecurityNumber; 
String phoneNumber; 

一个可怕的想法是,要求既有顾问和员工,以及SETSUBJECT(顾问)分配一个,SETSUBJECT(员工)分配另一个。这听起来很糟糕。我的主要目标之一是避免“如果主题是这种类型,那么这么做......”的逻辑。

我的想法是,也许是EmployeeRequest和ConsultantRequest应该扩展的要求,但我不知道怎么样,比如说,SETSUBJECT会工作。我希望它是基类中的抽象方法,但我不知道签名是什么,因为我不知道参数是什么类型。

那么从界面的角度来看它是有道理的。一个重要的接口是这些Request对象将被传递给我没有的一个Web服务。我将不得不以有些复杂的方式映射对象的字段,部分有意义。对于像名称和SSN这样的字段,映射非常简单,但许多不在所有类型的人员中排队的字段都被转储到字符串AdditionalInfo字段(wump wump)中。所以他们都会有一个getAdditionalInfo方法,一个getName等,如果有任何字段不对齐,他们可以做一些特殊的事情。

因此,这让我觉得Request本身不应该被子类化,而是可能包含一个ISubjectable(或其他)的引用,这些引用实现了通过webservice发送值所需的接口。这听起来很体面,防止大量的“如果对象是雇员再这样做......”

不过,我还是会时常需要访问,只有特定类型的题目有更多的领域,例如在显示屏或编辑页面上,这样可以让我回到“如果主题是员工的实例,然后进入编辑员工页面......”,这可能是不可避免的,但如果是这样的话,我也可以。

只是为了完整性,我会提办法“所有可能的领域的联盟” - 不要以为我不在乎做一个无论是。

界面方法是最明智的还是我对它的错误?谢谢。

回答

0

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

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<Employee> employeeRequest = new Request<>(); 
employeeRequest.setSubject(/* ... */); 
// ... 
int employeeId = employeeRequest.getSubject().getEmployeeId();