It is currently 8 July 2020, 15:05 Advanced search

parametri output... ma funzionano??

Domande e risposte su come utilizzare Instant Developer Foundation al meglio

Re: parametri output... ma funzionano??

Postby theguru » 27 September 2019, 12:24

d.termini wrote:Se è solo input viene riassegnata, quindi è un nuovo IDVariant e perde il riferimento
Se è in/out viene fatto il set del nuovo valore riutilizzando l'IDVariant esistente, così puoi leggerlo anche nel chiamante


è quello che pensavo/speravo infatti.
- ma se ho l'istanza di una classe "miaclasse"
- la classe ha una proprietà "prop"
- mi aspetto che internamente la proprietà prop dell'istanza miaclasse sia gestita tramite un puntatore in memoria.
- quindi perchè se chiamo func(istanza_di_miaclasse.prop), con parametro output, il valore di prop non ritorna modificato?

Avrebbe senso se internamente nel framework le istanze venissero memorizzate.. chessò, come array, e non si potesse recuperare il puntatore allo specifico elemento... però mi sembrerebbe un implementazione ben strana..
User avatar
theguru
 
Posts: 785
Joined: 29 January 2014, 13:01

Re: parametri output... ma funzionano??

Postby d.termini » 27 September 2019, 13:28

Perché quando fai così incapsula il valore di miaclasse.prop in un nuovo idvariant probabilmente, e quindi tu modifichi il valore dell'idvariant ma non di miaclasse.prop
Dovresti provare a vedere con F3 che codice viene generato.
Se fosse possibile passare per riferimento, come fai tu avrebbe funzionato, perché avrebbe passato il riferimento a miaclasse.prop direttamente.
d.termini
 
Posts: 793
Joined: 13 November 2017, 8:41

Re: parametri output... ma funzionano??

Postby g.lanzi » 2 October 2019, 7:58

@d.termini in effetti dovrebbe esserci qualcosa del genere https://doc.instantdeveloper.com/?ARTID=ED10DBF4-79AD-4C29-AA7B-796155711DA6&LANG=it .

Però si potrebbe anche aggiungere un warning per indicare che all'interno è stato fatto new(). Ho inserito un ticket di miglioramento.
Giuseppe Lanzi
Director of Support services
Pro Gamma S.p.A.
User avatar
g.lanzi
Pro Gamma
Pro Gamma
 
Posts: 3364
Joined: 29 September 2010, 10:24
Location: Bologna

Re: parametri output... ma funzionano??

Postby lucabaldini » 2 October 2019, 9:03

è quello che pensavo/speravo infatti.
- ma se ho l'istanza di una classe "miaclasse"
- la classe ha una proprietà "prop"
- mi aspetto che internamente la proprietà prop dell'istanza miaclasse sia gestita tramite un puntatore in memoria.
- quindi perchè se chiamo func(istanza_di_miaclasse.prop), con parametro output, il valore di prop non ritorna modificato?


A me il caso che descrivi funziona.
parinout.png
parinout.png (32.74 KiB) Viewed 841 times


Potresti verificare e farmi sapere se ci sono casi in cui non funziona?
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4485
Joined: 1 October 2010, 17:03
Location: Bologna

Re: parametri output... ma funzionano??

Postby lucabaldini » 2 October 2019, 9:09

Aggiungo anche che non è possibile usare parametri Input/Output di tipo oggetto:
parobjio.png
parobjio.png (15.33 KiB) Viewed 840 times


Se ci sono casi in cui il controllo fallisce mi piacerebbe saperlo :-)
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4485
Joined: 1 October 2010, 17:03
Location: Bologna

Re: parametri output... ma funzionano??

Postby lucabaldini » 2 October 2019, 9:11

Ovviamente se il parametro di tipo oggetto non è di input/output fa quel che mi aspetto:
parobj.png
parobj.png (32.21 KiB) Viewed 840 times
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4485
Joined: 1 October 2010, 17:03
Location: Bologna

Re: parametri output... ma funzionano??

Postby lucabaldini » 2 October 2019, 9:24

