2010-10-24 10 views
6

Q1. Trong nghiên cứu trường đại học của tôi về mô hình hướng đối tượng và thiết kế họ khuyên bạn nên suy nghĩ về những gì một đối tượng có thể làm cho phương pháp của nó, và những gì trách nhiệm của nó là cho các thuộc tính của nó. Tất cả các nỗ lực làm rõ đã dẫn đến sự nhầm lẫn hơn nữa.Phương pháp trong thiết kế hướng đối tượng

Điều này có xu hướng tạo ra một sơ đồ lớp với các tác nhân có tất cả các hành động và các lớp bên trong chỉ chứa dữ liệu.

Điều này có vẻ không chính xác. Có cách nào khác để suy nghĩ về cách mô hình hóa các đối tượng không?

Q2. Ngoài ra, khóa học dường như nhấn mạnh mô hình hóa các đối tượng sau các đối tác trong thế giới thực của chúng, nhưng nó không nhất thiết phải có ý nghĩa trong mô hình miền. I E. Trong một thực tế y tế, họ có Patient: CreateAppointment(), CancelAppointment() nhưng đó không phải là cách nó sẽ được thực hiện (bạn sẽ thay đổi một bộ sưu tập cuộc hẹn thay thế). Có cách nào khác để suy nghĩ về điều này không?

Ví dụ Q1

Thư ký: RecordAppointment(), RecordAppointmentCancellation()

Bổ nhiệm: thời gian, ngày tháng, ... (không có phương pháp)

Ví dụ Q2

Doctor: SeePatient()

Trong khi SeePatient là một use-case, nó không có ý nghĩa đối với một phương thức trên lớp thực tế. Bạn nghĩ thế nào về cái này?

+0

Không có cách nào khó. Nó quá tầm thường hóa tất cả các phương pháp hợp lệ khác nhau để chỉ xem xét 'car.wheelCount'. Trong trường hợp nói rằng, các cuộc hẹn, có vẻ như "rõ ràng" hơn rằng người ta sẽ "bác sĩOfficeSchedule.createAppointment (bệnh nhân, ...)', ví dụ. Tức là, tôi có khuynh hướng hướng dữ liệu so với 'hướng đối tượng'. –

Trả lời

9

Thật không may, rào cản bạn đã đạt là tất cả quá điển hình trong học viện. Các dự án học thuật có xu hướng bắt đầu với các cửa hàng cho thuê video, thư viện hoặc hệ thống đăng ký học sinh (của bạn là phương sai với văn phòng của bác sĩ) và sau đó thừa kế được dạy với động vật. Phương châm bạn đã cung cấp cũng rất điển hình

họ khuyên bạn nên suy nghĩ về những gì một đối tượng có thể làm cho phương pháp của nó, và những gì trách nhiệm của mình là cho các thuộc tính của nó

Trong thực tế khi mới bắt đầu hỏi tôi thường giải thích tài sản của một đối tượng là những thứ mà nó biết về bản thân nó và các phương thức của nó là những thứ mà nó biết cách làm. Mà thực sự chỉ là một cách khác để nói chính xác những gì bạn có ở đó. Như bạn đã khám phá ra cách tư duy này nhanh chóng bị phá vỡ khi bạn bắt đầu thảo luận về các hệ thống hữu hình hơn và không chỉ là các ví dụ.

Ví dụ phương châm hoạt động khá tốt với đối tượng này:

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

Trong khi điều này chắc chắn phù hợp với hóa đơn phải của bạn nghĩ rằng nó không "cảm thấy" quyền:

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

Vì vậy, giải pháp là gì? Đó là vấn đề lấy những gì bạn đang được dạy và áp dụng nó. Học tập và hiểu biết design patterns sẽ giúp ích rất nhiều cho việc phát triển các hệ thống có chức năng hơn một cây biết cách phát triển.

Đề xuất đọc:

Để giải quyết vấn đề bạn đang được trình bày tôi sẽ có thể sử dụng kết hợp các lớp và giao diện người thừa kế, sẽ thực hiện hành động của họ thông qua một loạt các lớp dịch vụ. Về cơ bản, một thư ký, bác sĩ và bệnh nhân sẽ thừa hưởng từ con người và mỗi lớp học này có thể được chuyển đến các lớp dịch vụ kèm theo. Các lớp dịch vụ có thể hoặc không thể làm những việc như SeePatient(). Xin vui lòng không lấy ví dụ này để có nghĩa là các lớp người sẽ không có phương pháp.

Stack Overflow có nhiều hơn một vài câu hỏi có liên quan có thể được sử dụng:

Thêm vào đó, nó sẽ là tốt để kiểm tra:

Cuối cùng, không có một định nghĩa duy nhất của những gì làm cho một đối tượng ứng dụng theo định hướng. Cách bạn áp dụng các mẫu, nguyên tắc, v.v. sẽ xác định chương trình của bạn. Thực tế là bạn đang tự hỏi mình những câu hỏi này cho thấy bạn đang đi đúng hướng.

