Làm thế nào bạn có thể biết nên sử dụng Mô hình tổng hợp hoặc Cấu trúc cây, hoặc triển khai thứ ba?


14

Tôi có hai loại máy khách, loại " Người quan sát " và loại " Chủ đề ". Cả hai đều liên kết với một hệ thống phân cấp của các nhóm .

Người quan sát sẽ nhận dữ liệu (lịch) từ các nhóm mà nó được liên kết trong suốt các cấu trúc phân cấp khác nhau. Dữ liệu này được tính bằng cách kết hợp dữ liệu từ các nhóm 'cha mẹ' của nhóm đang cố gắng thu thập dữ liệu (mỗi nhóm chỉ có thể có một phụ huynh ).

Chủ thể sẽ có thể tạo dữ liệu (mà Người quan sát sẽ nhận được) trong các nhóm mà họ được liên kết. Khi dữ liệu được tạo trong một nhóm, tất cả 'trẻ em' của nhóm cũng sẽ có dữ liệu và họ có thể tạo phiên bản riêng của một khu vực cụ thể của dữ liệu , nhưng vẫn được liên kết với dữ liệu gốc được tạo (trong Việc triển khai cụ thể của tôi, dữ liệu gốc sẽ chứa (các) khoảng thời gian và tiêu đề, trong khi các nhóm con chỉ định phần còn lại của dữ liệu cho các máy thu được liên kết trực tiếp với các nhóm tương ứng của chúng).

Tuy nhiên, khi Chủ thể tạo dữ liệu, nó phải kiểm tra xem tất cả các Quan sát viên bị ảnh hưởng có bất kỳ dữ liệu nào mâu thuẫn với điều này không, có nghĩa là một hàm đệ quy rất lớn, theo như tôi có thể hiểu.

Vì vậy, tôi nghĩ rằng điều này có thể được tóm tắt với thực tế là tôi cần có một hệ thống phân cấp mà bạn có thể đi lên và xuống , và một số nơi có thể coi chúng như một tổng thể (về cơ bản là đệ quy).

Ngoài ra, tôi không chỉ nhắm đến một giải pháp hiệu quả. Tôi hy vọng tìm thấy một giải pháp tương đối dễ hiểu (ít nhất là về kiến ​​trúc) và cũng đủ linh hoạt để có thể dễ dàng nhận được chức năng bổ sung trong tương lai.

Có một mẫu thiết kế, hoặc một thực tiễn tốt để đi qua, để giải quyết vấn đề này hoặc các vấn đề phân cấp tương tự?

CHỈNH SỬA :

Đây là thiết kế tôi có: Sơ đồ lớp với các phương thức đi kèm.  Lớp "Nhóm" là hệ thống phân cấp

Lớp "Phượng hoàng" được đặt tên theo cách đó vì tôi chưa nghĩ ra một tên thích hợp nào.

Nhưng bên cạnh đó, tôi cần có khả năng ẩn các hoạt động cụ thể cho các nhà quan sát cụ thể , mặc dù chúng được gắn liền với chúng thông qua các nhóm.


Một chút lạc đề :

Cá nhân, tôi cảm thấy rằng tôi sẽ có thể cắt vấn đề này xuống những vấn đề nhỏ hơn, nhưng nó thoát khỏi tôi như thế nào. Tôi nghĩ rằng bởi vì nó liên quan đến nhiều chức năng đệ quy không liên kết với nhau và các loại khách hàng khác nhau cần nhận thông tin theo những cách khác nhau. Tôi thực sự không thể quấn đầu xung quanh nó. Nếu bất cứ ai có thể hướng dẫn tôi theo hướng làm thế nào để trở nên tốt hơn trong việc gói gọn các vấn đề phân cấp, tôi cũng rất vui khi nhận được điều đó.


Điều này nghe có vẻ như một vấn đề lý thuyết đồ thị. Vì vậy, chúng tôi có một số sơ đồ đại diện cho hệ thống phân cấp của các nhóm. Mỗi nhóm là một đỉnh trong biểu đồ. Những tính chất nào đúng? Có đúng là luôn tồn tại một đỉnh duy nhất ncó độ bằng 0 trong khi mọi đỉnh khác có độ lớn ít nhất là 1? Là mọi đỉnh được kết nối với n? Là con đường dẫn đến nduy nhất? Nếu bạn có thể liệt kê các thuộc tính của cấu trúc dữ liệu và trừu tượng hóa các hoạt động của nó thành một giao diện - một danh sách các phương thức - chúng tôi (tôi) có thể đưa ra cách triển khai cấu trúc dữ liệu nói trên.

