Forum: Italian Ruby user group programmazione OO: beginner

Posted by Alessandro Barracco (bomastudio)
on 2010-08-16 09:59
Salva a tutti, ho un problemino con le variabili.
Sono un principiante, quindi perdono per le castronerie che dirò :-)

Ho un programmino che inserisce oggetti grafici (cerchi, rettangoli,
punti, ecc) in una finestra, così suddiviso:

script N.1 - "tool.rb"
script N.2 - "oggetto.rb"
script N.3 - "oggettotipo1.rb"
script N.4 - "oggettotipo2.rb"
..
script N.8 - "oggettotipo6.rb"

Ogni script ha una classe.

Lo script N.1, dopo un click su un controllo, chiama il N.2.
Il N.2 ha diversi tipi di oggetto, e, dopo un click su un nuovo
controllo, chiama uno degli script dal N.4 al N.8.

Vorrei numerare tutti gli oggetti che l'utente inserisce diversificando
in base al tipo di oggetto.

Come faccio? Uso le variabili di classe @@numerotipo1, @@numerotipo2? e
se si come si fa?

Grazie a chiunque vorrà aiutarmi.
Posted by Pietro Giorgianni (giorgian)
on 2010-08-16 10:14
(Received via mailing list)
Il 16 agosto 2010 09:59, Alessandro Barracco <bomastudio@gmail.com> ha 
scritto:
> Ogni script ha una classe.
Ciao,

giusto per capirci: hai delle classi inserite in vari file, oppure hai
degli script?

> Lo script N.1, dopo un click su un controllo, chiama il N.2.
> Il N.2 ha diversi tipi di oggetto, e, dopo un click su un nuovo
> controllo, chiama uno degli script dal N.4 al N.8.

Qui, per esempio, cosa intendi? In che modo lo script N.1 chiama lo 
script N.2?

> Vorrei numerare tutti gli oggetti che l'utente inserisce diversificando
> in base al tipo di oggetto.
>
> Come faccio? Uso le variabili di classe @@numerotipo1, @@numerotipo2? e
> se si come si fa?

Non sono sicuro di aver afferrato il problema.

La mia impressione (se mi sbaglio correggimi) è che manchi un po' di
struttura generale, cioè che, al momento di contare quel che devi
contare, non sai dove tenere i dati raccolti.

Quello che credo tu voglia è avere una classe che rappresenta in
qualche modo l'applicazione; questa classe avrà una variabile di
istanza @oggetti, che ad esempio potrebbe essere fatta 
così:@oggetti = {OggettoTipo1 => 3, OggettoTipo2 => 5, ...}

È difficile essere più precisi; prova a chiarire meglio il problema.


pietro
Posted by Alessandro Barracco (bomastudio)
on 2010-08-16 10:31
Pietro Giorgianni wrote:
> 
> giusto per capirci: hai delle classi inserite in vari file, oppure hai
> degli script?
> 

Che differenza c'è?

>> Lo script N.1, dopo un click su un controllo, chiama il N.2.
>> Il N.2 ha diversi tipi di oggetto, e, dopo un click su un nuovo
>> controllo, chiama uno degli script dal N.4 al N.8.
> 
> Qui, per esempio, cosa intendi? In che modo lo script N.1 chiama lo 
> script N.2?
> 
Lo script N.1 mostra (.show) una GUI creata con WxFormBuilder e XRCise 
su cui c'un un bottone: al click dell'utente su di esso viene chiamato 
lo script N.2.

> 
> La mia impressione (se mi sbaglio correggimi) � che manchi un po' di
> struttura generale, cio� che, al momento di contare quel che devi
> contare, non sai dove tenere i dati raccolti.
> 

HAI RAGIONE.... è proprio questo il dilemma!!


> Quello che credo tu voglia � avere una classe che rappresenta in
> qualche modo l'applicazione; questa classe avr� una variabile di
> istanza @oggetti, che ad esempio potrebbe essere fatta 
> cos�:@oggetti = {OggettoTipo1 => 3, OggettoTipo2 => 5, ...}
> 
> � difficile essere pi� precisi; prova a chiarire meglio il problema.
> 

mmmm, vediamo di essere più chiari.
Io avrei bisogno di tenere traccia del numero di oggetti inseriti 
dall'utente nello script N.1, che è quello principale.
Ma siccome ho uno script (un file *.rb) per ogni oggetto che il 
programma gestisce (mi viene più semplice gestirli così), non so come 
"tenere" il numero "attuale".
Cioè:
Si avvia il programma: nessun oggetto presente.
L'utente seleziona il comando "Quadrato", e ne inserisce 5 (dal numero 1 
al numero 5).
Poi seleziona il comando "Cerchio" e ne inserisce 2 (dal numero 1 al 2).
Riseleziona "Quadrato e ne aggiunge 1 (il numero 6).

