Newsgroup: it.comp.java
Titolo: domanda da newbie su rmi (ma teoricamente vale anche per altri metodi di accesso remoto)

cerco di spiegare una cosa che non ho capito con un esempio:
facciamo conto di avere un programma che rappresenta una rete di 
amicizie, abbiamo un oggetto Person che ha come attributo "friends", una 
collection di oggetti Person. Ovviamente ogni singolo oggetto Person 
della collection avrà la sua lista di "friends" ecc. ecc. fino a ricoprire.
In questo caso potrebbe capitare che se attivo un singolo oggetto 
"Person" RMI è obbligato a passarmi decine, centinaia, migliaia di 
oggetti e non potrò mai saperlo in anticipo.
Ammesso che la persona sia un compagnone amico di altri compagnoni, 
inteso ;-) ma insomma spero di aver fatto capire qual è la mia perplessità.
E questa è anche una situazione piuttosto semplice... vabbe', sono 
sicuro che sbaglio qualcosa ma sono proprio newbie nell'accesso remoto :-)


Sono rincoglionito: Quale è la domanda?
M 


Si in effetti non e' la soluzione migliore secondo me se gia' sai di dover 
passare tali oggetti per via remota. Intanto vediamo se ho capito. ti preoccupa 
il fatto che una Persona ha la lista friends, all'interno della quale ci sono 
altre Persona, ognuna delle quali avra' la sua lista friends di Persone, e cosi' 
via. Io Farei cosi'. Invece di Memorizzare oggetti Persona all'interno della 
collection friends, probabilmente meomorizzerei solo un riferimento, chesso', il 
nome, grazie al quale poter risalire all'oggetto Persona corrispondente, se ne 
ho bisogno, mediante un oggetto adibito (esempio stupido, un FriendsManager che 
tra i tanti metodi avra' un "public Persona getFriend(String nome);" ).
In questo modo passerai un solo oggetto Persona con un array di stringhe, senza 
quel problema di "ricorsivita' a valanga".
Dimmi che ne pensi.
Ciao
Co

 oggetti e non potrò mai saperlo in anticipo.
Ci sono varie cose che si possono fare per far in modo che venga passato 
solo l'indispensabile (un riferimento, come diceva Konrad, ad es.). Il 
problema è che se a te da remoto serve tutta 'Persona' con i suoi amici 
e parenti, bisogna che ti vengano trasferiti tutti i dati... da qui non 
si scappa; ma è un problema generale, al di là dell'rmi o altro. Se fai 
una query sql che ti ritorna 100000 righe il problema è lo stesso...
La cosa si può risolvere 'paginando' le informazioni che arrivano (cioè 
trasferendo in blocchi) in modo da evitare il malloppone unico, ma il 
rimedio va valutato di volta in volta.
bye
DKano

 Co


si è vero che va valutata di volta in volta ma di volta in volta mi 
trovo di fronte a questo tipo di problemi e mi sembra che o non siano 
stati ancora sviluppati dei tool che risolvono questo problema in 
maniera chiara e trasparente per la programmazione ad oggetti o è la 
programmazione ad oggetti stessa che ha dei limiti nella sua 
applicazione nel mondo reale (vd. la mia risposta a Konrad).

Lemon ha scritto:





Problema tipico che normalmente ha soluzione
tipica nella "lazy initialization".
In pratica, al momento della creazione degli oggetti Person,
la corrispondente lista di "friends" viene inizializzata 
con un "segnaposto" che fa da "proxy" per l'accesso alla
lista reale dei "friends", la quale viene effettivamente 
caricata *solo* se effettivamente acceduta.
Va da se' che, se il programma si esplora tutto il grafo
delle amicizie di una Person, non c'e' cristo: prima o
poi tutti i 10000 oggetti Person vengono caricati!
Saluti
Roberto
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 oggetti, persistenza ecc.).
A me sembra un problema che puň essere risolto in maniera brillante
proprio tramite OO.
Tu definisci una interfaccia, IPersona, che definisce i metodi necessari
ad inserire ed estrarre i dati di una persona. La tua logica di business
maneggia solo tale interfaccia. Quindi implementi una classe
RemotePersona, che all'atto della costruzione memorizza solo il
riferimento scelto, ad esempio il nome, e che nei metodi di accesso agli
altri dati, la lista degli amici, interroga il server, riempie i campi
opportuni e li restituisce al chiamante. Se poi vuoi riutilizzare la
logica di business in un contesto locale, senza problemi di memoria o di
"trasporto dati", crei la classe LocalePersona che nel momento della
creazione memorizza tutti i dati necessari. L'applicazione maneggia solo
l'interfaccia, quindi diventa trasparente a dove si trovano i dati e
come si ottengono. Se un giorno decidi di utilizzare un database, crei
la classe DBPersona che implementa la giusta interfaccia e il gioco č
fatto.
Ciao