[ruby-it] aiuto programmazione OO
Alessandro Barracco
bomastudio a gmail.com
Sab 6 Feb 2010 15:55:48 CET
Pietro Giorgianni wrote:
> Il 15 gennaio 2010 10.59, Alessandro Barracco <bomastudio a gmail.com> ha
> scritto:
>> Salve sono nuovo del forum e un programmatore 'newbie' (si dice cosi?).
> ciao e benvenuto!
>> Secondo voi la classe Asta deve ereditare da Nodo oppure � inutile?
> in genere, quello che pi� conta non sono i dati, ma il comportamento;
> che accettino parametri simili non � importante, la domanda � cosa
> fanno esattamente queste classi; se vedi che hanno molti metodi in
> comune, puoi optare per l'ereditariet� - ma magari, se l'asta non � un
> caso particolare di nodo (e mi sembra di capire che non lo �), la cosa
> pi� giusta � che entrambi ereditino da un capostipite comune.
>
>
> pietro
Ancora dubbi.......
Ho creato due classi:
# La classe Nodo crea un oggetto nodo.
# Ogni istanza della classe e' identificata da un numero univoco (id)
# La classe necessita di 5 parametri + 1 opzionale: id, x, y, z,
vincolo, [costante elastica]
class Nodo
# Numero identificativo del nodo
attr_accessor :id
# Coordinata x
attr_accessor :x
# Coordinata y
attr_accessor :y
# Coordinata z
attr_accessor :z
# Codice di vincolo. E' costituito da tre strighe
# che si riferiscono alle tre componenti di movimento del nodo
# (nell'ordine: traslazione lungo x, lungo y e rotazione attorno z).
# 0 = movimento consentito 48
# 1 = movimento impedito 49
# C = movimento limitato da un vincolo cedevole 67
attr_accessor :sx
attr_accessor :sy
attr_accessor :rz
# costante elastica del vincolo alla traslazione lungo x
attr_accessor :csx
# costante elastica del vincolo alla traslazione lungo y
attr_accessor :csy
# costante elastica del vincolo alla traslazione lungo z
attr_accessor :csz
# costante elastica del vincolo alla rotazione attorno x
attr_accessor :crx
# costante elastica del vincolo alla rotazione attorno y
attr_accessor :cry
# costante elastica del vincolo alla rotazione attorno z
attr_accessor :crz
# numero totale di nodi creati
@@numero_nodi = 0
# Inizializzazione della classe
def
initialize(id,x,y,z,sx,sy,sz,rx,ry,rz,csx=0,csy=0,csz=0,crx=0,cry=0,crz=0)
@id = id
@x = x
@y = y
@z = z
@sx = sx
@sy = sy
@sz = sz
@rx = rx
@ry = ry
@rz = rz
# Per i gradi di libertà per i quali si è usato C come codice di
# vincolo, bisogna fornire anche la costante elastica di vincoli
# cedevoli (kN/m per vincoli allo spostamento kNm per vincoli alla
rotazione)
@csx = csx
@csy = csy
@csz = csz
@crx = crx
@cry = cry
@crz = crz
@@numero_nodi +=1
end
# Il metodo <em>to_s</em> stampa una tabella con i dati caratteristici
# del nodo.
def to_s
puts "\n"
puts "NODO n. #{@id}"
puts "="*30
puts "x= #{@x} [#{$umlungh}]"
puts "y= #{@y} [#{$umlungh}]"
puts "z= #{@z} [#{$umlungh}]"
puts "sx= #{@sx}"
puts "sy= #{@sy}"
puts "sz= #{@sz}"
puts "rx= #{@rx}"
puts "ry= #{@ry}"
puts "rz= #{@rz}"
if not nodo.csx==0
puts "csx= #{@csx} [#{$umcedevol}]"
end
if not nodo.csy==0
puts "csy= #{@csy} [#{$umcedevol}]"
end
if not nodo.csz==0
puts "csz= #{@csz} [#{$umcedevol}]"
end
if not nodo.crx==0
puts "crx= #{@crx} [#{$umcedevolrot}]"
end
if not nodo.cry==0
puts "cry= #{@cry} [#{$umcedevolrot}]"
end
if not nodo.crz==0
puts "crz= #{@crz} [#{$umcedevolrot}]"
end
end
end
# La classe Asta crea una asta tra due nodi.
# I parametri accettati sono:
# id = numero identificativo asta [intero]
# ni = nodo iniziale [intero]
# nf = nodo finale [intero]
# nmat = indice del materiale dell'asta [intero]
# nsez = indice della sezione dell'asta [intero]
# tipo = codice indentificativo del tipo di asta:
# T = trave alla DeSaint Venant
# TR = trave alla De saint Venant con tratti rigidi
# W = trave di fonazione alla Winkler
# WR = trave di fondazione alla Winkler con tratti rigidi
# *opz = lista di 2 o 4 valori numerici che possono essere:
# se tipo = TR oppure WR:
# l1 = lunghezza tratto rigido al nodo ni
# l2 = lunghezza tratto rigido al nodo nf
# se tipo = W oppure WR:
# lb = larghezza sottobase [cm]
# kw = costante sottofondo [N/cm3]
class Asta
attr_accessor :id, :ni, :nf, :nmat, :nsez, :tipo, :l1, :l2, :lb, :kw
@@numero_aste = 0
def initialize(id,ni,nf,nmat,nsez,tipo,*opz)
@id=id
@ni=ni
@nf=nf
@nmat=nmat
@nsez=nsez
@tipo=tipo
if @tipo == "TR"
@l1=opz[0]
@l2=opz[1]
elsif @tipo == "W"
@lb=opz[0]
@kw=opz[1]
elsif @tipo == "WR"
@l1=opz[0]
@l2=opz[1]
@lb=opz[2]
@kw=opz[3]
end
@@numero_aste +=1
end
# Il metodo <em>to_s/em> stampa una tabella con i dati caratteristici
# dell'asta.
def to_s
puts "\n"
#puts "="*40
puts "ASTA n. #{@id}"
puts "="*50
puts "nodo i= #{@ni}"
puts "nodo f= #{@nf}"
puts "materiale n° #{@nmat}"
puts "sezione n° #{@nsez}"
puts "tipo= #{@tipo}"
if @tipo == 'TR' or @tipo == "WR"
puts "lunghezza tratto rigido al nodo #{@ni} #{@l1}
[#{$umlungh}]"
puts "lunghezza tratto rigido al nodo #{@nf} #{@l2}
[#{$umlungh}]"
end
if @tipo == "W" or @tipo == "WR"
puts "Larghezza sottobase lb= #{@lb} [#{$umlungh}]"
puts "Costante di sottoforndo kw= #{@kw} [#{$umdens}]"
end
end
# Il metodo _lungh_ calcolca la lunghezza dell'asta.
def lungh
xi = @ni.xi
yi = @ni.yi
zi = @ni.zi
l = Math.sqrt((xf-xi)^2+(yf-yi)^2+(zf-zi)^2)
return l
end
end
Nella classe Asta mi serve un metodo che restituisce i tutti i dati dei
nodi di estrmità: come faccio a "linkare" le due classi?
--
Posted via http://www.ruby-forum.com/.
More information about the Ml
mailing list