ecc.
Posted by Pietro Giorgianni (giorgian)
on 2010-08-16 10:48
(Received via mailing list)
Il 16 agosto 2010 10:31, Alessandro Barracco <bomastudio@gmail.com> ha 
scritto:
> Pietro Giorgianni wrote:
>>
>> giusto per capirci: hai delle classi inserite in vari file, oppure hai
>> degli script?
>>
>
> Che differenza c'è?

Facciamo così: gli script non esistono.
Esistono oggetti, classi, metodi.

Esiste il codice; per ragioni di comodità, poi, il codice si scrive
non su un singolo file ma su più d'uno. Questo però non c'interessa,
non ne parleremo mai, a meno che il problema non sia che non riesci a
"caricare" la tal classe definita sul tal file (che non è il nostro
caso, al momento).

Credimi, la discussione sarà molto più chiara.

> Lo script N.1 mostra (.show) una GUI creata con WxFormBuilder e XRCise
> su cui c'un un bottone: al click dell'utente su di esso viene chiamato
> lo script N.2.

Ecco, di nuovo: che vuol dire "viene chiamato lo script N.2"? Come?
Incolli qui il codice della chiamata, per favore?



pietro
Posted by Alessandro Scolavino (ninjinka)
on 2010-08-16 11:34
Alessandro Barracco wrote:
> Pietro Giorgianni wrote:
>> 
>> giusto per capirci: hai delle classi inserite in vari file, oppure hai
>> degli script?
>> 
> 
> Che differenza c'è?

Se vuoi un suggerimento...
Studia un pò prima di fare domande altrimenti qualunque risposta 
otterrai sarà comunque troppo tecnica per te da capire...
Posted by Alessandro Barracco (bomastudio)
on 2010-08-16 12:00
Alessandro Scolavino wrote:
> Alessandro Barracco wrote:
>> Pietro Giorgianni wrote:
>>> 
>>> giusto per capirci: hai delle classi inserite in vari file, oppure hai
>>> degli script?
>>> 
>> 
>> Che differenza c'è?
> 
> Se vuoi un suggerimento...
> Studia un pò prima di fare domande altrimenti qualunque risposta 
> otterrai sarà comunque troppo tecnica per te da capire...

Se devo essere onesto pensavo che:

"Ruby è un linguaggio di scripting completamente a oggetti. Nato nel 
1993 come progetto personale del giapponese Yukihiro Matsumoto (spesso 
chiamato semplicemente Matz), Ruby è stato il primo linguaggio di 
programmazione sviluppato in Oriente a guadagnare abbastanza popolarità 
da superare la barriera linguistica che separa l'informatica nipponica 
da quella internazionale e ad essere usato anche in Occidente in 
progetti di rilievo."

