[ruby-it] aiuto programmazione OO
Andrea Dallera
andrea a andreadallera.com
Sab 6 Feb 2010 20:39:30 CET
On Sat, 2010-02-06 at 19:59 +0100, Alessandro Barracco wrote:
> Grazie Andrea.
>
> > - wrappare le componenti x,y,z di posizione e costanti elastiche.
> > Qualcosa di questo tipo:
> >
> > class Vector
> >
> > def initialize(x,y,z)
> > @x, @y, @z = x, y,z
> > end
> >
> > end
> >
> > puoi ereditare da Vector nel caso (probabile) in cui ci sia della logica
> > associata alla posizione/costante elastica.
>
> Cosa vuol dire "wrappare"?
Giusta osservazione :-) avrei dovuto spiegarmi nel dettaglio.
Nel tuo caso hai come parametri nel costruttore, fra gli altri, x y e z.
Insieme rappresentano la posizione del nodo. Se, invece di passarli come
valori numerici che, in linea teorica, potrebbero anche essere
interpretati come non collegati l'uno all' altro costruisci una classe
(la suddetta Vettore) che li contiene è come se tu dicessi "ok, questi
valori x y e z non sono semplici valori numerici ma, insieme,
costituiscono una entità vettore che rappresenta un punto nello spazio".
Nel caso ti servisse, ad esempio, di avere il vettore in un sistema di
coordinate polari potresti aggiungere un metodo nella classe vettore che
si occupa della conversione.
>
> > - quel @@numero_nodi mi piace pochino :-) perch� lo usi? Non vedo niente
> > nella classe Nodo stessa che ne faccia uso. Se la necessit� del counter
> > � dovuta a qualche altra classe � il caso che sia la classe che ne ha
> > bisogno ad assumersi la
> > responsabilit�.
>
> OK
>
> - nel costruttore della classe asta: tipo e opzioni nascondono in realt�
> classi, non passare stringhe in giro e comparare ma crea una classe per
> > ogni tipo. Qui la logica di dominio non la conosco ma un' idea potrebbe
> > essere qualcosa del genere:
> >
> > class Trave
> > #logica per le travi
> > end
> >
> > class DeSaint < Trave
> > #logica per le travi desaint
> > end
> >
> > class Winkler < Trave
> > #logica per le travi winkler
> > end
> >
> > e via cos�. Se la logica per le travi rigide � comune per tutte le travi
> > puoi anche creare un modulo (esempio)
> >
> > module TraveRigida
> > #logica per le travi rigide
> > end
> >
> > ed includerlo dove serve:
> >
> > class WinklerRigida < Trave
> > include TraveRigida
> >
> > end
>
> Mi sembra decisamente più razionale :-)
>
>
> > - non passare in giro l'ID per identificare i nodi: se non ti serve per
> > altre esigenze (tipo persistenza in DB) eliminalo, e passa in giro
> > direttamente le istanze.
>
>
> Dato che dovrò gestire centinaia di nodi e di aste (ma non di sezioni e
> materiali) pensavo ad un DB. Non so, cosa consigli?
Salvare in DB ha senso ma non creare cose che non ti servono prima del
tempo. Se e quando deciderai di persistere il tuo grafo di oggetti in un
database allora potrai pensare ad aggiungere id e cose del genere.
>
> > - stessa cosa per nmat e nsez: fai delle classi e passa in giro le
> > istanze, tipo:
> >
> > class Materiale
> > #logica comune a tutti i materiali
> > end
> >
> > class MaterialeFoo < Materiale
> > #logica
> > end
> >
> > in questo caso dipende per� da quanti materiali hai e da quanto varia la
> > logica fra uno e l'altro: se sono tanti e tutti uguali allora usa solo
> > una classe materiale, se ne hai logiche diverse per materiali diversi
> > fai classi diverse. Stesso discorso per le sezioni
>
> Scusa la (ennesima) domanda da 'negozio degli orrori':::
> Come faccio a passare una istanza al posto dell'id?
esempio:
start = Nodo.new
end = Nodo.new
materiale = Materiale.new
sezione = Sezione.new
trave = Trave.new(start, end, materiale, sezione)
puoi passare come parametro un oggetto esattamente nello stesso modo in
cui passi in giro un fixnum o una stringa. In ruby tutto (o quasi :)) è
un oggetto, dal punto di vista delle "variabili" non fa differenza se si
tratta di un numero (istanza della classe Fixnum) o dell' istanza di una
classe da te creata.
>
> > - il costruttore di asta diventerebbe
> >
> > def TraveCippaLippa < Trave
> >
> > #usa nomi significativi per le variabili... li paghi te i
> > caratteri? :-)
> > def initialize(nodo_iniziale, nodo_finale, materiale, sezione)
> >
> > @nodo_iniziale = nodo_iniziale
> > @nodo_finale = nodo_finale
> > @materiale = materiale
> > @sezione = sezione
> > # niente @@numero_aste += 1, stesso discorso che per i nodi
> >
> > end
>
> Già detto a Pietro.
>
> Grazie davvero per gli utilissimi consigli.
>
>
--
Andrea Dallera
http://usingimho.wordpress.com
More information about the Ml
mailing list