It is currently 21 February 2020, 11:34 Advanced search

parametri output... ma funzionano??

Domande e risposte su come utilizzare Instant Developer Foundation al meglio

Re: parametri output... ma funzionano??

Postby d.termini » 16 September 2019, 6:34

theguru wrote:Quindi ti chiedo, all'interno di INDE, non potendo passare le var per riferimento, quale strategia suggerisci di usare in casi come quello sopra? ritornare un idmap? istanziare una classe con una serie di proprietà e passare quella (articolato e laborioso)? mettere tutto in un array di parametri? (...)

A me è stato suggerito di usare IDMap e così faccio, resta sempre dover scrivere 21 + altre righe di codice e non avendo i parametri espliciti diventa un po' ostico capire cosa passare alla funzione… ma almeno funziona.
Chiaramente questo solo nel caso debba lavorare con oggetti.
d.termini
 
Posts: 677
Joined: 13 November 2017, 8:41

Re: parametri output... ma funzionano??

Postby theguru » 16 September 2019, 19:07

mah, ci ragiono un po' su, magari facendo qualche prova, pensavo anche di all'idea di implementare una classe ad hoc con metodo e variabili integrate, e passare l'istanza alle varie sezioni del codice..
l'indicazione ti era stata data direttamente dalla assistenza di progamma?
User avatar
theguru
 
Posts: 770
Joined: 29 January 2014, 13:01

Re: parametri output... ma funzionano??

Postby d.termini » 17 September 2019, 6:28

theguru wrote:mah, ci ragiono un po' su, magari facendo qualche prova, pensavo anche di all'idea di implementare una classe ad hoc con metodo e variabili integrate, e passare l'istanza alle varie sezioni del codice..
l'indicazione ti era stata data direttamente dalla assistenza di progamma?

Sì, era la soluzione ufficiale ProGamma (avevo segnalato un malfunzionamento)
Anche io avevo pensato ad usare oggetti con variabili specifiche, solo che con InDe è un po' una rottura doverli definire ogni volta che ne serve uno nuovo, oltre al fatto che bisogna istanziarli etc, e alla fine sono tornato alle IDMap.
d.termini
 
Posts: 677
Joined: 13 November 2017, 8:41

Re: parametri output... ma funzionano??

Postby theguru » 17 September 2019, 7:11

grazie.
la IDMAP te la fai restituire con return, corretto?
User avatar
theguru
 
Posts: 770
Joined: 29 January 2014, 13:01

Re: parametri output... ma funzionano??

Postby d.termini » 17 September 2019, 7:41

No, la passo come variabile, sul return di solito mi faccio restituire un booleano che mi indica se è andato tutto bene durante la valorizzazione (mi è più comodo da usare negli if), ad esempio mi dice se un'istanza di documento è stata caricata da DB o è nuova e inizializzata per l'inserimento.
d.termini
 
Posts: 677
Joined: 13 November 2017, 8:41

Re: parametri output... ma funzionano??

Postby theguru » 17 September 2019, 9:25

ok. anche io in effetti uso il booleano = ok
quindi vuol dire che l'idmap passato riporta sempre i parametri modificati, che immagino saranno comunque scalari.
diciamo che l'uso dell'IDmap ha l'effetto di avere una chiamata di funzione più corta, ma tutte le assegnazioni prima e dopo restano.
probabilmente bisogna proprio cambiare paradigma (non sembre possibile o vantaggioso), oppure riempire il codice di assegnazioni
Certo che è un bel buco all'interno del framework.

Oltretutto penso, se da come ha detto Lanzi il passaggio per riferimento non avviene mai, ma nel caso del flag output ne viene "simulato" il comportamento, a questo punto potevano simularlo bene, comprendendo anche proprietà e variabili di ciclo (come tutto sommato facciam noi con le variabili temporanee).

Va bene, grazie comunque delle info!
User avatar
theguru
 
Posts: 770
Joined: 29 January 2014, 13:01

Re: parametri output... ma funzionano??

Postby g.lanzi » 23 September 2019, 20:07

@theguru rispondo con ordine, in breve.

1) le motivazioni per la quale è stata scelta un'implementazione piuttosto che un'altra sono tantissime e di natura sia storica (ID scriveva in VB6) sia tecnica (i linguaggi di oggi) sia si manutenibilità (i progetti attualmente presenti). Non è esauribile in un discorso del forum e disquisire nemmeno. Lo scopo del forum è aiutare a capire come funziona il framework.

2) il punto è proprio questo, se si fa new() dentro o fuori (oltre al fatto che deve essere scalare per essere un parametro in/out). Se viene fatto variabile := new() dentro alla procedura, allora si è creato un nuovo oggetto, referenziato dalla variabile in contesto della funzione e che al di fuori di essa non sarà leggibile. Il tuo esempio del primo codice era solo uno stralcio, avrei bisogno di vederlo tutto per capire qual è esattamente il caso.

