2012-06-27 8 views
6

Voglio sapere qual è la relazione tra un muro comune (che si trova in una stanza adiacente) e le stanze.
Come so il rapporto tra una stanza e le sue mura è Composition not Aggregation (dico bene?)che tipo di relazione c'è tra un muro comune e le stanze che si trovano accanto ad esso?

And according to the definition ofComposizionethe contained object can't be shared between twocontainers, whereas inaggregazioneit is possible.

ora sono confuso che qual è il miglior approccio di modellazione per rappresentare la relazione tra un muro comune e le stanze situate accanto ad esso?

Sarebbe molto apprezzato se si potesse fornire i vostri consigli con un po 'di codice.

| -------- | -------- |

Approch1:

(wall class ---- room class) /Composition 

Approach2:

wall class ----- room class /Aggregation 

Approch3:

abbiamo una classe muro e una classe comune della parete, classe comune della parete eredita da classe di parete

adjoining room class ---- (1) Common wall class /Aggregation 
adjoining room class ---- (6) wall class/composition 

Approach4: Sono un non sviluppatore un designer :) quindi questa è la mia idea:

class Room 
{ 
    private wall _firstwall ; 
    private wall _secondtwall; 
    private wall _thirdwall ; 
    private wall _commonwall ; 

public Room(CommonWall commonwall) 
{ 
_firstwall=new Wall(); 
_secondtwall=new Wall(); 
_thirdwall=new Wall(); 
_commonwall=commonwall; 
} 

} 

Class CommonWall:Wall 
{ 
//... 
} 

// in somewher:

static void main() 
{ 
    Wall _commonWall=new Wall(); 
    Room room1=new Room(_commonWall); 
    Room room2=new Room(_commonWall); 
    Room [] adjacentRoom =new Room[2]{room1,room2}; 
} 

Edit 1:Penso che questa sia una domanda chiara ma solo per ulteriori chiarimenti:

Il punto della domanda è scoprire quale sia il miglior schema o approccio per modellare una relazione per un oggetto che è un componente di altri due oggetti nello stesso tempo.

e sul mio esempio: cosa intendo per "stanza"? Sicuramente intendo una stanza quadrata chiusa con 4 pareti e una porta. Ma in questo caso uno di questi muri è un muro comune ed è condiviso tra due stanze adiacenti.

+1

Immagino di essere confuso. in questo scenario, una stanza può avere solo un muro comune? –

+1

Perché è davvero importante che si tratti di composizione o aggregazione? –

+1

La soluzione appropriata potrebbe dipendere da ciò che è necessario fare con i dati. C'è un RDBMS coinvolto? Metti in relazione stanze e pareti con una relazione molti-a-molti? Forse segui solo i muri e ricaverai stanze basate su serie distinte di muri. I muri comuni sono muri che appaiono in più di un set? Room.Walls; Wall.Rooms; Tieni traccia di tutte le stanze genitore a cui appartiene un muro e tutti i muri che compongono ciascuna stanza. Le stanze devono essere spazi chiusi? – ulty4life

risposta

16

La risposta alla tua domanda sulla stanza e sul muro è la risposta a questa domanda: "Il muro può esistere senza la stanza?"

Credo che il tuo scenario stia utilizzando l'aggregazione. Il muro può esistere senza la stanza? Certo che può Si potrebbe distruggere la stanza distruggendo tre muri, ma il muro rimanente si regge da solo. Penso che ora siamo giù alla semantica. Questa risposta può variare in base al modo in cui si visualizza le pareti nello scenario .

Questo link mostra un modo conciso per pensarci:

  1. A "possiede" B = Composizione: B non ha alcun significato o scopo nel sistema senza A
  2. A "usa" B = aggregazione: B esiste indipendentemente (concettualmente) da A

stessa here:

Aggregazione implica una relazione in cui il figlio può esistere indipendentemente dal genitore. Esempio: classe (genitore) e studente (bambino). Elimina la classe e gli studenti esistono ancora.

Composizione implica una relazione in cui il bambino non può esistere indipendentemente dal genitore. Esempio: casa (genitore) e stanza (bambino). Camere non esistono separato per una casa

Da wikipedia:

aggregazione differisce dal normale composizione in quanto non implica la proprietà. Nella composizione , quando l'oggetto proprietario viene distrutto, lo sono anche gli oggetti contenuti. Nell'aggregazione , questo non è necessariamente vero. Ad esempio, un'università possiede vari dipartimenti (ad esempio, chimica) e ogni dipartimento ha un numero di professori. Se l'università si chiude, i dipartimenti non esisteranno più, ma i professori di tali dipartimenti continueranno ad esistere. Pertanto, un'università può essere vista come una composizione di dipartimenti, mentre i dipartimenti hanno una aggregazione di professori. Inoltre, un professore potrebbe lavorare in più di un dipartimento, ma un dipartimento non potrebbe far parte di più di un'università.

