Autore Topic: passaggio di variabili tramite classi  (Letto 1153 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
passaggio di variabili tramite classi
« il: 15 Aprile 2011, 23:35:14 »
Mi sono trovato davanti alla seguente situazione :
1) La FMain chiama la Form01
2) La Form01 prepara il titolo (di contenuto non costante) per la Form02 e restituisce il controllo alla FMain
3) La FMain chiama la Form02
4) La Form02 riempie il Me.Text col valore preparato dalla Form01

Quando ho iniziato la stesura del codice per la Form01, questa preparava il titolo alla Form02 con
Codice: [Seleziona]
Form02.Text = "Inserimento   Movimenti   del :  " & DtContGG.Text & " - " & DtContMM.Text & " - " & DtContAA.Text

Dato che ora sto via via modificando tutti i passaggi di variabili e costanti tra form attraverso classi esterne o attraverso il metodo new, ho voluto modificare anche la suddetta istruzione. Ho anche voluto evitare un doppio passaggio di valori , dalla Form01 alla FMain e da quest'ultima alla Form02, creando una classe "Variabili", nella quale valorizzo la variabile interessata o ne prelevo il contenuto solamente all'occorrenza.
Nella Classe "Variabili:
Codice: [Seleziona]
STATIC PUBLIC $TextOut AS String
STATIC PUBLIC FUNCTION FormText($TextIn AS String) AS String
'-------------------------------------------------------------------------
  $TextOut = $TextIn
  RETURN $TextOut
END

Nella Form01, per la valorizzazione:
Codice: [Seleziona]
 DIM $FrmTxt AS Variabili
. . . . . . . . . . . . . . . . . . . . . . .
Variabili.FormText("Inserimento   Movimenti   del :  " & DtContGG.Text & " - " & DtContMM.Text & " - " & DtContAA.Text)

Nella Form02, per prelevare il contenuto della variabile
Codice: [Seleziona]
DIM $FrmTxt AS Variabili
. . . . . . . . . . . . . . . . . . . . . . .
ME.Text = Variabili.$TextOut

Funziona perfettamente, ma mi sorge il seguente dubbio:  utilizzando classi statiche, per valorizzare variabili (statiche), da tenere in memoria, per utilizzarle più avanti, ma per un tempo ristretto, rispetto a tutta la durata del programma, non è come se usassi variabili globali?
É un aspetto molto importante che mi permetterebbe di capire la differenza, se c'è una differenza, fra variabili globali e variabili statiche. Qualcuno potrà dirmi: ma come, ancora non hai capito? Pirtroppo, rispondo, mi sembrava di avere capito, ma ora mi sono accorto, invece, che non è così. :-[  :-\
 :ciao:  :ciao:
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: passaggio di variabili tramite classi
« Risposta #1 il: 16 Aprile 2011, 00:18:02 »
secondo me non ce alcuna differenza, però non sono un programmatore professionista per cui mi potrei anche sbagliare  :rolleyes:

per inteso io non ci trovo nulla di male a utilizzare variabili pubbliche anche perchè le utilizzo per memorizzare dati comuni a + parti del programma e che magari sono risultati di lunghe funzioni percui preferisco spendere quel poco in + di memoria a favore della diminuzione delle operazioni (magari su un db)per ricavare un singolo dato.

ps: ma poi perchè le chiamate globali?

in gambas ci sono variabili

d' ambiente
pubbliche
private
statiche

ma non ho mai visto la dicitura GLOBAL   o mi sbaglio?

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: passaggio di variabili tramite classi
« Risposta #2 il: 16 Aprile 2011, 16:02:22 »
 
secondo me non ce alcuna differenza, però non sono un programmatore professionista per cui mi potrei anche sbagliare  :rolleyes:

per inteso io non ci trovo nulla di male a utilizzare variabili pubbliche anche perchè le utilizzo per memorizzare dati comuni a + parti del programma e che magari sono risultati di lunghe funzioni percui preferisco spendere quel poco in + di memoria a favore della diminuzione delle operazioni (magari su un db)per ricavare un singolo dato.