Cảm ơn bạn đã phản hồi của bạn. Có nhiều hệ thống phân cấp của các nhóm không gắn liền với nhau, ngoại trừ thông qua Người quan sát, nhưng tôi không nghĩ chúng là một phần của các đối tượng đồ thị, chúng chỉ có một liên kết đến các đỉnh trong đó. Mỗi nhóm trong một hệ thống phân cấp chỉ có thể có 1 cha mẹ, nhưng 0 .. * con. Làm thế nào bạn sẽ thực hiện điều đó trong một biểu đồ? Và chỉ có một hệ thống phân cấp có 1 nhóm trong sẽ có mức độ bằng 0. Đối với hệ thống phân cấp 2 nhóm và lớn hơn, tất cả chúng sẽ có một mức độ bằng và ngoài ít nhất là 1. Tôi sẽ thử liệt kê các phương pháp có liên quan trong một giờ, khi tôi đang làm việc

Vì vậy, các nhóm hoạt động giống như phân lớp trong C #: Bạn có thể phân lớp một lớp cơ sở, ngoại trừ có một khu rừng (tức là các cây tách rời nhau)? Chà, nếu bạn kết nối tất cả các con trỏ / tham chiếu thì bạn hoàn toàn có một biểu đồ - bạn không cần phải làm gì khác. Tuy nhiên, điều quan trọng là nếu bạn muốn thực hiện các hoạt động một cách hiệu quả như "Hai nhóm này có cùng phân cấp không?" "Tổ tiên chung cho hai nhóm này là gì?" vv bạn cần vấn đề được phân tích một cách có hệ thống để tận dụng tất cả những điều bạn biết trước về cấu trúc.

Bây giờ tôi đã nhìn thấy sơ đồ của bạn, chính xác câu hỏi của bạn là gì - nếu đó là về phương pháp thiết kế tôi thực sự không thể giúp bạn vào thời điểm này vì bản thân tôi chưa quen với các phương pháp thiết kế khác nhau. Tuy nhiên nếu bạn đang tìm kiếm các O(n)thuật toán hiệu quả cho cấu trúc dữ liệu được xác định rõ thì tôi có thể làm việc trên đó. Tôi thấy bạn đã không đưa vào bất kỳ phương pháp đột biến nào Groupvà cấu trúc của hệ thống phân cấp. Tôi có thể giả định rằng những điều này sẽ là tĩnh?

1
@Malachi Tôi không tìm thấy câu trả lời. Thật không may, tôi không có thời gian để điều tra đầy đủ và phải chuyển sang thứ khác. Bây giờ tôi cũng không có thời gian để xem xét nó, nhưng tôi sẽ đảm bảo kiểm tra thông báo của mình mỗi lần - và nếu ai đó đưa ra câu trả lời khả thi, thì tôi sẽ chấp nhận.
Aske B.

Câu trả lời:


1

Đây là một triển khai "Nhóm" đơn giản cho phép bạn điều hướng đến Root và điều hướng cây Root đó như một bộ sưu tập.

public class Group
{
  public Group Parent
  public List<Group> Children

  public IEnumerable<Group> Parents()
  {
    Group result = this;
    while (result.Parent != null)
    {
      result = result.Parent;
      yield return result;
    }
  }
  public Group Root()
  {
    return Parents.LastOrDefault() ?? this;
  }


