Šta je novo?

Organizacija koda

MegaJorgovan

Poštovan
Učlanjen(a)
27.12.2017
Poruke
35
Poena
55
Pozdrav,
Potreban mi je savet. Radim jednu aplikaciju. U istoj se kreira zgrada, zgrada ima spratove, sprat ima sobe, soba ima zidove, zid ima otvore (vrata, prozore)...
Svaka soba ima temperaturu, svaki zid ima svoju orijentaciju prema strani sveta i temperaturu sobe zbog izrade nekih proracuna. Ima i druge propertie ali oni nisu bitni. Zid moze da bude zajednicki za dve sobe (moze da bude i spolji zid, al to sada nije bitno) pa tako da kada u sobi1 kreiram zid, taj isti zid treba da se kreira na sobi2 (tj sobi koja se granici sa sobom1). Prilikom kreiranja zida, ja znam sa kojom sobom se granici, posto se to odredjuje na UI-u. Sada imamo kreiran zid i nalazi se u obe sobe. Ali zid u sobi1 je npr orijentisan ka istoku (E) i ima temperaturu sobe1, a zid u sobi2 je tako orijentisan na zapad (W) i ima temperaturu sobe2. Orijentacija se gleda u odnosu na sobu u kojoj je zid. S obzirom na isti zid ima razlicite orijentacije i razlicite temperature za proracun, morao sam da napravim da su to dva razlicita zida, tacnije dva objekta sa odvojenim referencama. Nisam nista mogao da menjam prilikom postavljanja drugog zida jer bih radio sa istom referencom pa bi se promene reflektovale i na prvi zid. Dakle, to su dva zida sa razlicitim ID.
Kada se kreiraju npr vrata, kreiraju se na zidu u sobi1 (pricamo samo o sobi1 i sobi2 i jednom zidu izmedju njih), pa ista ta vrata treba da se kreiraju u sobi2 na istom, zajednickom, zidu. Problem je kada soba2 ima vise od jednog zida, pa ne znamo na koji zid je potrebno da se postave vrata. Reference postoje samo u jednom pravcu, od roditelja ka detetu. U kontra smeru nema nista, dete ne zna nista o roditelju.
Problem sam resio tako sto sam zidovima dodao po jos jedan ID, i nazvao ga PairID i oni su zajednicki za dva ista zida. Jedan zid deli dve sobe, to su u stvari dva zida u dve sobe, sa zaiednickim PairID-em. I onda kada hocu da nadjem koji je taj zid u sobi2, trazim ga preko pairId-a. I sve je to super, al onda se stvara problem kod brisanja nekog zida. Ili cele sobe. Onda moraju da se brisu svi zidovi koji imaju veze sa zidom koji se brise odnosno sobom koja se brise. Resio sam i to, al je nekako jako konfuzno.
Sve radim preko interface-a i eventa (s obzirom da nemam kontra referencu).
Da li postoji neki jednostavniji nacin da se ovo resi? Da se ne koristi pairId, a da se sve azurira kako treba? Gledao sam Mediator pattern, al on izgleda ne moze da mi resi problem.
Trudio sam se da budem sto jasniji u opisu, al ako nesto nije jasno, pisite pa cu bolje objasniti... Hvala
 
Ono što ne razumem, ako možeš proširiti i dodati pairid, što ne možeš i kontra referencu?

Ja bih to rešio tako da za svaki zid imam listu soba kojima pripada i za svaku sobu imam listu zidova. Jer možemo imati jedan zid koji se nalazi između jedne velike i recimo dve manje sobe, kao slovo E.
Takođe, treba razmotriti i da li zid treba da sadrži listu zidova koji mu pripadaju, jer jedan veći zid se može zastoja.

Drugi način, i po meni čistiji, možeš čuvati matrice pripadanja, jednu matricu koja će ti reći da zid i pripada sobi j, drugu koja će ti reći da zid i sadrži zid j.
 
jer jedan veći zid se može sastojati od više manjih.
 
Negde sam citao da nije dobra praksa raditi obostranu referencu, zato zid ne zna za sobu. Na pocetku sam tako radio, slao sam zidovima i sobama objekte, pa sam promenio.
Ako se jedna soba na jednoj strani granici sa dve sobe, onda su to dva zida, ako se granici sa tri sobe, onda su tri zida i td. Npr dugacak hodnik, ima vise soba na jednoj strani, ali sve sobe mogu da budu grejane na razlicitu temperaturu, zato se deli na vise soba.
Ono što ne razumem, ako možeš proširiti i dodati pairid, što ne možeš i kontra referencu?
Konfuzno mi je i sa pairid, zato trazim neko lepse resenje :)
 
Meni je tu najelegantniji pristup onda da imaš matricu pripadnosti soba/zid.
 
Inače obostrane reference mogu biti problematične i zato treba biti obazriv:
1. Serijalizacija ovakvih objekata nije moguća, obično se mora raditi neki custom serializer koji će odseći na nekom nivou rekurzije ispis
2. Neki ORM-ovi ih ne umeju lepo raspetljati zarad čuvanja istih u bazi
 
Nazad
Vrh Dno