It is currently 3 April 2020, 5:05 Advanced search

parametri output... ma funzionano??

Domande e risposte su come utilizzare Instant Developer Foundation al meglio

Re: parametri output... ma funzionano??

Postby lucabaldini » 2 October 2019, 9:31

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.


Non ho capito. Se il parametro è di tipo Oggetto:
- se lo definisci come IN/OUT perché ti aspetti che torni fuori cambiato dò errore
- se lo definisci normale non dò errore... inetrnamente ci fai quel che vuoi... e puoi ridefinirlo creandone uno nuovo... se mettessi un warning di quel tipo romperei le scatole a molti che, internamente, proprio sapendo che il passaggio non è per riferimento, hanno ridefinito il parametro per usarlo a loro piacimento.

I parametri vengono sempre passati per valore, tranne quando è esplicitamente attivato il flag IN/OUT. In quel caso è come se venissero passati per riferimento anche se in Java né in Javascript sarebbe possibile farlo.

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"

A me serve un caso in cui non funziona così che io possa correggerlo. Mi puoi far vedere un caso in cui non funziona? Cosa intendi con "non funziona con le variabili di una query foreach?
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4051
Joined: 1 October 2010, 17:03
Location: Bologna

Re: parametri output... ma funzionano??

Postby lucabaldini » 2 October 2019, 9:33

Questo caso funziona come mi aspetto:
parinrs.png
parinrs.png (29.38 KiB) Viewed 597 times
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4051
Joined: 1 October 2010, 17:03
Location: Bologna

Re: parametri output... ma funzionano??

Postby lucabaldini » 2 October 2019, 9:35