ps: ma poi perchè le chiamate globali?

in gambas ci sono variabili

d' ambiente
pubbliche
private
statiche

ma non ho mai visto la dicitura GLOBAL   o mi sbaglio?
[/quoteComincio dalla coda della tua risposta per la priorità che secondo me merita l'argomento. Il termine "variabili globali" io l'incontrato nelle guide che ho letto ai primi miei passi nel linguaggio Gambas; lo stesso Benoit nella sua "Beginner's guide to Gambas" parla di variabili globali e le suddivide in pubbliche, private e statiche.

Perciò, ritornando alla mia perplessità iniziale, la risposta l'ha data proprio Benoit nell'affermazione appena citata. Comunque a prescindere dalle finezze argomentali sulle variabili statiche, pubbliche o private, l'applicazione di variabili statiche al mio programma mi ha permesso di imparare un nuovo modo di usare le variabili e di aumentare il mio bagaglio di conoscenze.
 ;D
Ciao.
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: passaggio di variabili tramite classi
« Risposta #3 il: 16 Aprile 2011, 21:02:00 »
ah ok quindi per globali intendete tutte le variabili che non sono locali.... be ora + di prima mi sembra comunque inutile cercare di non utilizzarle mai , secondo me bisogna trovare un buon compromesso tra il loro l' utilizzo o il passaggio di variabili tra funzioni.

poi magari se si va a quardare l' effettivo consumo di memoria il passaggi di variabili tra funzioni implica l' utilizzo di spazio in memoria per due  variabili (una nel form che la invia e una per il form o funzione che la riceve) mentre con una variabile "globale" l' allocamento è sempre uguale ma probabilmente per un periodo più lungo.

In definitiva io personalmente non credo che sia utile riscrivere interi programmi per eliminare variali qui e la ; in base a cosa si deve fare a volte può essere più comodo un passaggio di variabili e altre più conveniente l' utilizzo di variabili "Globali".
 :2birre:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: passaggio di variabili tramite classi
« Risposta #4 il: 16 Aprile 2011, 22:45:17 »
Sicuramente la riscrittura di programmi per trasforformare il criterio di utilizzo/impiego di variabili è impegnativo e tutto sommato il gioco non vale la candela, ma, se la scelta viene fatta per intraprendere un metodo di applicazione futura delle variabili, in modo da tenere conto della quantità di memoria impegnata complessivamente in un progetto, costituisce un valido studio, attraverso il quale potere delineare il proprio stile di programmazione. Prima di questa discussione, mi ero fatto un'idea errata sulle variabili globali; infatti, per me erano soltanto quelle dichiarate come pubbliche nei moduli. Ora ho capito un aspetto che avevo male interpretato durante la lettura inizialie dell'ambiente Gambas. Ecco perchè ho sempre considerato costruttiva la rilettura delle guide dopo l'approccio iniziale; infatti, non tutto quello che si legge la prima volta può essere considerato vero apprendimento. Biosogna tornare sugli argomenti trattati nelle guide anche più di una volta, sia per colmare quelle mancanze che sono rimaste all'atto della prima lettura, sia per allargare le proprie conoscenze. Tutto procede come nella costruzione di puzzle, in cui i tasselli vengono aggiunti uno alla volta ed, a volte, dopo avere dato una certa sistemazione, bisogna spostarne qualcuno per arrivare a formare la corretta immagine complessiva.
 :2birre:  :ciao:  :ciao:
:ciao:

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: passaggio di variabili tramite classi
« Risposta #5 il: 17 Aprile 2011, 01:48:22 »
poi magari se si va a quardare l' effettivo consumo di memoria il passaggi di variabili tra funzioni implica l' utilizzo di spazio in memoria per due  variabili (una nel form che la invia e una per il form o funzione che la riceve) mentre con una variabile "globale" l' allocamento è sempre uguale ma probabilmente per un periodo più lungo.

Non è proprio così...onestamente non so come gambas gestisca "internamente" le variabili passate alle funzioni ma negli altri linguaggi una variabile può essere passata per valore o per riferimento. La differenza è netta. Nel primo caso la funzione che riceve il parametro crea una "copia" della variabile e modifica quella lasciando intatta l'originale mentre nel secondo caso si va a modificare la variabile passata poichè si conosce la sua posizione in memoria. Il tuo ragionamento è giusto se Gambas usa i passaggi per valore..

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: passaggio di variabili tramite classi
« Risposta #6 il: 18 Aprile 2011, 10:42:23 »
1) i concetti di passaggio "per valore" e "per riferimento", sono stati inseriti nella versione 3 di gambas, per cui applicabili solo in questa release. Con gambas2 gli oggetti (non le variabili) vengono sempre passate per riferimento, ovvero attraverso il suo indirizzo in memoria, e quindi le modifiche apportate nelle funzioni modificano l'oggetto originale.
2) i concetti di PRIVATE, PUBLIC e STATIC si trovano un pò in tutti i linguaggi, e esprimono definizioni ben precise. Puoi trovare descrizioni complete in tutte le doc dei linguaggi più conosciuti.

