2010-05-06 15 views
8

में कई से अधिक रिश्ते कई से अधिक रिश्तों को मॉडल करने का सबसे अच्छा तरीका क्या है?ओओपी

की सुविधा देता है कहते हैं कि हम एक दो वर्गों, टीम और खिलाड़ी है

  • किसी भी खिलाड़ी कई टीम रों
  • किसी भी टीम में हो सकता है के रूप में कई हो सकता है प्लेयर एस जैसे वे

मैं

  • playerX.getTeamList() तरह के तरीकों कॉल करने के लिए
  • teamY.getPlayerList() में सभी टीम रों वह/वह है की सूची प्राप्त करने टीम में सभी प्लेयर रों की सूची प्राप्त करने की तरह है

(या यह प्रभावी रूप से करने के लिए किसी अन्य तरीके से किया है)

मैं tw के बारे में सोच सकते हैं ओ ऐसा करने के तरीके, लेकिन वे सिर्फ अच्छे ओप पैटेंस की तरह महसूस नहीं करते हैं। क्या आप किसी भी अच्छे तरीके, शायद एक डिजाइन पैटन के बारे में सोच सकते हैं?

उत्तर

2

यह ठीक है, PlayerTeam और Team का संग्रह है Player का संग्रह है। क्योंकि वे "परमाणु"

3
public class Player 
{ 
    public Team[] Teams {get;set;} 
} 

public class Team 
{ 
    public Player[] Players {get;set;} 
} 

पूरी तरह से उचित नहीं हैं आप,/जोड़ने में ईमानदारी के बारे में सावधान रहना संचालन को दूर करने की जरूरत है।

+2

आप असली समस्या को देख रहे हैं, जो उनकी सामग्री को सिंक में रखने की आवश्यकता है। इसकी गारंटी देने का एक तरीका दूसरे के संदर्भ में एक को लागू करना है। – reinierpost

+0

@rein कौन कहता है कि यह "असली मुद्दा" है? हम यह नहीं बता सकते कि कोई मुद्दा क्या है जब तक कि हम नहीं जानते कि उसका आवेदन कैसे लिखा गया है। उन्होंने यह निर्दिष्ट नहीं किया कि वे मॉडल हैं (डेटा के साथ भरा हुआ तर्कहीन ड्रोन और उनके रास्ते पर भेजे गए) या संस्थाएं (कक्षाएं जिनमें समृद्ध ढांचे हैं जो आलसी लोडिंग और अन्य स्टोरेज प्रतिमानों का समर्थन करते हैं) या कुछ और। सबसे सरल मॉडल इन प्रकारों के लिए एक भंडार या किसी प्रकार की स्टोरेज परत द्वारा तत्काल किया जाना है जो टीमों और खिलाड़ियों को प्रभावित करने वाले सभी परिचालनों के लिए ज़िम्मेदार है। – Will

+1

KISS, जब तक आप नहीं कर सकते। – Will

2

एपीआई वास्तविक कार्यान्वयन से महसूस करने के लायक है।

हालांकि दोनों वर्गों के लिए इस तरह के संग्रह (जैसे * सूची *) प्राप्त करने के लिए यह समझ में आता है, उन्हें संग्रह के उदाहरण को पकड़ने की आवश्यकता नहीं है।

मेरा सुझाव है कि आप League कक्षा या कुछ समान बनाते हैं, जिसमें किसी प्रकार का निजी खिलाड़ी-टीम मैपिंग शब्दकोश होता है। टीम/प्लेयर इंस्टेंस को उन 'संग्रह' में जोड़ों को मैपिंग अपडेट करने के लिए League इंस्टेंस पर आंतरिक विधियों को कॉल करना चाहिए। इस तरह, आप परमाणु अद्यतन (एंड्री सुझाव के रूप में) और त्रुटि मुक्त रहते हैं।

0

आईएमएचओ जो आप वर्णन करते हैं वह ओओ के लिए "प्राकृतिक" तरीका है। आपका XXX.getXXXList() आपकी कक्षाओं का इंटरफ़ेस है। और कक्षाओं की एक सीमा संख्या के लिए जो सही तरीका होगा।

