Crea sito
Facebook GooglePlus Twitter
Diaspora YouTube LinkeIn

Lezione 4 - Gli oggetti e le classi [GUIDA PER RUBY]

Tutte le guide per Ruby le trovi Qui

Lezione 4 - Gli oggetti e le classi [GUIDA PER RUBY]

Messaggio da leggereda benedetto il 10/10/2012, 1:37

Una frase che probabilmente descrive al meglio al meglio questo linguaggio è "tutto è un oggetto".
Cos'è un oggetto? State tranquilli, che capire questa parte potrà sembrare complesso ma in realtà è tutto molto semplice.
Un oggetto è un'istanza di una classe, che è un prototipo. Astrattamente potete pensare ad una classe come ad un insieme di caratteristiche (le variabili) e funzioni, dette anche metodi, che la gestiscono.

Un esempio chiarirà tutto: una classe puo' essere un'automobile. Essa ha particolari come il colore, la cilindrata, banalmente la marca, targa; e funzioni come l'aprire le porte, il bagagliaio, accendere l'auto, accelerare, frenare, e così via. Notare che mentre le caratteristiche in italiano sono sostantivi, le funzioni sono verbi, infatti le prime sono appunto variabili, dinamiche o meno, mentre le seconde sono funzioni, che agiscono sulle variabili o altro.

Questa è una classe, ma cosa significa che un oggetto è istanza di una classe?
Beh come abbiamo detto una classe è astratta, infatti il concetto di automobile non esiste in natura, essendo l'automobile un'idea. (OT: adoro Platone)
Tuttavia noi conosciamo molte auto, come la lamborghini s300 (sparata a caso, non credo esista), che ha determinata cilindrata, colore, e determinati modi di aprire le porte (tipo all'insu', scorrevoli, classiche...), eccetera...
Quindi la classe è un prototipo, che rimane astratto, l'oggetto è una classe istanziata.
Potete desumerne che istanziare significa creare un oggetto a partire da una classe.

Ai metodi o attributi (le variabili) di una classe si accede con il punto:
Codice: Seleziona tutto
a = Automobile.new 130, 5 # creo un auto con due parametri
a.accendi # richiamo il metodo "accendi"
a.accesa # richiedo la variabile "accesa"

I due parametri 130 e 5 sono puramente di fantasia, in questo caso in Ruby non esiste la classe Automobile, l'ho creata io, e ho impostato che i due parametri siano la velocità e il tempo d'accelerazione 0-100km/h.

Ma andiamo con calma, per creare una classe facciamo così:
Codice: Seleziona tutto
class Automobile

  private
  # espressa in km/h
  attr_reader :velocita_max
  # accelerazione da 0 a 100 km/h in secondi
  attr_reader :accelerazione
  # Boolean: l'auto e' accesa?
  attr_reader :accesa
  # espressa in km/h
  attr_reader :velocita_attuale
   # prezzo in euro
  attr_reader :costo
 
  public
 
  #=== Parametri
  #* v = velocita_max
  #* a = accelerazione
  def initialize v, a
    @velocita_max = v
    @accelerazione = a
    @accesa = false
    @velocita_attuale = 0
    @costo = 20000
  end
 
  # Accende l'auto
  def accendi chiave
    @accesa = true
  end

  # Accelera di +di_quanto+ km/h
  def accelera di_quanto
    if [email protected]
      return false
    end
    if @[email protected]_max then
      return @velocita_attuale
    elsif @velocita_attuale>@velocita_max then # ?!?
      @velocita_attuale = @velocita_max
      return @velocita_attuale
    end
    # else implicito
    time_to_sleep = di_quanto/100.0*@accelerazione
    time_every_sleep = time_to_sleep/di_quanto
    puts "Sto accelerando\nTempo previsto per ottenere una velocita' maggiore di " + di_quanto.to_s + " km/h da ora: " + time_to_sleep.to_s
    i = 0
    while i<di_quanto
      @velocita_attuale+=1
      sleep time_every_sleep
      i+=1
    end
    if @velocita_attuale>@velocita_max
      @velocita_attuale = @velocita_max
    end
    return @velocita_attuale
  end
 
  # Decelera di +di_quanto+ km/h
  def decelera di_quanto
    if [email protected]
      return false
    end
    if @velocita_attuale-di_quanto<0
      @velocita_attuale = 0
      return @velocita_attuale
    end
    @velocita_attuale -= di_quanto
  end
 
  # Calcola la marcia attuale in base alla +velocita_attuale+
  def marcia
    if @velocita_attuale<=20 then return 1 end
    if @velocita_attuale<=50 then return 2 end
    if @velocita_attuale<=70 then return 3 end
    return @velocita_attuale/50+2
  end