Ad ogni modo:

1) una variabile STATIC si alloca uno spazio in memoria fisso, che viene liberato solo alla chiusura dell'applicazione. Questo fa sì che il suo contenuto sia accessibile per tutta la vita del programma. L'accesso viene modificato dalle keyword PRIVATE/PUBLIC, che ne definiscono rispettivamente:
     a) PRIVATE: la visibilità è solo all'interno della stessa classe (se definito in un oggetto), o all'interno di un modulo.
     b) PUBLIC: visibile a tutto
2) una normale variabile PRIVATE o PUBLIC nasce quando viene richiesto, e muore quando non serve più (es. quando viene chiuso un'oggetto).
3) i le definizioni di cui sopra sono applicabili sia a variabili che a metodi/funzioni. La differenza stà nel fatto che la funzione contiene solo una parte di codice.
4) le varibili definite all'interno di un metodo o funzione, vivono e muoiono all'interno di questa, e non sono utilizzabili dall'esterno.

Inoltre, riprendendo l'idea delle variabili passate come parametro ad un'oggetto, queste sono auspicabili per non creare copie inutili di dati che magari vengono usati solo una volta. Nell'esempio, picavbg ha supposto il passaggio del titolo di una form, e questo è un giusto approccio, perchè è inutile mantenere una stringa statica che contiene lo stesso valore applicazto alla proprietà .Text della form.
Un esempio di variabile statica, potrebbe eessere una variabile che viene usata come identificatore univoco all'interno dell'intera applicazione. Questo può essere fatto solo con una variabile di questo tipo, che quindi giustifica l'utilizzo di spazio fisso in memoria. Se supponiamo di mettere questa variabile in un oggetto dinamico, ci permetterà, ogni volta che creiamo un oggetto di quel tipo, di dargli un identificatore unico, incrementando il valore della variabile statica, e associandolo ad una variabile interna della classe. Questa cosa è possibile perchè la var statica manterrà a vita l'ultimo valore aggiornato, a prescindere da dove si trovi (es. all'interno di un oggetto, o quant'altro).

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: passaggio di variabili tramite classi
« Risposta #7 il: 18 Aprile 2011, 13:09:11 »
1) i concetti di passaggio "per valore" e "per riferimento", sono stati inseriti nella versione 3 di gambas, per cui applicabili solo in questa release. Con gambas2 gli oggetti (non le variabili) vengono sempre passate per riferimento, ovvero attraverso il suo indirizzo in memoria, e quindi le modifiche apportate nelle funzioni modificano l'oggetto originale.

Ecco...non sapevo quale approccio usasse Gambas..ora so... ;)