2009-02-28 12 views
5

Giả sử tôi phải lập mô hình các bữa ăn của một quán ăn.Làm cách nào để mô hình hóa các mối quan hệ vai trò phức tạp mà chỉ một số nhóm thực thể nhất định có thể tham gia vào vai trò?

Một bữa ăn có thể bao gồm một số "thành phần":

  1. (Fries OR gạo HOẶC nêm)
  2. AND (Một trong sáu nước giải khát khác nhau)
  3. AND (Một hoặc hai trong số bảy khác nhau nước sốt HOẶC không có gì cả)

bữa ăn khác có thể bao gồm:

    .210
  1. (Salad OR gạo)
  2. AND (tỏi OR không tỏi)

bữa ăn tiếp theo có thể bao gồm:

  1. Chỉ cần khoai tây chiên

  2. Chỉ cần một thức uống

  3. Chỉ cần ...

Tôi làm cách nào để tạo mô hình này? (UML, thực thể-mối quan hệ, mã, ... bất cứ điều gì bạn có thể giải thích tốt nhất)

Có lẽ nó giúp nếu bạn biết một số công việc tôi muốn thực hiện, vì vậy:

  • Cho phép khách hàng để lựa chọn một bữa ăn đầu tiên và hiển thị tất cả "tiện ích bổ sung" còn lại.
  • Phát hiện bữa ăn từ danh sách các thành phần. Ví dụ, nếu khách hàng đặt hàng khoai tây chiên, nước sốt và đồ uống, có thể phát hiện bữa ăn từ ví dụ đầu tiên.

Tôi đã nghĩ về việc chia tất cả các thành phần thành bài viết rồi thêm một số loại ánh xạ vai trò để đánh dấu "khoai tây chiên" làm thực phẩm bổ sung cho "cheeseburger", "schnitzel", "..." làm thế nào tôi có thể mô hình nhiều add-ons, tùy chọn add-ons, n-out-of-m add-ons ...

tôi hy vọng bạn có thể giúp tôi ra ...

Trả lời

1

Nếu đây là bài tập về nhà, nó có thể không quan trọng ... Nhưng - nếu điều này sẽ được sử dụng trong một ứng dụng trong thế giới thực, tôi khuyên bạn không nên sử dụng các lớp cụ thể cho từng mục thực phẩm. Coke class, Salad class, Rice class, vv như đã đề nghị ở trên. Đây là cách chắc chắn để làm cho ứng dụng của bạn không linh hoạt.

Sẽ tốt hơn nhiều để có một lớp mặt hàng thực phẩm và một lớp uống với một tài sản hoặc tên một số ví dụ ..

Hãy tưởng tượng cần phải xây dựng lại toàn bộ ứng dụng của bạn chỉ vì bây giờ có một mới mục đặc biệt hoặc thực phẩm ... không mát mẻ ;).

Tôi nghĩ những gì còn thiếu trong các câu trả lời khác là ý tưởng của một nhóm. Mỗi mục thực phẩm có thể thuộc về một nhóm cùng với các vật phẩm khác, hoặc tự nó.

Nói khoai tây chiên, gạo và nêm thuộc nhóm A. Đồ uống thuộc nhóm B. Sau đó, bạn có thể tạo mô hình kết hợp làm danh sách nhóm - ví dụ: 1 nhóm Mục A và 1 mục nhóm B hoặc hai mục A nhóm và 1 mục nhóm B.

Bạn cũng có thể làm cho các mặt hàng thực phẩm có thể thuộc về nhiều nhóm cùng một lúc ... để làm cho các tùy chọn linh hoạt hơn.

Mô hình db có thể phức tạp xác định tất cả các mối quan hệ, nhưng tôi nghĩ điều đó là cần thiết.

Có lẽ một cái gì đó như thế này:

group(id, name, desc) - nhóm như mục - món khai vị, món khai vị, đồ uống ... hoặc bất cứ điều gì

foodItem(id, name, desc) - đại diện cho một mặt hàng duy nhất - khoai tây chiên, gạo, vv

foodItem_group(foodIgem_Id, group_Id) - ánh xạ các mặt hàng thực phẩm cho nhóm của họ - nhiều người đến số

combo(id, name, desc) - mô tả một combo

combo_group(combo_Id, group_Id) - bản đồ nhóm để combo - nhiều nhiều

Tôi nghĩ rằng điều này sẽ làm cho đại diện cho mô hình theo yêu cầu cơ bản - bạn có thể muốn bàn thêm để lưu trữ những gì khách hàng thực sự ra lệnh .. và dĩ nhiên phát hiện nếu một khách hàng thứ tự khớp với một combo được để lại cho logic kinh doanh của bạn.

+0

Tôi có xu hướng đồng ý.(Và nó không phải là bài tập về nhà :)) –

+0

thêm một chút .. hy vọng hữu ích. – markt

0

tôi giả định này sẽ cuối cùng được lưu trữ trong cơ sở dữ liệu. Tôi đề nghị để tạo ra hai bảng:

  1. sẽ lưu trữ các thành phần (khoai tây chiên, salad, tỏi, vv)
  2. Sẽ có: id1, id2, mối quan hệ. Mối quan hệ con người:
    • thuộc về
    • đi với

Dựa trên "thuộc về" mối quan hệ, bạn có thể tìm thấy nếu tất cả các thành phần thuộc về một bữa ăn nhất định.Có lẽ sau đó đi và chọn tất cả các thành phần thuộc về bữa ăn đó và đề nghị bữa ăn nếu các thành phần được chọn tạo nên 50% hoặc nhiều hơn của bữa ăn.

