Newsgroup: it.comp.java
Titolo: Com'è il mio stile? ;-)

Visto che sono alla prima applicazione Java (e OO) seria, vorrei
sapere se la soluzione che ho scelto č valida o se ne esistono di
migliori: quando devo tornare da un metodo una certa serie di valori
(disomogenei) non mi va di fare una classe apposta, cosě metto tutto
in un un array (o un vettore) e lo passo come valore di ritorno. Fa
schifo?
--
Bye,
  Dario
ICQ: 
http://wwp.mirabilis.com/11871099
Remove anti-spam from e-mail address

Visto che sono alla prima applicazione Java (e OO) seria, vorrei
direi che ti conviene passare un oggetto che continiene tutte le
informazioni del caso.
Ciao.
    glfp

 schifo?
Abbastanza. :) LOL Come dice il buon Booch, non abbiate paura di definire classi.. un po' biblico, ma vero! :)
PS Se sono disomogenei usi per forza un Vector, o ho capito male?
Saluti,
	Cris
-- 
Cristiano Sadun
Software Engineering & Consulting
email: crsadun#tin$it
(please substitute # by @ and $ by .)

informazioni del caso.
Volendo usare un oggetto completo, posso utilizzare una roba del tipo
return new ClasseDaPassare() { }
?
Cioč creare al volo la classe? Mi pare di no, ma magari mi sfugge
qualcosa.


PS Se sono disomogenei usi per forza un Vector?
Si (o qualche altra struttura non omogenea).


 qualcosa.
Puoi farlo senza problemi. 
Saluti,
	Cris

 più fantasia per i nomi! :)
Eheh, un progetto mediumsize arriva senza problemi alle centinaia.. ;-)
Saluti,
	Cris

schifo?
Se arrivi a porti una domanda di questo genere vuol dire che hai avuto
qualche problema di design o di analisi. Nel tuo caso sembrerebbe che tu
stia usando Java per scrivere un programma in stile procedurale e non
object oriented.
Mi spiego ... quando scrivi un software secondo i dettami object oriented
difficilmente avrai dei metodi che ritornano una serie di valori
disomogenei,
al massimo avrai dei metodi che ricevendo come parametro un oggetto attivano
certi suoi comportamenti complessi.
Il fatto di proporre la creazione di una classe atta solo a contenere valori
disomogenei ritornati da un metodo é sicuramente scorretto. Tale classe
molto probabimente non modellerebbe alcun elemento del business che
tu vai ad implementare, aumentando inutilmente la complessitá del software.
L'unico caso in cui un dubbio come il tuo, puó essere parzialmente lecito,
si ha quando si sta creando delle classi di wrapping per qualcosa che non
é object oriented di per se (per esempio una copy cobol o un file header C),
ma anche in questo caso utilizzando adeguati patterns si puó arrivare ad un
design decente.
Ritengo comunque fondamentale che un Analista/Designer/Programmatore si
ponga molto spesso il tipo di domanda che tu ti sei fatto, molti
sviluppatori,
soprattutto quelli con anni di esperienza in linguaggi funzionali, tendono a
scrivere codice a testa bassa, utilizzando un numero di classi elevato solo
per
fare il giochetto che tu proponevi (o peggio) aumentando a dismisura la
complessitá del codice.
Danilo Massa
IBM VisualAge for Smalltalk Associate Developer
IBM VisualAge for C++ Associate Developer

Puoi farlo senza problemi. 
E la metto come valore di ritorno senza problemi? Nell'altra classe,
come faccio a fargli vedere questa nuova classe?
Grazie!


Eheh, un progetto mediumsize arriva senza problemi alle centinaia.. ;-)
Temo che le supererò! Sono solo al nocciolo e un po' di interfaccia
per il testing. Manca ancora tutta la parte di rete.


ponga molto spesso il tipo di domanda che tu ti sei fatto
Meno male che una cosa buona l'ho fatta! ;-)
Grazie per i consigli.


 classe pubblica che fa da contenitore per le altre.
Il problema in questa soluzione sta in genere nel fatto che si impone
una costrizione non solo sul tipo di istanze contenute nel Vector
(cosa correttissima) ma anche sul significato che esse assumono
in base alla posizione "rompendo l'incapsulamento" dell'oggetto Vector.
Comunque se questa operazione (riassumere dei dati da due classi etc.)
ti serve vuol dire che un suo significato di business ce l'ha o al massimo
ha una utilità per il design che stai realizzando. Pensaci solo un attimo e
vedi se questa classe di utilità puó esserti utile altrove (essere quindi
riusabile).
Ciao
        Danilo

riusabile).
Visto che mi servono diversi tipi di "riassunti" in base alla vista da
proporre, penso che farò una classe di comodo da cui, di volta in
volta, estrarre ciò che serve.
Grazie ancora.


Ho pensato che usare un vettore come dato di ritorno è stupido,
soprattuto perchè chi legge la documentazione non capisce nulla di
quello che verrà tornato. Quindi sono passato a tutti array, in modo
che la classe tornata sia ben chiara. Quando ho bisogno di dati
disomogenei, spezzo la faccenda in metodi diversi, ognuno che torna un
solo tipo di dato. Così è molto più chiaro e facile da gestire.


 come faccio a fargli vedere questa nuova classe?
Si', basta dichiarare il metodo
public ClasseDaPassare metodo() { } 
Per "far vedere" la classe, la metti nello stesso package. Se vuoi invece
che sia in un package diverso, la dichiari pubblica:
package x.y;
public class ClasseDaPassare { ... }
e nel codice che deve usarla dichiari
import x.y.*; (oppure import x.y.ClasseDaPassare)
Se il discorso dei pacakge non ti e' chiaro, su qualunque tutorial (per
esempio quello a 
java.sun.com
) trovi le spiegazioni del caso ;-)
Saluti,
	Cris

Per "far vedere" la classe, la metti nello stesso package. [...]
Ehm, no, non mi sono spiegato. Intendevo dichiarare la classe proprio
nella return (quindi una inner), senza che sia dichiarata altrove (se
no č facile! ;-) ).
return new QuestaClasseAppareSoloQui () {}
Si puņ fare?


Si può fare?
No, non puoi fare esattamente questo.  Puoi dichiarare classi
anonime (inner, naturalmente) solo se implementano una
interfaccia, e allora nella new useresti il nome dell'interfaccia;
se l'interfaccia ha metodi, devi implementarli fra le graffe
(se no la classe anonima sarebbe abstract e quindi non ne
potresti fare il new).
Comunque, puoi usare interfacce gia` esistenti e prive di
metodi per ottenere lo stesso effetto della tua istruzione
suddetta, eccetto che non introdurresti un identificatore
(d'altronde sintatticamente invisibile a tutti) per nominare
la classe inner (che resterebbe invece anonima):
    Object stranaBestia() {
        return new Cloneable() {};
    }
Non e` chiaro, naturalmente, a quale scopo potrebbe mai
servire una simile classe.
Alex

servire una simile classe.
:-D
