Newsgroup: it.comp.java
Titolo: oggetti: domanda banale

Mi scuso se la domanda dovesse sembrare proprio stupida,
ma ho letto un paio di libri in cui si tratta l'OOP senza però chiarirmi
alcuni dubbi...
Il dubbio maggiore l'ho riguardo alle relazioni tra oggetti, ed ancor di più
in java
non essendoci, da quanto ho capito, i puntatori come invece in C++ che
conosco meglio.
Per esempio, se io voglio rappresentare un sistema di prenotazione per
alberghi,
avrò tra gli altri questi due oggetti:
- oggetto "albergo" (nome, ubicazione, numero di camere, ecc)
- oggetto "camera" (numero di posti, accessori ecc)
Ma ovviamente un oggetto "camera" appartiene ad un ben preciso "albergo".
Come realizzo questa relazione?
Ecco le idee che mi sono venute:
- Metto in "camera" un puntatore (che in java non so come si realizzi...) ad
un oggetto di tipo "albergo", e lo
setto con un metodo del tipo "camera".setAlbergo(tipo: "albergo") ?
Se in java non esistono i puntatori, questa idea sarebbe invece valida nel
caso di C++ od è comunque concettualmente
errata?
- Metto in "albergo" un array di puntatori ad oggetti "camera" , settati con
un metodo del tipo
"albergo".addCamera(tipo: "camera"), da chiamare per tutte le "camere" di
quell' "albergo"? ? E' sostanzialmente l'opposto della soluzione
precedente...
- Faccio un oggetto a parte, che si occupa di tenere traccia delle relazioni
camere-albergo?
Una specie di vettore di puntatori... un oggetto a parte che lascia in
questo modo liberi gli oggetti "albergo" e "camera" dll'avere
metodi/proprietà che servono esclusivamente per la relazione tra loro.
Ad aggiungere confusione vi è poi il discorso sulla riusabilità del
codice... se un domani volessi riusare l'oggetto
"camera" magari per una ed una sola casa, avendoci messo il metodo
setAlbergo, questo oggetto avrà cosi un inutile metodo (a meno che non mi
inventi una classe "stanza" da usare come classe base,  la classe "camera"
eredita da "stanza" aggiungendoci quello che serve nel caso di un
albergo..., idem per la stanza di una casa)
Per favore aiuto... mi sto perdendo...
Grazie tante.. Luca

 Se in java non esistono i puntatori, [...]
Ciao Luca,
purtroppo questa non è l'unica falsa credenza diffusa su Java :-(
In realtà in Java esistono quasi esclusivamente puntatori, o meglio 
"riferimenti". Cioè ogni volta che lavori con un oggetto stai in realtà 
lavorando con un riferimento all'oggetto. Ad esempio se ho:
Object a = new Object();
Object b = a;
a e b puntano entrambi allo *stesso* oggetto. Ovvero ho due riferimenti 
diversi a un oggetto condiviso. 
PS: E già che ci sono ribadisco un'altra cosa utile: tutto in Java è sempre 
passato per valore :-)
Ciao :-)
pole
-- 
Note: Some input words use a deprecated author.
Note: Read with -deprecation to understand.

Io metterei in Albergo un array di Camere(o più.. magari uno per ogni
piano dell'albergo.. o un array di Piani..), utilizzando la classi
Vector(una delle mie prferite :-))).
Vector camere = new Vector();
Poi il metodo:
public int addCamera(Camera cam)
{
   return camere.add(cam);
}
l'int che ritorna, che è l'indice in cui è stata messa nell'array,
potrebbe benissimo essere il numero di camera , in modo da reperire quella
camera tramite un metodo:
public Camera getCamera(int numCamera)
{
   return (Camera)camere.get(numCamera);
}
Questa è un indea... la prima che mi è venuta.
IMHO, è corretto , come dici tu, non mettere all'interno della classe
Camera il riferimento all'albergo, rendondola così riutilizzabile per
altri scopi.
spero che trovi una soluzione ottimale!!
ciao
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Come realizzo questa relazione?
Una relazione esiste sempre nei due sensi. Se sia "navigabile" (che e' il 
termine tecnico per indicare che e' implementata in modo da potersi *usare* 
nei due sensi da codice) e se sia navigabile in modo piu' o meno diretto 
(cioe' passando o meno da oggetti intermedi) dipende sostanzialmente da 
quello che ci devi fare, e dal solito rapporto costi/benefici su 
performance, memory footprint e complessita'. 
Insomma, di per se' la relazione, tranne casi particolari, non "suggerisce" 
nulla - quella giusta tra le tre scelte che hai elencato (o la combinazione 
giusta) dipende dal cosa ci devi fare. Ci sono poi principi generali (tipo 
la legge di Demeter, il principio di sostituibilita', la riusabilita' per 
aggregazione piuttosto che per estensione) che guidano nelle decisioni 
operative.
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

 operative.
Hai qualche testo in italiano/inglese da consiglarmi dove si spiegano queste
tecniche?
Grazie

 queste tecniche?
http://space.tin.it/computer/csadun/articoli/biblio.html
a cui aggiungerei Thinking in Java di Eckel (che non ho letto ma e' ben 
considerato) e la sezione "Object Design" di ObjectMentor,
http://www.objectmentor.com/resources/listArticles?key=topic&topic=Object%2
0Oriented%20Design