Dựa trên mối quan hệ "đi với", bạn có thể đề xuất các tiện ích bổ sung cho bữa ăn hoặc cho các thành phần được chọn.

+0

Làm cách nào để xác định, ví dụ: ít nhất trên ba thành phần phải đi kèm với bữa ăn? –

1
  1. Nó có vẻ như một trật tự có thể bao gồm cả bữa ăn, thành phần, hoặc kết hợp cả hai, vì vậy tôi sẽ nói, có một lớp Order mà có một danh sách các Component s và Meal s. Meal hoặc là phân lớp Component hoặc chúng sẽ triển khai cùng một giao diện.
  2. A Meal bao gồm một số "vị trí" có thể được điền bởi một số bộ Component s. Meal s nên biết số lượng vị trí của chúng và những gì Component có thể lấp đầy chúng.
  3. "Phát hiện một Meal từ danh sách câu hỏi Component s" rất khó. Trên đỉnh đầu của tôi, cách tốt nhất tôi có thể nghĩ là đưa ra Meal một phương thức lấy danh sách Component s và trả về true nếu Meal có thể được tạo từ chúng (hoặc có thể là tập con của Component s sẽ tạo thành rằng Meal). Order sẽ đi qua danh sách các Meal s nó biết và xem nếu bất kỳ trong số họ có thể được thực hiện từ Component s trong Order hiện tại. Có thể có một cách tốt hơn để làm điều này, mặc dù.

Hy vọng điều này sẽ hữu ích!

+0

Cảm ơn bạn đã trả lời của bạn, nhưng theo như tôi hiểu theo (2.) bạn dường như chỉ cần rephrase yêu cầu ban đầu của tôi :) Có lẽ bạn có thể xây dựng. –

+0

Có một phần cụ thể nào mà bạn đang bối rối không, tôi có thể giải thích rõ hơn không? –

+0

Tôi nghĩ Amanda đang đi đúng hướng. Những điều khác cần cân nhắc: sử dụng giao diện iMeal và sau đó là "các loại" bữa ăn cụ thể, ví dụ: Bữa trưa thực hiện iMeal nhưng chỉ cho phép hai bên, Dinner thực hiện iMeal và cho phép ba bên. –

1

Tạo Thành phần lớp và sublcasses (hoặc đối tượng) cho tất cả các loại thành phần có thể có.

Tạo tóm tắt Bữa ăn lớp và lớp con cho tất cả các loại Bữa ăn có thể có. Một bữa ăn có thể kiểm tra, cho dù một danh sách nhất định của các thành phần phù hợp với nó (để phát hiện một bữa ăn từ một danh sách các thành phần). Và một bữa ăn có thể giới thiệu cho khách hàng tất cả các lựa chọn của các thành phần cho bữa ăn này.

Tôi đồng ý với Amanda rằng Bữa ăn phải được tạo cho "Slots". Mỗi vị trí đại diện cho một trong các lựa chọn Thành phần của Bữa ăn, ví dụ: Khoai tây chiên HOẶC gạo HOẶC nêm. Khe cắm cũng có thể mô hình hóa tùy chọn m-outof-n.

Lớp Meal:

class Meal 
{ 
    class MealSlot 
    { 
     Add(Component); 
     bool DoesItMatch(vector<Component> ComponentsVector) 
     { 
      //Check if this Slot is filled by some element(s) 
      // of ComponentsVector 
     } 
     PrintSlotOptions(); 
     vector<Component> Options; 

     // for m-of-n option, if multiple items can be chosen in this slot 
     int HowManyNeededToFillIt; 
    }; 

    bool DoesItMatch(vector<Component> ComponentsVector) 
    { 
     //Check if all Slots are filled by ComponentsVector elements, 
     //using Slot::DoesItMatch function 
    } 
    void PresentChoices() 
    { 
     for(i=0; i < Slots.size(); i++) 
      Slots[i].PrintSlotOptions; 
    } 
    vector<Slot> Slots; 
}; 

Một trong những bữa ăn bê tông: (Salad OR gạo) AND (tỏi OR không tỏi)

class MealType2 : public Meal 
{ 
    MealType2() 
    { 
     Slots[0].Add(Salad); 
     Slots[0].Add(Rice); 
     Slots[1].Add(Garlic); 
     Slots[1].Add(NOTHING); 
    }  
}; 

Tạo Lệnh lớp đó sẽ chứa một Meal tên và danh sách các thành phần. Nếu một bữa ăn được đặt hàng, hãy gọi Meal.PresentChoices(). Và nếu một danh sách các thành phần được đưa ra, đi qua tất cả các bữa ăn và gọi Meal.DoesItMatch.

+0

Tôi làm cách nào để tạo mô hình "các thành phần khác ngoài"? –

+0

đã cập nhật câu trả lời, xem bên trong –

0

có vẻ như bữa ăn của bạn có thể gần như bất kỳ bộ sưu tập các mặt hàng thực phẩm nào, vì vậy hãy bắt đầu với một lớp cơ sở trừu tượng (hoặc giao diện) cho một Thực phẩm. tạo nhiều lớp con bê tông, một cho mỗi loại thực phẩm: than cốc, trà, bít tết, thịt gà, khoai tây, gạo, mì ống, súp, salad, v.v.

làm cho các thành phần của bạn giao diện: món khai vị, bữa tối, protein, tinh bột, món tráng miệng, đồ uống, v.v.

cấu trúc lại các lớp bê tông của bạn thành bất kỳ thứ bậc nào mà chúng có vẻ muốn đi vào khi bạn viết mã và kiểm tra.

rắc trong giao diện thành phần nơi chúng có ý nghĩa.