Comunque, riguardo i parametri di input/output.
Instant Developer utilizza una nostra classe chiamata IDVariant (che replicava l'idea del tipo VARIANT di VB e di COM+).
La classe IDVariant ci permette di astrarci dal tipo base (int, string, datetime, etc.) per poter uniformare la generazione del codice, per poter gestire i valori NULL e poter trattare allo stesso modo i tipi nativi.
Come saprete la classe DateTime di C# è una STRUCT e non un oggetto quindi una variabile di tipo DateTime nativa non può mai valere NULL... al massimo può valere DateMin (1/1/0001). Allo stesso modo il tipo "int" di Java non può mai essere null... c'è la classe Integer che, essendo una classe, può essere NULL... ma il tipo nativo no..
In altre parole tutti i linguaggi di programmazione hanno limitazioni di questo tipo. Javascript no (tutto è VAR) ma C#/Java sì.

Ora, usando l'IDVariant abbiamo anche potuto gestire i parametri di input/output.
Come funziona? Dato che passiamo l'IDVariant se questo è passato come IN/OUT Instant Developer scrive il codice diversamente.

Per esempio la riga di codice
Code: Select all
   variabile = 5;

dentro ad un metodo viene scritta così da Instant Developer:
Code: Select all
  void MioMetodo(IDVariant par)
  {
     par = new IDVariant(5)
  }

ma se il parametro è di Input/Output:
Code: Select all
  void MioMetodo(IDVariant parINOUT)
  {
     parINOUT.set(new IDVariant(5))
  }

dove il metodo set è un metodo di IDVariant e, internamente, copia il valore dall'IDVariant passato alla variabile. In questo modo il puntatore all'IDVariant (che viene passato da fuori) rimane lo stesso ma viene cambiato il valore interno alla classe IDVariant (boxing).
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4485
Joined: 1 October 2010, 17:03
Location: Bologna

Re: parametri output... ma funzionano??

Postby lucabaldini » 2 October 2019, 9:25

L'unica cosa che cambia è come Instant Developer scrive il codice all'interno del metodo dove il parametro è usato come Input/Output. All'interno del metodo, se il parametro è IN/OUT usa set altrimenti usa un'assegnazione diretta con creazione del nuovo IDVariant.
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4485
Joined: 1 October 2010, 17:03
Location: Bologna

Re: parametri output... ma funzionano??

Postby d.termini » 2 October 2019, 9:26

lucabaldini wrote:Aggiungo anche che non è possibile usare parametri Input/Output di tipo oggetto:
Se ci sono casi in cui il controllo fallisce mi piacerebbe saperlo :-)

Non fallisce, semplicemente c'è confusione nel fatto che non potendo impostare un parametro oggetto come inout si "presuppone" che questo comunque si comporti come se fosse passato per riferimento, cosa che non è.
Da qui il suggerimento di potenziare il controllo con un warning se uno tenta di fare il new di un parametro oggetto dentro la funzione chiamata.

lucabaldini wrote:A me il caso che descrivi funziona.

Ho vaghi ricordi anche io che non funzionasse, ma probabilmente c'era qualcosa di più subdolo.
Comunque non funziona con le variabili di una query foreach (molto comodo se readwrite).. oppure come dice Apple "lo stiamo scrivendo male"
d.termini
 
Posts: 793
Joined: 13 November 2017, 8:41

Re: parametri output... ma funzionano??

Postby lucabaldini » 2 October 2019, 9:27

Dimenticavo: altri vantaggi nell'usare IDVariant:
- confronti (posso decidere io come si confrontano i vari tipi: es stringhe/interi, etc...)
- conversioni (è tutto automatico, cosa che solo Javascript fa e a modo suo, in C#/Java devo esplicitamente cambiare tipo per poter confrontare... e poi dovrei usare equals per le stringhe cosa che in C# non è obbligatoria...)
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4485
Joined: 1 October 2010, 17:03
Location: Bologna

PreviousNext

Return to Tips & Tricks - Foundation

Who is online

Users browsing this forum: d.pierangeli and 53 guests