विचार करें कि 1000 कक्षाएं हैं जो "अंतःस्थापित" हो सकती हैं। किसी ऑब्जेक्ट में ड्रॉप करने के लिए कुछ ManyToManyManager होना दिलचस्प हो सकता है, किसी ऑब्जेक्ट की संबंधित ऑब्जेक्ट्स में एक और ऑब्जेक्ट जोड़ें और किसी अन्य को रिलीज़ की गई सभी ऑब्जेक्ट्स की सूची पुनर्प्राप्त करें। यह कुछ प्रकार के प्रतिनिधिमंडल बनाम कार्यान्वयन होगा।

अगर आप अपने कई से कई लोगों को दूसरे उदाहरण में प्रतिनिधि देते हैं तो शोर करें कि आपका ऑब्जेक्ट मॉडल अब कई से अधिक रिलेशनशिप को प्रतिबिंबित नहीं करता है।

1

विल से उत्तर सही है। हालांकि, समन्वयन से निपटने के लिए, शायद मैं ObservableCollection से शुरू करूंगा। रिश्ते का एक पक्ष "मास्टर" होना चाहिए जो दूसरी ओर जोड़/हटा देता है और सिंक्रनाइज़ेशन के साथ सौदों को ट्रैक करता है।

हालांकि, ध्यान रखें कि यदि एक वस्तु दूसरे पर घटनाओं की सदस्यता ले रही है कि यह एक मजबूत संदर्भ है जो कचरा संग्रह को रोक देगा। सबसे अधिक संभावना है कि वे एक ही समय में गुंजाइश छोड़ देंगे, इसलिए यह एक गैर-मुद्दा है लेकिन यह कुछ पता होना चाहिए।

+0

हम्म ... हमने पहले इस समस्या को कहाँ देखा है :) – LBushkin

7

खिलाड़ियों और टीमों के बीच संबंध Bipartite Graph के बीच संबंध। टिप्पणियों की अपेक्षा (और डाउनवॉट्स?)! मैं ओओडी नोब हूँ।

class MyPlayer 
    { 
     public string Name { get; set; } 

     public MyPlayer(string n) 
     { 
      Name = n; 
     } 
    } 

    class MyTeam 
    { 
     public string Name { get; set; } 

     public MyTeam(string n) 
     { 
      Name = n; 
     } 
    } 

    class PlayerTeamPair 
    { 
     public MyPlayer Player { get; set; } 
     public MyTeam Team { get; set; } 

     public PlayerTeamPair(MyPlayer p,MyTeam t) 
     { 
      Player = p; 
      Team = t; 
     } 
    } 

    class PlayerTeamBipartiteGraph 
    { 
     public List<PlayerTeamPair> Edges { get; set; } 

     public PlayerTeamBipartiteGraph() 
     { 
      Edges = new List<PlayerTeamPair>(); 
     } 

     public void AddPlayerAndTeam(MyPlayer p, MyTeam t) 
     { 
      Edges.Add(new PlayerTeamPair(p, t)); 
     } 

     public List<MyTeam> GetTeamList(MyPlayer p) 
     { 
      var teams = from e in Edges where e.Player == p select e.Team; 
      return teams.ToList<MyTeam>(); 
     } 

     public List<MyPlayer> GetPlayerList(MyTeam t) 
     { 
      var players = from e in Edges where e.Team == t select e.Player; 
      return players.ToList<MyPlayer>(); 
     } 

    } 


    class Program 
    { 
     static void Main(string[] args) 
     { 
      var G = new PlayerTeamBipartiteGraph(); 

      MyPlayer a = new MyPlayer("A"); 
      MyPlayer b = new MyPlayer("B"); 
      MyPlayer c = new MyPlayer("C"); 
      MyPlayer d = new MyPlayer("D"); 

      MyTeam t1 = new MyTeam("T1"); 
      MyTeam t2 = new MyTeam("T2"); 

      G.AddPlayerAndTeam(a, t1); 
      G.AddPlayerAndTeam(b, t1); 
      G.AddPlayerAndTeam(c, t1); 
      G.AddPlayerAndTeam(b, t2); 
      G.AddPlayerAndTeam(d, t2); 

      G.GetTeamList(b).ForEach(t => Console.Write(" {0} ",t.Name)); 
      Console.WriteLine(); 
      G.GetPlayerList(t2).ForEach(p => Console.Write(" {0} ",p.Name)); 
      Console.WriteLine(); 
     } 
    } 
1

कई से कई रिश्ते को दो-से-कई में विभाजित करें। सब कुछ बहुत आसान बनाता है।

संबंधित मुद्दे