+0

Buona risposta, +1. –

+0

Penso di conoscere i concetti che hai menzionato, ma basandomi su This Concepts è difficile prendere una buona decisione per la modellazione di un problema del genere, penso che ci siano così tanti paradossi qui, se distruggi o cancelli l'intero oggetto (intendo il Room) il muro non esisterà più, in effetti non ha senso quindi la relazione potrebbe essere Composition da questo punto di vista, d'altro canto, in questo esempio possiamo vedere che c'è una istanza Common nella parte part che è condivisa tra due interi oggetti, e per quanto ne so, questo non è permesso nella composizione, quindi quale opzione è corretta da scegliere? – siamak

+0

@siamak Credo che il tuo scenario stia usando l'aggregazione. Il muro può esistere senza la stanza? Certo che può Si potrebbe distruggere la stanza distruggendo tre muri, ma il muro rimanente si regge da solo. Penso che ora siamo giù alla semantica. Questa risposta può cambiare a seconda di come * tu * vedi i muri nello * scenario * tuo. –

1

Dipende. Ci sono sempre due lati di un muro. ;-)

In questo tipo di scenario, utilizzerei l'iniezione di proprietà o l'iniezione del costruttore, ad es.

public class Room 
{ 
    public List<Wall> Walls { get; set; } 
    public Room (IEnumerable<Wall> walls) 
    { 
     Walls = new List<Wall>(walls); 
    } 
} 

e quindi utilizzare un modello creazionale come ad esempio un builder pattern per costruire le camere con pareti in comune.

1

Il modo in cui gestisci Room and Walls dipende dal compito da svolgere.

Illustrerò questo con due esempi e quindi tornerò a dare la mia risposta al "punto" effettivo della domanda.

Primo approccio (la percorrenza di una Building 1 storia):

Obiettivo: Voglio raccontare un robot a muoversi dalla posizione corrente alla Camera Copia.

Determinare le dimensioni dell'edificio, ad esempio 100 piedi, per 100 piedi. Scegliere un asse e creare una griglia di punti. Il robot può iniziare in posizione (50,50). Successivamente, creo un Graph in cui ogni lato rappresenta un passaggio verso Nord, Est, Sud o Ovest da quel nodo al nodo corrispondente. I nodi separati da un muro hanno un peso infinito, cioè non possono essere attraversati.

Il grafico è rappresentato in un elenco di adiacenza.

Ora definisco una stanza per essere un poligono ed elencare le sue vertici. Per verificare se il robot è nella stanza, deve essere all'interno dell'area definita dal poligono della stanza. In questo caso le stanze si possono sovrapporre, soprattutto perché nella vita reale in piedi sulla porta potrebbe significare che sei in una delle due stanze.

Il mio robot ora può navigare nell'edificio, spostare mobili e qualsiasi altra cosa voglia fare.

Secondo approccio: (Object Oriented)

  • costruzione Coordinate
    • Proprietà
      • larghezza, lunghezza, altezza, Geo-Spacial, Età, ecc
    • OuterWalls
      • potrebbe essere BrickWall, GlassWall, C oncreteWall, ecc ereditato da OuterWall
      • Proprietà: posizione, spessore, ecc
      • Metodi: DemolishWall(), PaintExterior (Colore C), ecc
    • InteriorWall
      • Può essere NorthSouthWall o EastWestWall.
      • Proprietà: hasDoorway, N/E colore, S/W colore, ecc
    • Camera
      • Proprietà: Nome, Luogo, larghezza, lunghezza, ecc

Si noti che in nessuno di questi esempi le camere si riferiscono direttamente alle loro pareti.

Ora al punto effettivo della tua domanda. Se due oggetti hanno una risorsa condivisa come dovrebbe essere presa in considerazione.

La programmazione parallela riguarda le risorse condivise in vari modi.

  1. Assegnare a ciascun oggetto un riferimento alla risorsa condivisa, assicurarsi di sincronizzare o altrimenti gestire il comportamento concorrente sulla risorsa condivisa.
  2. Rendere la risorsa condivisa disponibile per ogni oggetto come variabile globale o tramite un oggetto singleton o una risorsa statica in un'altra classe o anche una posizione specifica nella memoria o nel file system.
  3. Passa la risorsa condivisa tra le parti simultanee in un ordine predefinito o in orari predefiniti.

Immaginate un hotel con un bagno in comune tra ogni due stanze:

HotelGuest A = new HotelGuest(new BusinessMan()); 
HotelGuest B = new HotelGuest(new Programmer()); 