3) passando un IDMap o IDArray o simili il problema si aggira, perché anche se cambia l'istanza contenuta (perché è questo quello che succede) l'IDMap resta lo stesso e quindi è possibile leggere la nuova istanza di IDVariant anche al di fuori del metodo chiamato. Personalmente preferisco l'IDMap all'IDArray per questa implementazione. Lo preferisco anche a tanti parametri di output, perché mi permette di modificare il comportamento del metodo chiamato (per aggiungere parametri di nput/output) senza modificarne l'interfaccia.
Non importa che i valori all'interno dell'IDMap siano scalari o meno, ma che l'oggetto puntato esternamente dalla variabile IDMap passata non cambi. Dentro un IDMap puoi metterci qualsiasi cosa: da fuori sarà sempre leggibile con il valore giusto.


Non è riconosciuto come un bug del framework.

@gattonero anche in Java fare new o chiamare un metodo dell'oggetto passato a parametro (perché i tipi primitivi sono tutte istanze di IDVariant) ha lo stesso identico effetto. Non è tanto VB6, è che anche Java non ha il byRef (e non sappiamo se l'avrà un futuro linguaggio implementato da ID). Senza l'uso dei puntatori non è possibile passare un argomento ad un metodo, fare argomento = new() e leggere il valore da fuori. Net ha il byRef, Java no.


In ogni caso, sarebbe interessante per tutti dare un'occhiata al codice generato per capire questo tipo di fenomeni. Aiuterebbe a capire tante cose, se non l'avete fatto vi consiglio di farlo.
Giuseppe Lanzi
Director of Support services
Pro Gamma S.p.A.
User avatar
g.lanzi
Pro Gamma
Pro Gamma
 
Posts: 3305
Joined: 29 September 2010, 10:24
Location: Bologna

Re: parametri output... ma funzionano??

Postby d.termini » 24 September 2019, 6:43

@lanzi
Potrebbe essere utile migliorare l'"intellisense" dell'ide per indicare con più precisione cosa è possibile fare e cosa no per prevenire certi errori che magari si manifestano dopo tempo?
Ad esempio in questo problema degli oggetti ci sono cascato con il sistema che avevamo visto assieme (message handler), su un solo handler avevo implementato la restituzione degli errori tramite idmap e "casualmente" questa veniva re-istanziata nella funzione che eseguiva l'operazione invece che nel chiamante, morale: non mi ha mai dato errore perché la mappa risultava sempre vuota.

Quindi riassumendo, mettiamo che passo la variabile pippo che è un oggetto, e nel codice della funzione faccio pippo=new(), sarebbe comodo avere un warning che dica una cosa tipo "la variabile oggetto è passata alla funzione e potrebbe già contenere un'istanza, se re-istanziata si perderebbe il riferimento e sarebbe valida solo nella funzione corrente", quindi se ti va bene nascondi il warning, altrimenti sei sicuro che l'ide ti ha aiutato a non commettere una cavolata.
Stessa cosa per i foreach e il passaggio delle variabili estratte, ma lì proprio darei errore perché non funziona.
Nessuna modifica al funzionamento attuale ma un grosso aiuto per l'utente. Che ne dici?
d.termini
 
Posts: 677
Joined: 13 November 2017, 8:41

Re: parametri output... ma funzionano??

Postby theguru » 24 September 2019, 18:51

@g.lanzi
1) ok. In effetti io ho conosciuto inde nell'era post-vb6, e me ne dimentico. i motivi storici quindi ci stanno tutti.

2)
g.lanzi wrote:Net ha il byRef, Java no
ok, ma aspetta: puoi sempre passare il box della variabile scalare, quindi il suo puntatore. NON puoi riassegnarlo (new()), siamo d'accordo: ma quello che farebbe comodo è poter modificare il valore della variabile puntata, in modo da goderne anche nello scope della procedura chiamante. Il problema casomai sarebbe l'immutabilità di alcuni tipi (stringhe array..)

3) tutto chiaro.

In sintesi: non mi spiacerebbe quindi capire come funziona la vostra implementazione del flag "output"
ed in particolar modo perché non funzioni qualora venga passata come parametro una variabile estratta da un ciclo foreach (il mio esempio al post 1), oppure una proprietà di classe procedure(classe.proprieta)
Mi piacerebbe che funzionasse (e non solo a me rileggendo post indietro), ma chiudo qui, avendo preso atto della vostra posizione in tal senso.
Grazie di nuovo a tutti per i contributi :)
User avatar
theguru
 
Posts: 770
Joined: 29 January 2014, 13:01

Re: parametri output... ma funzionano??

Postby d.termini » 25 September 2019, 6:37

Cambia come viene settata la variabile.

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
d.termini
 
Posts: 677
Joined: 13 November 2017, 8:41

PreviousNext

Return to Tips & Tricks - Foundation

Who is online

Users browsing this forum: d.pierangeli, lucabaldini and 24 guests