end


Come vedete questo codice è molto lungo, ma non è complesso e ci dà modo di spiegare molte cose.
All'inizio creiamo subito la classe Automobile.

NOTA: di norma le classi si indicano con la Maiuscola iniziale

Quindi usiamo la parola chiave private. Dopo questa parola vanno tutte le variabili/funzioni della classe che non possono essere accessibili dall'esterno, ed è buona norma dare tutte le variabili dopo questa parola chiave.
Se vogliamo rendere pubbliche le variabili vediamo bene tra poco, non vi preoccupate.

Quindi dichiariamo tutte le variabili in modo particolare, con :attr_reader. Eccolo qui, con questa dichiarazione possiamo leggere in un futuro programma le variabili, ma non scriverle: infatti per accendere l'auto non potremo assegnare alla variabile accesa il valore true, ma dovremo usare un metodo opportuno, mentre se volessimo verificare se è accesa o no ci basterà controllare la variabile.
:attr_reader quindi ci permette la lettura
:attr_writer la scrittura
:attr_accessor entrambi

Quello che di preciso fanno queste dichiarazioni è creare dei metodi con lo stesso nome della variabile che permettano di leggere e/o scrivere. Questi metodi (che potremmo creare anche noi aumentando la lunghezza del codice) sono detti metodi accessori.

Dopo public vanno tutte le variabili e i metodi accessibili da tutti (=pubblico appunto). Queste parole, public e private, sono parole chiave che possono essere ripetute nel codice più volte, ma è consigliabile scriverle una sola volta facendole seguire da tutto ciò che riteniamo opportuno.

A questo punto ci troviamo di fronte a "initialize", questo metodo che viene richiamato nel momento in cui istanziamo un oggetto. Infatti quando abbiamo scritto più sopra
Codice: Seleziona tutto
a = Automobile.new 130,5

abbiamo creato un nuovo oggetto "a" istanziato a partire dalla classe "Automobile". Il metodo new in realtà si definisce con initialize, anche se poi viene chiamato new nella creazione di oggetti. I due parametri 130 e 5 sono la nostra "v" e la "a".
Nel metodo initialize, come in questo caso, si inizializzano appunto le variabili.

Come mai le chiocciole davanti ai nomi delle variabili? Questo perchè quelle variabili non sono locali, devono valere anche al di' fuori del metodo initialize. Scrivendo @variabile identifichiamo una variabile dell'oggetto; ogni oggetto le ha con valori diversi l'uno dall'altro, e persistono fintanto che esiste l'oggetto.

Seguono poi dei metodi per recuperare marcia (secondo un algoritmo molto ma molto empirico e puramente inventato), e due metodi per accelerazione e decelerazione.

Se volessimo contare quante auto vengono create? Semplice, useremo le variabili di classe, definite con @@variabile . Esse, come si intuisce dal nome, esistono dal momento che il programma carica la classe, e sono uguali per tutti gli oggetti.
Quindi avremmo potuto scrivere un @@numero_auto+=1 dentro all'initialize, quindi ad ogni "Automobile.new" si sarebbe incrementata la variabile numero_auto di uno.

So che i concetti sono tanti, quindi riguardatevi e rileggetevi bene il tutto.
Se avete dubbi o quant'altro commentate.

A breve pubblicherò un approfondimento su piccoli particolari delle classi e funzioni di Ruby, e poi passeremo ai moduli net.
Elementary OS... ma nostalgia di Gentoo :geek:
Avatar utente
benedetto
Brigata Linux
 
Messaggi: 364
Iscritto il: 22/05/2012, 22:43
Località: Milanoooo

  • Condividi e Vota l'articolo
  • Condividi e questo articolo di LaScaricata

    Share on Tumblr

Torna a Ruby

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron
 
Creative Commons License

Dichiarazione di non responsabilita': Nessuno dei files indicati su questo sito e' ospitato o trasmesso da questo server. I links sono forniti dagli utenti del sito, basandosi su servizi esterni. Il progetto LaScaricata non puo' essere ritenuto in alcun modo responsabile per qualsiasi pubblicazione o altra azione commessa dagli utenti. Non e' consentito usare questo sito per la distribuzione o il download di materiale se non si e' espressamente autorizzati a farlo. Siete tenuti a rispettare termini e regolamento del sito.