2012-12-15 17 views
7

Tôi có enum CarBrand:Làm thế nào để tổ chức chính xác cấu trúc của hai enums với mối quan hệ nhiều-nhiều giữa chúng về kiến ​​trúc và các lớp của ứng dụng?

public enum CarBrand { 
    BMW, MERCEDES, VOLKSWAGEN, AUDI, FORD, OPEL 
} 

và enum CarBodyType:

public enum CarBodyType { 
    SEDAN, MINIVAN, VAN 
} 

Mối quan hệ giữa họ là nhiều nhiều. I E. một thương hiệu xe hơi có thể có một số biến thể của loại thân xe, và một loại thân xe có một số thương hiệu.

Làm thế nào để xác định mô hình quan hệ thực thể đó trong mã của tôi với những enums này?

Có lẽ tôi cần tạo trường trong mỗi enum dưới dạng tập hợp tham số bởi một enum khác?

public enum CarBrand { 
    BMW, MERCEDES, VOLKSWAGEN, AUDI, FORD, OPEL; 

    private Set<CarBodyType> bodyTypes;   

    public Set<CarBodyType> getBodyTypes() { 
     return bodyTypes; 
    } 

    public void setBodyTypes(Set<CarBodyType> bodyTypes) { 
     this.bodyTypes = bodyTypes; 
    } 
} 

public enum CarBodyType { 
    SEDAN, MINIVAN, VAN; 

    private Set<CarBrand> brands; 

    // getter and setter 
} 

Đây có phải là một giải pháp tốt? Hoặc sẽ tốt hơn nếu thực hiện các mối quan hệ như vậy thông qua một thực thể đường giao nhau thứ ba? Nếu vậy, nó nên là gì? Thực thể này nên được thiết kế như thế nào và nó nên chứa những trường nào?

Trả lời

4

Nó gần như chắc chắn không đúng rằng một loại cơ thể "có" thương hiệu. Nó rất có thể không đúng là một thương hiệu "có một" loại cơ thể. Những gì bạn có nhiều khả năng muốn lập mô hình là một tập hợp riêng biệt của giao điểm của từng loại nội dung được phép của thương hiệu.

Đó là nhiều khả năng bạn muốn có một Vehicle trong đó có một cơ thể loại và một thương hiệu:

public class Vehicle 
{ 
    private CarBrand brand; 
    private CarBodyType body; 
    ... 
} 

và tạo Xe mỗi trong số đó mô hình một tổ hợp.

Để đối phó với những nhận xét

Ví dụ những gì về this case? Nếu Sách và Tác giả là enums.

Tôi không nghĩ rằng cuốn sách/tác giả ví dụ hoạt động cho enums (và có thể bạn sử dụng enums là trung tâm của vấn đề). Số lượng sách và tác giả được mở; bạn sẽ không mô hình sách hoặc tác giả bằng cách sử dụng một enum thiết lập kín. Hơn nữa, đúng là mọi cuốn sách đều có một hoặc nhiều tác giả, trong khi mỗi tác giả chỉ là một tác giả trong bối cảnh viết một hoặc nhiều cuốn sách (nếu không đơn giản là một người có nguyện vọng trở thành tác giả).

Trong mô hình quan hệ của cuốn sách và tác giả bạn sẽ có một bảng Book, một Author bảng và một bảng mối quan hệ riêng của BookAuthor mà là một kết hợp của các phím nước ngoài để các bảng BookAuthor. Trong thuật ngữ đối tượng, thay đổi từ "bảng" thành "đối tượng", mặc dù trong một mô hình đối tượng, bạn có thể thay thế bảng "BookAuthor" bằng một nhóm tác giả trong mỗi cuốn sách và/hoặc một bộ sách trong mỗi tác giả.

+0

@Bhesh: Ngoại trừ việc cho rằng Minivan và Van không phải là xe hơi ... Tôi đã sử dụng Xe để làm nổi bật điều này cho OP. Những gì tôi nghĩ là sai ở cấp độ đó là việc anh ta/cô ấy sử dụng 'Xe hơi'. –

+0

Cảm ơn! Đây có phải là giải pháp duy nhất không? Nó luôn luôn là cần thiết để tạo ra thực thể ngã ba thứ ba? Hay tôi chỉ chọn không phải là mẫu tốt nhất? Ví dụ về [trường hợp này] (http://en.wikipedia.org/wiki/Many-to-many_ (data_model))? Nếu 'Book' và' Author' là enums. Giải pháp của bạn có phổ biến và thực tế cho ví dụ này không? Hay nó chỉ dành cho tình huống cụ thể của tôi? –

0

Thực tiễn không tốt là phải có các phụ thuộc vòng tròn như thế này.

Nếu bạn cần giữ mối quan hệ như vậy, hãy giữ nó trong một lớp riêng biệt, tránh các vòng tròn.

0

Sau đó, lớp CarBrand của bạn có vẻ là cấu trúc phức tạp hơn mà Enum. Nó có thể vẫn là một kiểu giá trị với một số loại bản đồ sắc bên trong mặc dù:

class CarBrand { 

    static Set<CarBrand> AllBrands; //replacement for CarBrand enum 
    static Set<CarBodyType> GetTypes(CarBrand brand) { /* search this.AllBrands here */} 
    static Set<CarBrand> GetBrands(CarBodyType type) { /* search this.AllBrands here */} 

    /*specify types per brand */ 
    Set<CarBodyType> bodyTypes; 
} 

Nếu bạn muốn đi về với CarBrand enum, điều này cũng có thể được thực hiện như một cấu trúc mối quan hệ thứ ba rõ ràng. Giới thiệu lớp liên kết:

class CarBrandTypePair { 
    CarBrand, CarBodyType, 
} 

và phần còn lại phải là phần tĩnh của CarBrand mẫu ở trên.

Cách đầu tiên có thể mở rộng hơn có thể là: bạn sẽ thêm vào một số thương hiệu cụ thể trong tương lai. Với cách tiếp cận thứ hai, bạn sẽ thêm nhiều liên kết đơn giản hơn.

Các vấn đề liên quan