  public IEnumerable<Group> WalkTreeBreadthFirst(
  {
    //http://en.wikipedia.org/wiki/Breadth-first_search
    HashSet<Group> seenIt = new HashSet<Group>()
    Queue<Group> toVisit = new Queue<Group>();
    toVisit.Enqueue(this);

    while (toVisit.Any())
    {
      Group item = toVisit.Dequeue();
      if (!seenIt.Contains(item))
      {
        seenIt.Add(item);
        foreach (Group child in item.Children)
        {
          toVisit.Enqueue(child);
        }
        yield return item;
      }
    }
  }

  public static IEnumerable<Group> WalkTreeDepthFirst()
  {
    // http://en.wikipedia.org/wiki/Depth-first_search
    HashSet<Group> seenIt = new HashSet<Group>();
    Stack<Group> toVisit = new Stack<Group>();

    toVisit.Push(this);

    while (toVisit.Any())
    {
      Group item = toVisit.Pop();
      if (!seenIt.Contains(item))
      {
        seenIt.Add(item);
        foreach (Group child in item.Children.Reverse())
        {
          toVisit.Push(child);
        }
        yield return item;
      }
    }
  }
}

Vì vậy - được cung cấp một nhóm, bạn có thể đi trên cây của Nhóm đó:

Group myGroup = GetGroup();
Group root = myGroup.Root;
foreach(Group inTree in root.WalkTreeBreadthFirst())
{
  //do something with inTree Group.
}

Hy vọng của tôi khi đăng bài này, là bằng cách hiển thị cách điều hướng một cây (và xua tan sự phức tạp của nó), bạn có thể hình dung về các thao tác bạn muốn thực hiện trên cây, sau đó tự mình xem lại các mẫu để xem những gì tốt nhất áp dụng.


0

Với quan điểm hạn chế, chúng tôi có các yêu cầu sử dụng hoặc triển khai hệ thống của bạn, thật khó để quá cụ thể. Ví dụ, những điều sẽ được xem xét có thể là:

  • hệ thống có đồng thời cao không (rất nhiều người dùng)?
  • tỷ lệ đọc / ghi của truy cập dữ liệu là gì? (đọc cao, viết thấp là phổ biến)

Đối với các mẫu, v.v., tôi sẽ bớt lo lắng về những mẫu chính xác mọc lên trong giải pháp của bạn và nhiều hơn về thiết kế của giải pháp thực tế. Tôi nghĩ kiến ​​thức về các mẫu thiết kế là hữu ích, nhưng không phải là tất cả và cuối cùng: để sử dụng một sự tương tự nhà văn, các mẫu thiết kế giống như một từ điển của các cụm từ thường thấy, hơn là một từ điển các câu bạn phải viết cả một cuốn sách từ.

Sơ đồ của bạn nhìn chung ok với tôi.

Có một cơ chế bạn chưa đề cập và đó là có một số loại bộ đệm trong hệ thống phân cấp của bạn. Rõ ràng bạn phải thực hiện điều này rất cẩn thận, nhưng nó có thể cải thiện đáng kể hiệu suất của hệ thống của bạn. Đây là một cách đơn giản trên nó (caveat emptor):

Đối với mỗi nút trong hệ thống phân cấp của bạn, lưu trữ dữ liệu được kế thừa với nút đó. Làm điều này một cách lười biếng hoặc chủ động, đó là tùy thuộc vào bạn. Khi bản cập nhật được tạo cấu trúc phân cấp, bạn có thể tạo lại dữ liệu bộ đệm cho tất cả các nút bị ảnh hưởng ở đó hoặc sau đó đặt cờ 'bẩn' ở những nơi thích hợp và để dữ liệu bị ảnh hưởng được tạo lại một cách lười biếng khi cần thiết.

Tôi không biết làm thế nào phù hợp trong hệ thống của bạn, nhưng có thể đáng xem xét.

Ngoài ra, câu hỏi này về SO có thể có liên quan:

/programming/1567935/how-to-do-inherribution-modeling-in-relational-database


0

Tôi biết đây là Loại hiển nhiên nhưng dù sao tôi cũng sẽ nói, tôi nghĩ bạn nên xem qua Observer Pattern bạn đã đề cập rằng bạn có Loại Người quan sát và bạn trông giống như Mẫu Người quan sát đối với tôi.

vài liên kết:

DoFactory

thiết kế tốt

kiểm tra xem nếu không, tôi chỉ Mã hóa những gì bạn có trong Sơ đồ của bạn và sau đó sử dụng Mẫu thiết kế để đơn giản hóa nếu cần. bạn đã biết những gì cần phải xảy ra và làm thế nào để chương trình hoạt động. Viết một số Mã và xem nếu nó vẫn phù hợp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.