2014-06-30 51 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();