Ovviamente se il for-each è readwrite non cambia nulla.
Quel setting, infatti, è solo gestito da Instant Developer in fase di validazione per controllare che, se readonly, nessuna colonna sia usata in scrittura (a lato sinistro di un'assegnazione per intenderci).
Quindi non ha impatto sulla gestione dei parametri di input/output.
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4051
Joined: 1 October 2010, 17:03
Location: Bologna

Re: parametri output... ma funzionano??

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

lucabaldini wrote:Non ho capito. Se il parametro è di tipo Oggetto:
- se lo definisci come IN/OUT perché ti aspetti che torni fuori cambiato dò errore
- se lo definisci normale non dò errore... inetrnamente ci fai quel che vuoi... e puoi ridefinirlo creandone uno nuovo... se mettessi un warning di quel tipo romperei le scatole a molti che, internamente, proprio sapendo che il passaggio non è per riferimento, hanno ridefinito il parametro per usarlo a loro piacimento.

Esatto, ma appunto in questo topic si parlava dell'errore piuttosto comune di ridefinire il parametro per sbaglio.
Sapendo che è passato per valore non vado neanche a ridefinire l'oggetto, non servirebbe a niente se non evitare di dichiarare una nuova variabile e può portare ad errori, il riutilizzo delle variabili per scopi diversi nella stessa procedura è una bad practice e sconsigliata da tutti.

lucabaldini wrote:Questo caso funziona come mi aspetto:
parinrs.png

Non funzionava, è stato cambiato nelle ultime versioni?
d.termini
 
Posts: 725
Joined: 13 November 2017, 8:41

Re: parametri output... ma funzionano??

Postby lucabaldini » 2 October 2019, 9:56

Esatto, ma appunto in questo topic si parlava dell'errore piuttosto comune di ridefinire il parametro per sbaglio.
Sapendo che è passato per valore non vado neanche a ridefinire l'oggetto, non servirebbe a niente se non evitare di dichiarare una nuova variabile e può portare ad errori, il riutilizzo delle variabili per scopi diversi nella stessa procedura è una bad practice e sconsigliata da tutti.

Mah, non ce la faccio ad essere così ortogonale... se uno vuole può farlo... e, a volte, anche io lo faccio. Che sia "sconsigliata da tutti" non mi sentirei di dirlo. Invece di creare una nuova variabile è fattibile. Perché no?

Non funzionava, è stato cambiato nelle ultime versioni?

Non che mi ricordi.

Un suggerimento: quando vedete un caso che non vi torna, può essere utile chiedere sul forum se proprio non avete tempo né modo di replicare la cosa in un progetto semplice per segnalare l'errore. Con qualche screenshot ed il debug dovrebbe essere semplice tracciare casi di questo tipo... Può essere che ci siano casi in cui ancora non funziona (non posso certo certificarti che il generatore di codice di Instant Developer sia perfetto, magari lo fosse ;-)
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4051
Joined: 1 October 2010, 17:03
Location: Bologna

Re: parametri output... ma funzionano??

Postby lucabaldini » 2 October 2019, 10:07

Comunque, tornando al messaggio originale:
ogni volta che mi trovo a costretto a passare parametri per riferimento ad una funzione, vengono fuori malfunzionamenti a pioggia davvero destabilizzanti.


Hai un caso in cui non funziona? Vedo la definizione della funzione single_vehicle_type_operation. Vedo che hai 4 parametri di input/output (gli utlimi quattro).
Quale parametro di input/output non torna fuori? Se è possibile potresti farmi vedere come è usato quel parametro in visual code? Magari anche il codice nativo (C#/Java/Javascript) corrispondente?
Così vedo quale caso non è gestito... Io sono qui solo per questo: perché mi interessa capire se ci sono errori per poterli correggere.
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4051
Joined: 1 October 2010, 17:03
Location: Bologna

Re: parametri output... ma funzionano??

Postby lucabaldini » 2 October 2019, 10:16

Certo che è un bel buco all'interno del framework.


Non mi risulta ci siano buchi nel framework.
Dato che Instant Developer usa oggetti (tuoi oggetti o classe IDVariant) il passaggio dei parametri è sempre per "riferimento" (puoi verificare anche tu guardando il codice generato): viene sempre passato il puntatore all'oggetto passato (sia esso un oggetto o un IDVariant).
Solo per i tipi primitivi (che InDe non gestisce) viene usato il passaggio per valore.
Questo, però, non vuol dire che viene passato per riferimento il puntatore all'oggetto ma l'oggetto stesso (in C++ puoi scegliere se passare un puntatore all'oggetto (*var) o il puntatore al puntatore (**var)).
In C# dovresti scrivere "ref" per passare anche il puntatore per riferimento. In Java o Javascript non mi risulta sia possibile passare tipi nativi per riferimento... dovresti boxarlo comunque.

Dato che Instant Developer cambia il codice generato a seconda del flag OUTPUT per il programmatore è come se venissero passati sempre per valore... Il programmatore vede la variabile "int p", passa la variabile p e si aspetta che sia passata per valore, come se fosse un tipo nativo. E InDe la gestisce in quel modo, facendo sì che alla fine il valore non torni mai fuori. Lo stesso vale per gli oggetti. Viene passato l'oggetto che, se modificato internamente, non torna fuori.
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4051
Joined: 1 October 2010, 17:03
Location: Bologna

Re: parametri output... ma funzionano??

Postby lucabaldini » 2 October 2019, 10:21

Se poi si attiva il flag OUTPUT viene scritto "inout" nel Visual Code e la variabile viene trattata per riferimento.

Per le variabili di tipo oggetto non è permesso farlo. Sono quindi passate per riferimento (lo sono sempre in qualunque linguaggio se sono oggetti) ma non viene passato il puntatore per riferimento... solo la variabile... quindi all'interno del metodo è consentito cambiare le proprietà di quell'oggetto ma non il puntatore fornito... può essere fatto ma non torna fuori.

In C++ se scrivi:
Code: Select all
   void metodo(myclass *cls)
   {
      cls->par = 10;
      cls = new MyClass()
   }

La prima istruzione cambia il valore della proprietà, la seconda crea un nuovo oggetto che, però, non ha impatto sul chiamante... che quindi si trova solo il valore di par a 10. Da lì in poi, qualunque altra modifica a proprietà di cls non verrà più portata fuori... verrà eseguita su una nuova istanza di cui il chiamante non sa e non saprà nulla.

Se voglio permettere quello devo scrivere:
Code: Select all
   void metodo(myclass **cls)
   {
      (*cls)->par = 10;
      cls = new MyClass()
   }

Allora sì, la seconda istruzione crea un nuovo puntatore che viene restituito al chiamante. In C# puoi farlo con ref, in Java e Javascript no. Con InDe il secondo caso non è permesso proprio perché non riuscirei a supportarlo in tutti i linguaggi... e puoi sempre farti restituire l'istanza dal metodo se proprio serve tornare una nuova istanza.
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4051
Joined: 1 October 2010, 17:03
Location: Bologna

Re: parametri output... ma funzionano??

Postby lucabaldini » 2 October 2019, 10:26

Comunque cercando nella doc, ho trovato questi due bug:

https://doc.instantdeveloper.com/CC4CD0 ... .htm?LANG=

risolto in versione 6.6.2750 nel lontano 22/01/2008

E questo:
https://doc.instantdeveloper.com/1938C0 ... .htm?LANG=

risolto in 9.1.4040 il 28/05/2010.

Non mi risultano altri ticket aperti riguardo parametri di input/output. E non mi risulta di aver corretto qualcosa che riguardasse parametri di input/output di recente.
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4051
Joined: 1 October 2010, 17:03
Location: Bologna

Re: parametri output... ma funzionano??

Postby theguru » 2 October 2019, 15:34

lucabaldini wrote: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).


Luca grazie per questa ottima spiegazione.
User avatar
theguru
 
Posts: 776
Joined: 29 January 2014, 13:01

PreviousNext

Return to Tips & Tricks - Foundation

Who is online

Users browsing this forum: No registered users and 17 guests

cron