0

Q1 Trách nhiệm của đối tượng có thể được hiểu là ủy quyền hoặc yêu cầu hợp đồng, như trong những hành động mà họ nên thực hiện? Vì vậy, để lấy một ví dụ y học từ quý 2 của bạn, một đối tượng có vai trò Scheduler (nghĩ rằng giao diện C#/Java hoặc giao thức Obj-C) có các thuộc tính xung quanh CanEditAppointments hoặc EditsAppointments.

Q2 Từ góc độ trường hợp sử dụng, một bệnh nhân có thể tạo ra một cuộc hẹn, và do đó bạn có thể thực hiện một bệnh nhân trong mô hình đối tượng của bạn với một phương pháp để CreateAppointment(). Tuy nhiên, về mặt đóng gói, bạn có thể khởi tạo đối tượng cuộc hẹn trong CreateAppointment(), sau đó gọi phương thức hoặc đặt thuộc tính trên đối tượng cuộc hẹn để đặt thời gian, ngày, bệnh nhân, bác sĩ, v.v.

Và bởi vì Bộ sưu tập cuộc hẹn có khả năng lưu trữ vĩnh viễn như một cơ sở dữ liệu, nó có thể là trách nhiệm của đối tượng Bổ nhiệm vào bộ sưu tập (Appointment.Schedule() đi qua lớp truy cập dữ liệu của bạn để lưu chính nó vào cơ sở dữ liệu).

Điều đó cũng liên quan đến Q1 của bạn, trong đó trách nhiệm của đối tượng được chỉ định là lưu chính nó, vì vậy nó có thể triển khai giao diện ISaveAppointment yêu cầu các trường và phương thức thực hiện nó. Nó cũng là trách nhiệm của cuộc hẹn để có một ngày, và thời gian, và bệnh nhân, vv, trước khi được lưu, và do đó giao diện ISaveAppointment sẽ yêu cầu chúng tồn tại và Appointment.Schedule() nên xác thực các giá trị là chính xác hoặc đã được xác nhận trước đó.

0

Bạn có quyền trong nhiều trường hợp có thứ tự cao hơn, tự nhiên chứa hành vi, như hệ thống hoặc người dùng.

Bạn có thể lập mô hình hành vi này trong lớp dưới dạng phương thức tĩnh hoạt động trên mô hình dữ liệu. Nó không phải là OO, nhưng nó ổn. Bạn có thể nhóm các phương thức liên quan lại với nhau thành các lớp như vậy, và chẳng mấy chốc bạn có khái niệm về "các dịch vụ", như trong lập trình hướng dịch vụ.

Trong Java, có các đặc tả và tiêu chuẩn để tạo các lớp như vậy, cụ thể là bean phiên không trạng thái trong EJB. Khung công tác Spring có khái niệm tương tự với khuôn mẫu "Dịch vụ" có thể được áp dụng cho các lớp để gắn thẻ chúng như là mặt tiền cho logic nghiệp vụ.

Dịch vụ sau đó là một thành phần đóng gói một chức năng hoặc hành vi nhất định trong hệ thống. Nó hoạt động trên một mô hình đối tượng cụ thể (hoặc mô hình đối tượng riêng của nó, hoặc mô hình đối tượng nghiệp vụ tổng quát hơn từ hệ thống). Nếu bạn sử dụng các trường hợp sử dụng và tạo các dịch vụ liên quan trực tiếp đến chúng, bạn có thể viết phần mềm rất bảo trì.

DCI Architecture là một hình thức hóa việc này và cố gắng thực hiện tương tự, nhưng đồng thời cố gắng giữ đúng hướng đối tượng, bằng cách thêm hành vi vào đối tượng khi cần.

0

Tôi vẫn gặp phải sự nhầm lẫn: "Tôi có bảo bạn làm điều gì khác" hay "tôi đang làm điều gì đó mà người khác hỏi tôi"?

Có lẽ tất cả những gì bạn phải làm là chơi Barbie hoặc G.I. Joe hiểu sự tương tác của đối tượng và trách nhiệm đi đâu. G.I. Joe bị thương (hoặc Barbie đã phá vỡ một móng tay) vì vậy ông gọi văn phòng của Tiến sĩ. "Hey doc, đây là Joe, tôi cần một cuộc hẹn." Vì vậy, bạn, đứa trẻ, nói với Barbie để đi đến bác sĩ, những người cần phải biết doc để gọi và làm thế nào để gọi - một tham chiếu và phương pháp MakeAppointment() công cộng. Văn phòng Tiến sĩ cần phải đặt cuộc hẹn trên các cuốn sách - đó là phương thức BookAppointment() của riêng mình, đó là thủ tục của văn phòng để xử lý yêu cầu hẹn.

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(); 
}