(da Wikipedia, http://it.wikipedia.org/wiki/Ruby)

e in quanto tale, ci fossero gli SCRIPT:

"In informatica un linguaggio di scripting è un linguaggio di 
programmazione interpretato, destinato in genere a compiti di 
automazione del sistema (batch) o delle applicazioni (macro), o ad 
essere usato all'interno delle pagine web.

I programmi sviluppati con questi linguaggi vengono detti script, 
termine della lingua inglese utilizzato in ambito teatrale per indicare 
il testo dove vengono tracciate le parti che devono essere interpretate 
degli attori.

Gli script generalmente sono semplici programmi il cui scopo è quello di 
interagire con altri programmi molto più complessi in cui avvengono le 
operazioni più significative. Gli script si distinguono dai programmi 
con cui interagiscono, i quali solitamente sono implementati in un 
linguaggio differente e non interpretato. Inoltre, spesso gli script 
sono creati o modificati dall'utente finale."

(da Wikipedia, http://it.wikipedia.org/wiki/Scripting).

Forse non ho capito bene.
Posted by Alessandro Barracco (bomastudio)
on 2010-08-16 12:06
Pietro Giorgianni wrote:

> Incolli qui il codice della chiamata, per favore?
> 
> 

il primo file è:

# tool.rb

require "Oggetti_gui"
require "Oggetto_tipo1"
require "Oggetto_tipo2"

class NuovoOggetto < Frm_Oggetto
  def initialize
     super()
     evt_button(@btn_ok) {on_OK}
     evt_tool(@tbtn_oggetto1) { | event | oggetto1 }
     evt_tool(@tbtn_oggetto2) { | event | oggetto2 }
  end

  def oggetto1
     @tipo = 1
  end

  def oggeto2
     @tipo = 2
  end

  def on_OK
     if @tipo==1
         OggettoTipo1.new()
     elsif @tipo==2
         OggettoTipo2.new()
     end
  end
end


Il file N.2 contiene:

# Oggetto_tipo1.rb

class OggettoTipo1
    def initialize
      ....
    end

    def disegna
      . # codice per il disegno
    end
end
Posted by Alessandro Scolavino (ninjinka)
on 2010-08-16 12:31
Non proseguo la discussione ma ti invito a NON leggere le definizioni 
italiane tradotte molto spesso (quasi sempre) male da definizioni in 
inglese.
Posted by Pietro Giorgianni (giorgian)
on 2010-08-16 12:37
(Received via mailing list)
Il 16 agosto 2010 12:06, Alessandro Barracco <bomastudio@gmail.com> ha 
scritto:
> end
Ok, ora è più chiaro.
Beh, mi sembra che on_OK sia il posto giusto per i tuoi tracciamenti, 
no?
Puoi usare una (o più d'una) variabile d'istanza cui, contestualmente
alla creazione di un nuovo oggetto, assegni qualcosa (non ho ben
capito se devi solo contare quanti oggetti di ogni tipo crei o anche
altro).

Fra parentesi, quella cascata di if non è proprio il massimo;
considera alcune alternative:

* Array

Objects = [OggettoTipo1, OggettoTipo2, OggettoTipo3, ...]

def on_OK
  Objetcs[@tipo].new
end

* Hash

Objects = {:tipo1 => OggettoTipo1, :tipo2 => OggettoTipo2, ...}

* Altro, ci sono decine di modi per fare questa cosa.

Così, se il tuo scopo è solo contare gli oggetti di ogni tipo,
potresti semplicemente avere un hash che ha come chiavi le classi e
come valori il numero di oggetti creati finora:

def on_OK
  @oggetti_contati[Objects[@tipo]] += 1
  Objects[@tipo].new
end


pietro
Posted by Luca De Marinis (Guest)
on 2010-08-16 12:43
(Received via mailing list)
2010/8/16 Alessandro Barracco <bomastudio@gmail.com>:

>
> e in quanto tale, ci fossero gli SCRIPT:
>
> "In informatica un linguaggio di scripting è un linguaggio di
> programmazione interpretato, destinato in genere a compiti di
> automazione del sistema (batch) o delle applicazioni (macro), o ad
> essere usato all'interno delle pagine web.
> ...
> Forse non ho capito bene.

In questo contesto per script si intende un file direttamente
eseguibile, ad esempio uno che contenga:
--
#!/usr/bin/ruby
puts "sono uno script direttamente eseguibile"
--
e' uno script

mentre un file che contenga
--
class NuovoOggetto < Frm_Oggetto
...
end
--
e' una definizione di classe (e dei suoi metodi) che se lo esegui non
fa nulla... e che pur essendo scritto in un linguaggio di scripting
non e' corretto chiamarlo script.

Ciao
Posted by Alessandro Barracco (bomastudio)
on 2010-08-16 16:28
Luca De Marinis wrote:

> 
> [...] per script si intende un file direttamente
> eseguibile
> mentre un file che contenga
> --
> class NuovoOggetto < Frm_Oggetto
> ...
> end
> --
> e' una definizione di classe (e dei suoi metodi) che se lo esegui non
> fa nulla... e che pur essendo scritto in un linguaggio di scripting
> non e' corretto chiamarlo script.
> 

Grazie Luca,
chiaro, semplice, coinciso, come ruby!!
Posted by Alessandro Barracco (bomastudio)
on 2010-08-16 16:31
Pietro Giorgianni wrote:

> Ok, ora � pi� chiaro.
> Beh, mi sembra che on_OK sia il posto giusto per i tuoi tracciamenti, 
> no?
> Puoi usare una (o pi� d'una) variabile d'istanza cui, contestualmente
> alla creazione di un nuovo oggetto, assegni qualcosa (non ho ben
> capito se devi solo contare quanti oggetti di ogni tipo crei o anche
> altro).

OK. provo e faccio sapere che succede.

> Fra parentesi, quella cascata di if non � proprio il massimo;
> considera alcune alternative:
> 
> * Array
> 
> Objects = [OggettoTipo1, OggettoTipo2, OggettoTipo3, ...]
> 
> def on_OK
>   Objetcs[@tipo].new
> end
> 
> * Hash
> 
> Objects = {:tipo1 => OggettoTipo1, :tipo2 => OggettoTipo2, ...}
> 
> * Altro, ci sono decine di modi per fare questa cosa.
> 
> Cos�, se il tuo scopo � solo contare gli oggetti di ogni tipo,
> potresti semplicemente avere un hash che ha come chiavi le classi e
> come valori il numero di oggetti creati finora:
> 
> def on_OK
>   @oggetti_contati[Objects[@tipo]] += 1
>   Objects[@tipo].new
> end
> 
> 
Immaginavo non fossero "da buon programmatore" :-)
Provo a cambiare il codice (speriamo non mi confonda!!).
Posted by Alessandro Barracco (bomastudio)
on 2010-08-17 09:26
Signori, grazie a tutti per gli utili consigli. Ho risolto il problema. 
So contare!!!! (è dalle elementari che non mi sento così felice di 
contare i numeri interi ...... :-)
Posted by Pietro Giorgianni (giorgian)
on 2010-08-17 09:51
(Received via mailing list)
Il 17 agosto 2010 09:26, Alessandro Barracco <bomastudio@gmail.com> ha 
scritto:
> Signori, grazie a tutti per gli utili consigli. Ho risolto il problema.
> So contare!!!! (è dalle elementari che non mi sento così felice di
> contare i numeri interi ...... :-)

:)

sì, è sempre una grande soddisfazione.


pietro
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.