2012-03-31 39 views
8

tôi sẽ sử dụng một ví dụ để minh họa điều này:Trong lập trình hướng đối tượng mà đối tượng nên duy trì mối quan hệ nhiều đến nhiều? (Nếu có)

class Company { 

} 

class Person { 

} 

CompanyPerson tổ chức nhiều mối quan hệ. A Person có thể thuộc nhiều số CompaniesCompany có thể chứa nhiều People.

Liệu tôi có thì cần phải tạo ra một lớp thứ ba:

class CompanyPerson { 

} 

hoặc nên công ty xử lý nó:

class Company { 
    function add_person() { 

    } 
} 

hoặc có thể các Person nên?

class Person { 
    function add_to_company() { 

    } 
} 
+0

thể trùng lặp của [Mẫu mối quan hệ cha-con với Lớp học] (http://stackoverflow.com/questions/4089582/modelling- mối quan hệ cha-con-với-lớp) –

Trả lời

2

Các đặc tính chung cho một số kết hợp ngẫu nhiên của một trường hợp PersonCompany thể được mô hình sử dụng một "lớp hiệp hội".

Có một ký hiệu cho điều này trong UML và không khó để tạo khái niệm như vậy bằng ngôn ngữ lập trình có thể mở rộng.

Ý tưởng là bất kỳ cặp ngẫu nhiên nào của các đối tượng bao gồm PersonCompany đều có mối quan hệ và mối quan hệ đó chính là đối tượng. Nó không phải là Person cũng không phải Company, nhưng nội dung được liên kết với kết nối giữa một cá thể PersonCompany cụ thể.

Công cụ (thuộc tính, phương pháp) cấu thành một lớp: lớp kết hợp Person-Company.

Tôi đã thực hiện công việc này trong Lisp trước đây, với một số macro để xác định lớp kết hợp cho một cặp lớp đã cho và bảng băm yếu toàn cầu để ánh xạ cặp đối tượng đến đối tượng lớp liên kết của chúng công ty đã có thể lấy lại liên kết, và sự kết hợp đó sẽ biến mất khi những vật thể này trở thành rác thải).

Liên kết thực tế giữa các công ty cụ thể và mọi người thật dễ dàng, bằng cách sử dụng ví dụ: danh sách hoặc cấu trúc dữ liệu liên kết khác. Một đối tượng người có thể có một danh sách các công ty và ngược lại. Ý tưởng lớp liên kết giải quyết vấn đề về vị trí đặt nội dung của công ty. Ví dụ: mỗi Person có vai trò trong một số Company (giả sử). Chúng tôi không thể có biến số role trong số Person vì nó có thể có nhiều vai trò với nhiều công ty. Chúng tôi chắc chắn không thể có một role trong công ty bởi vì nó thậm chí không phải là một người; nó có những người liên kết với nó có vai trò. Vai trò có thể đi vào hiệp hội: vấn đề được giải quyết.

2

Nó hoàn toàn phụ thuộc vào tình huống sử dụng của bạn.

Nếu bạn chỉ cần tìm những người làm việc cho một công ty, hãy lưu trữ danh sách Những người trên Công ty; nếu bạn chỉ cần tìm các công ty mà mọi người làm việc để lưu trữ nó ở đó.

Sớm hay muộn bạn có thể sẽ thấy bạn cần phải mô hình hóa mối quan hệ thực tế Người < -> Công ty và bạn sẽ tạo một lớp riêng để đại diện cho điều đó. Bây giờ bạn có thể xử lý thêm các thuộc tính như ngày bắt đầu công việc, ngày kết thúc, v.v.

0

Tôi không nghĩ bạn cần lớp thứ ba.

nghĩ về những gì một ORM (Doctrin cho php, Hybernate Forn java) không:

Trong trường hợp này trên một lớp databse bạn sẽ có 3 bảng:

Company, người dùng và Company_user (tham gia bảng beetween người dùng và công ty cho biết người dùng nào thuộc về công ty nào).

Ngoài ra bạn có thể lập bản đồ tình trạng này chỉ với hai bảng db:

Company, người dùng và trong sử dụng bạn có một trỏ tham chiếu đến công ty. Vì vậy, dựa trên tham chiếu này, bạn có thể nói công ty thuộc về người dùng.

Cuối cùng trên một thiết kế lớp tôi nghĩ rằng:

  • Lớp companuy có thể giữ một mảng của người dùng (danh sách các người dùng thuộc công ty)
  • dùng Class có thể giữ một tham chiếu đến công ty (công ty các sử dụng bleongs đến)
0

này phụ thuộc vào trường hợp sử dụng, nhưng nhìn chung nhiều mối quan hệ đối tượng có thể được triển khai sử dụng một lớp tham khảo

class CompanyPersonRelationship { 
    public $company; 
    public $person; 
} 

Vì vậy, bây giờ, cả hai công ty và người có thể theo dõi những mối quan hệ lời nói dối của họ

class Company { 
    public $persons = array(); 
} 

class Person { 
    public $companies = array(); 
} 
Các vấn đề liên quan