A.Room = 101; 
A.Bathroom = 7; 
A.BathroomKey = getBathroomKey(7); 

B.Room = 102; 
B.Bathroom = 7; 
B.BathroomKey = getBathroomKey(7); 

//Asynchronously 
A.RunDoBusinessStuff(); 
B.RunProgrammerStuff(); 

//but each has to lock bathroom7 when they use it, or it could be embarrassing. 

Ma nell'esempio di cui sopra, come fa il bagno sapere quali due ospiti dell'hotel hanno la sua chiave?

  1. creare un database con gli ospiti correnti e le chiavi che hanno e il bagno può interrogare il database (o l'elenco).
  2. riferimenti di magazzino a A e B nelle proprietà del bagno. (immagina una lavagna nel bagno che elenca i suoi "inquilini").
2

C'è un rapporto di molti a molti tra Room e Wall. (una parete può essere usata in due stanze e una stanza può avere molte pareti

Invece di avere una classe come "CommonWall", suggerirei di risolverlo a molti con l'oggetto Mapping e due relazioni 1-Many.

public class Room 
{ 
public List<Wall> Walls{get;set;} 

} 

public class Wall 
{ 
decimal length; 
decimal width; 
public List<Room> Rooms{get;set;} 
} 

public class RoomWallMapping 
{ 
public int MappingID; 
public Wall {get;set;} 
public Room{get;set;} 
} 
2

Bob Horn fatto un punto qui, quando un muro può esistere indipendentemente dalla stanza deve essere un'aggregazione.

Ma ricordate che si modella come si desidera vedere/manipolarli, così puoi anche decidere che ti interessi principalmente per le tue stanze e vedere le pareti come un effetto collaterale della stanza, allora questa è una composizione.

modello di aggregazione

È costruire il muro e che definisce i vani, la vostra camera è il giusto spazio tra le pareti.

Pensando in questo modo, la camera non ha bisogno di avere 4 pareti, è solo un insieme arbitrario di pareti: una stanza aperta può avere 3 pareti e un L forme camera chiusa può avere 6.

Questo è il rappresentazione che un architetto o un costruttore adotteranno.

Composizione modello

Volete vedere una stanza come uno spazio con pareti, allora ciò che veramente interessa è la vista della parete dal lato interno della stanza. In quel caso non fai la macchina se l'altra stanza ha un muro comune, quando distruggi la tua stanza, il lato interno del muro scompare con esso.

Un muro condiviso diventa un'aggregazione di due pareti della stanza.

Questa potrebbe essere la rappresentazione corretta se state pianificando una mostra e volete definire dove saranno collocati i dipinti.

modello ciò che meglio si adatta alle tue esigenze

Alla fine si modellare una rappresentazione, e quindi una semplificazione. Allo stesso modo non c'è corretto o migliore risposta quando si modella la rappresentazione, si dovrebbe modellare la vostra rappresentazione dopo le vostre esigenze.

Se si desidera acquistare un'auto, si tende a definire il libro come composto dalle sue pagine, quando lo si smaltisce si dispongono tutte le pagine. Se si desidera stampare un libro si tende a pezzi di ricambio come aggregati di fogli composti da pagine, se un folio è stampato male si può prendere un altro dallo stock da assemblare al libro finale.

1

Se si trattava di qualcosa che si avvicinava a un problema reale, non penso che avrei voluto comporre la Stanza da Plain Walls. È più probabile che io abbia una collezione di RoomComponents o IRoomComponents che verrebbero iniettati usando l'iniezione del costruttore o l'iniezione di proprietà. Esiste anche la possibilità di utilizzare la struttura di iniezione per comporre la stanza, in modo che la struttura si occupi della vita degli oggetti.

Se per un secondo immagino che il problema fosse davvero così semplice che c'erano solo Room e Walls, allora immagino che il tuo approccio # 4 assomigli alla strada da seguire. Non sono sicuro di quale sarebbe il nome corretto in questo caso, poiché è presente sia l'aggregazione che la composizione. Un altro modo è di impostare il muro comune come proprietà (iniezione di proprietà come menzionato sopra), invece di passare attraverso il costruttore.

E infine se vado nel mondo fantasy come altri in questo thread, allora vengo presto a realizzare che tutte le tue mura dovrebbero essere muri comuni! Di 'a qualcuno di costruire altre tre mura attorno a una delle pareti di una stanza esistente -> bam hai una nuova stanza, e un nuovo muro comune. Cosa fare adesso? Probabilmente vorrai cambiare il muro esistente in un nuovo CommonWall giusto? Quindi sembra inevitabile avere muri come proprietà in questo caso, altrimenti ogni volta che deciderai di costruire una stanza vicina, dovresti ricreare tutte le stanze vicine.