2010-10-24 98 views
6

Q1。 在我的大學學習面向對象的建模和設計時,他們推薦考慮一個對象可以爲它的方法做些什麼,以及它的屬性有什麼責任。所有澄清的嘗試都導致了進一步的混亂。面向對象設計方法

這傾向於生成一個包含所有操作的actor和僅保存數據的內部類的類圖。

這看起來不正確。有沒有另外一種思考如何建模物體的方法? Q2302。此外,該課程似乎強調在對象之後對對象進行建模,但在域模型中不一定有意義。 IE瀏覽器。在醫療實踐中,他們有Patient: CreateAppointment(), CancelAppointment()但這不是它將如何實施(而是修改約會集合)。有沒有另外一種思考方式?

例Q1

祕書:RecordAppointment(),RecordAppointmentCancellation()

預約時間,日期,...(沒有方法)

例Q2

醫生:SeePatient()

雖然SeePatient是一個用例,它沒有任何意義上的實際類的方法。你如何看待這個?

+0

沒有硬性規定。它過分簡化所有不同的有效方法,只考慮'car.wheelCount'。例如,在約會的情況下,例如,「醫生辦公室計劃。創建約會(病人,...)」似乎更「清楚」。也就是說,我傾向於面向數據而不是「面向對象」。 – 2010-10-24 22:36:30

回答

9

不幸的是,你遇到的障礙在學術界是非常典型的。學術項目傾向於從視頻租賃商店,圖書館或學生註冊系統開始(您與醫生的辦公室不同),然後繼承與動物教授。您所提供的指導也很典型

他們建議想什麼對象可以爲其做的方法,它的職責是爲它的屬性

其實什麼時,新手會問我平時解釋一個對象的屬性是它知道的事情,它的方法就是它知道如何去做的事情。這其實只是說出你在那裏的另一種方式。正如你發現,當你開始討論更多的有形系統而不僅僅是例子時,這種思維方式很快就會崩潰。

例如指引工作得很好,與此對象:

public class Tree 
{ 
    public int Height { get; set; } 
    public void Grow(int byHowMuch) 
    { 
     Height += byHowMuch; 
    } 
} 

雖然這當然符合該法案的權利,認爲它並沒有「感覺」的權利:

public class Secretary 
{ 
    public void MakeAppoinment(Patient patient) 
    { 
     //make the appointment 
    } 
} 

所以解決方案是什麼?這是一個考慮你被教導和應用的問題。學習和理解design patterns將有助於開發比功能更強的樹,以便知道如何增長。

推薦閱讀:

爲了解決這個問題,你已經呈現我願意可能使用繼承人類和接口的組合,這些接口將通過一系列服務類來執行他們的操作。基本上,一名祕書,醫生和病人都會從人身上繼承,而這些類別中的每一類都可以傳遞給陪同的服務類別。服務類可能會或可能不會做類似SeePatient()的事情。請不要拿這個例子來表示那個人類沒有方法。

堆棧溢出比一些相關的問題,更可能是有用的:

此外,這將是很好的檢查:

最後,沒有什麼使一個面向對象的應用程序一個統一的定義。你如何應用模式,原則等將定義你的程序。事實上,你問自己這些問題表明你正處在正確的軌道上。

0

Q1 您的對象可能有責任應該被解釋爲授權或合同要求,因爲他們應該採取什麼行動?因此,爲了從您的Q2中獲取醫療示例,具有調度程序角色的對象(認爲C#/ Java接口或Obj-C協議)具有CanEditAppointments或EditsAppointments的屬性。

Q2 從用例的角度來看,一個患者可能能夠創建一個約會,這樣你就可以實現你的對象模型中的病人一起CreateAppointment()的方法。但是,就封裝而言,您可能會在CreateAppointment()中實例化一個Appointment對象,然後調用Appointment對象上的方法或設置屬性來設置其時間,日期,患者,醫師等。

而且因爲約會集合很可能是永久存儲,就像數據庫一樣,Appointment對象有責任將自己添加到集合中(Appointment.Schedule()會遍歷數據訪問層以將其自身保存到數據庫中)。

這也與您的Q1相關,因爲Appointment對象的職責是自我保存,所以它可能實現一個ISaveAppointment接口,該接口需要字段和方法來執行它。約會的責任是約會日期,時間和患者等。在保存之前,所以ISaveAppointment接口應該要求它們存在,並且Appointment.Schedule()應該驗證這些值是正確的還是先前已經過驗證。

0

你是對的,在很多情況下,有更高階的東西更自然地包含行爲,如系統或用戶。

您可以在類中將此行爲建模爲對數據模型進行操作的靜態方法。這不是面向對象,但它很好。您可以將相關的方法組合到這些類中,很快您就會體會到「服務」的概念,就像面向服務的編程一樣。

在Java中,有創建這些類的規範和標準,即EJB中的無狀態會話Bean。 Spring Framework與原型「Service」有相似的概念,它可以應用於類來標記它們作爲業務邏輯的外觀。

服務是一個組件,它在系統中封裝某個功能或行爲。它對給定的對象模型(它自己的內部模型或系統中更一般的業務對象模型)進行操作。如果你拿出你的用例並創建與他們直接相關的服務,你可以寫出非常易於維護的軟件。

DCI Architecture是這種形式化,並試圖做到這一點,但同時試圖通過在對象需要時向對象添加行爲來保持對象的方向。

0

我仍然遇到困惑:「我告訴你做別的事嗎」或「我在做別人問我的事情嗎?」?也許你所要做的就是玩芭比娃娃或者G.I. Joe的理解對象互動和責任去。 G.I.喬受傷了(或者芭比打了一個釘子),所以他打電話給博士的辦公室。 「嗨醫生,這是喬,我需要預約。」所以,你這個孩子告訴芭比去看醫生,他需要知道醫生打電話以及如何打電話 - 參考和公共的MakeAppointment()方法。博士辦公室需要將預約放在書上 - 這是自己的BookAppointment()方法,即辦公室處理預約請求的過程。

public abstract GenderAppropriateDolly { 
    protected DrOffice Drkilldare; 
    public override MakeAppointment() {throw new NotImplementedException();} 
} 


public class GIJoe : GenderAppropriateDolly { 
    DrKilldare = new DrOffice(); 
    List<Appointment> myAppointments = new List<Appointment>; 

    public void MakeAppointment() { 
     myAppointments.Add(DrKilldare.BookAppointment(this)); 
    } 
} 

public class DrOffice { 
    List<Appointment> officeAppointments = new List<Appointments>; 

    public Appointment BookAppointment(GenderAppropriateDolly forWhom) { 
     Appointment newappt = new Appointment(formWhom); 
     this.Appointments.Add(newappt); 

     return newappt; 
    }  
} 

public class Kid { 
    GenderAppropriateDolly myRoleModel = new GIJoe(); 

    // Joe got wounded so ... 
    myRoleModel.MakeAppointment(); 
}