[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