Feedback su v22 e reflection

Buongiorno a tutti…
Ho visto solo ieri le note di rilascio della 22, e non ho ancora testato nulla.
Tuttavia ringrazio, e con molto trasporto, gli sviluppatori di Progamma per aver esteso le funzionalità di reflection alle proprietà oggetto, ed aver implementato quel sistema di concep flessibili e personalizzabili (la proprietà description), a cui anelo da anni.

IMHO:
Si tratta della evolutiva più importante rilasciata per INDE da anni a questa parte, e vi giuro che mi ha fatto ritrovare un po’ di quell’entusiasmo per inde che dal 2014 ad oggi è stato messo a dura prova.
Se qualcuno non ha chiari i benefici di questo aggiornamento, si sta perdendo il meglio che inde può dare, ovvero la potentissima reflection, rara da trovare in ambiente rad, e consiglio vigorosamente di approfondire questo aspetto, si aprirà un mondo.
Ho avuto anche l’impressione che diversi miglioramenti o correzioni sono andati in direzioni simili o comunque importanti, net core è una gran cosa, ed ho provato enorme sollievo vedendo che non sono stati fatti ulteriori sforzi nel tentativo di infilare su inde l’interfaccia di cloud.

Insomma, una bella release (non ancora testata!) e nel mio piccolo volevo testimoniarlo.

Una richiesta come corollario: il terzo elemento critico della reflection era forse il più banale da risolvere, ma comunque limitante: solo una parte dei metodi e proprietà presenti nelle librerie è attualmente mappata anche nelle relative istanze generalizzate (le varie IDpanel, IDcollection, IDbox e via dicendo): alcune sono riuscito a mapparle io (ricordo il .name di IDcollection) , altre proprio mancano, soprattutto tra quelle che dovrebbero gestire le classi CSS (la cui gestione fu una delle ultime belle novità del 2013, dopodiché arrivò cloud, per cui si persero molte di queste integrazioni).
Potreste quindi dedicare un po’ di tempo a confrontare i due ambienti ed inserire i metodi mancanti?
sarebbe una gioia avere il pacchetto completo.

Chiunque voglia commentare è il benvenuto, mi piacerebbe sentire il parere di altri, anzi, pubblico anche in community, forse uno spazio più adatto.

2 Mi Piace

Ok, ho testato per l’intero weekend:
L’intenzione era il refactoring di un architettura esistente, con lo scopo di semplificarla.
Quello che vi riporto e propongo non sono quindi astratte speculazioni, ma veri problemi che si sviluppano nell’utilizzo.

Non ho trovato malfunzionamenti nelle funzioni introdotte, tuttavia sono necessari due aggiustamenti/integrazioni, pena forti handicap nell’utilizzo delle stesse.

  1. nella ID Property Definition è necessario (come l’aria che respiriamo!!) inserire la proprietà library !
    Oltre al fatto di poter distinguere banalmente un IDdocument da un IDarray etc…, in molti casi è necessario costruire un istanza dell’oggetto: la maggior parte delle volte si tratta di classi applicative. Indipendentemente dal metodo utilizzato per la creazione (tipicamente .getFromDNA(), io mi sono creato una factory più veloce), senza conoscere la library siamo bloccati. Per proseguire il test, ho realizzato un metodo che cerca di indovinare la library dal UIname, funziona nei test ma non è affidabile e non è concettualmente corretto.

  2. in caso l’object sia una collection, è importante poter accedere alla proprietà childrenName (in un certo modo analoga alla library di cui sopra), ma sopratutto avere a disposizione il getCollection(index_of_the_property)
    Questo punto 2 non è un vezzo: in sua assenza siamo costretti a duplicare tutto il codice di navigazione sulla struttura dati, oltre a duplicare variabili e parametri di funzioni che contengono o si riferiscono agli indici di proprietà. In certi casi è necessario un controllo per capire che proprietà e collection, elaborati in due cicli diversi, non coincidano. In pratica tutto il codice si complica, e non poco.
    La possibilità di fare quanto specificato renderebbe tutto più lineare, chiaro, univoco, meno soggetto ad errori, sopratutto in caso di manutenzione o modifica.

note sulla 2:
All’inizio avevo pensato ad una sorta di “cast” della ID Property Definition alla ID Collection Definition, ma in effetti quest’ultima ha molte meno proprietà della prima: l’unica mancanza è proprio childrenName, ma come detto si potrebbe usare library, tutto sommato sono equivalenti (?) Però ci vorrebbe un boolean o metodo .isCollection per la corretta gestione. Tuttavia (esempio in chiave personale), poichè ogni mia collection ha un nome con un pattern preciso, potrei facilmente distinguerla dall’UIname, quindi nel mio caso il booleano sarebbe un optional, ma lo introdurrei comunque per coerenza del sistema.
La getCollection si potrebbe implementare artigianalmente cercando in effetti una collection con lo stesso UIname della proprietà (da quella ricaveremmo anche childrenName), però sarebbe molto più comodo averla nativa: nota inoltre che la proprietà UIname di ID Collection Definition non è mappata nativamente (ma perchè??), ho dovuto farlo io.

I due punti sopra sono fondamentali nella pratica, ne aggiungo un terzo, meno importante ma comunque sensato, vi invito a ragionarci

  1. fintanto che siamo in questa fase iniziale, ne approfitterei per organizzare diversamente gli attuali metodi
    Ovvero, che cosa significa “other_properties”?? beh, io lo so perfettamente, ho aspettato queste funzioni per anni, ma mettevi nei panni di un nuovo utente, o di un primo approccio alla reflection: le funzioni normali operano sulle proprietà scalari pubbliche, quelle “other” sulle scalari private e sulle object. Per distinguere le private dalle objec ho a disposizione la proprietà private… ma cosa succede se ho una proprietà sia object che private? ok, si trova la soluzione, si usa data type, ma capite che la cosa è male organizzata?

Do per scontato sia necessaria la retro-compatibilità, ma ragionate un secondo:
Se la retro-compatibilità non fosse necessaria avremmo due soluzioni naturali e logiche:
A- un’unica serie di metodi, per enumerare e gestire tutte le proprietà, con due booleani (nel property definition) che indicano se private e/o se object
B- due serie di metodi, come sopra, una dedicata alle proprietà scalari ed una alle object, con la sola proprietà booleana private
Se vogliamo mantenere la retrocompatibilità:
A- un’unica serie di metodi (quella attuale), con due flag opzionali per includere gli object e/o le private, e due relativi booleani nel property definition
B- due serie di metodi, una per le scalari (quella attuale), e una per le object (nuova), entrambe con il solo flag private

Quindi, non si tratta di non riuscire a lavorare (come il punto 1 e 2) , ma di rendere il sistema più razionale per chiunque dovrà utilizzarlo. Considerando il valore che rappresenta la reflection dentro ad inde, io ci investirei un attimo di tempo e farei le correzioni proposte.
Immagino di essere l’unico che ha provato a lavorare con queste nuove funzioni, siete ancora nella fase calda della implementazione, impatto ed effort saranno minimi.

1 Mi Piace

Vorrei aggiungere, in un topic differente, quanto manca a rendere la reflection di inde uno strumento completo, organizzato ed efficiente.

Qui affronto un secondo punto, ovvero l’utilizzo di concept (o tag se preferite) definiti a design time (ed eventualmente modificabili runtime).
Inde prevede un sistema di concetti, ma è debole, limitato e di scarsa utilità, in quanto:
1 - si può applicare solo ai campi di database
2- i concetti stessi sono mutui esclusivi, non possono coesistere sullo stesso elemento
oltre ad altre amenità, tipo l’ereditarietà forzata dai campi fino alle property definition

Quello che serve è una banalissima proprietà stringa, ma comune e presente in tutti gli elementi del framework (documenti, campi db, form, pannelli, proprietà, book, box, etc etc etc, TUTTI), con un nome a vostro piacere (stringConcept, charTags, jollyField, quello che vi aggrada) che possa essere sempre letta (ed eventualmente anche scritta, perchè no) dai vari metodi della reflection.

Come ciliegina sulla torta, sarebbe ottimo un metodo che lavori sull’indice proprietà, .isConceptPresent(index), che restituisca un booleano dopo aver cercato in tale proprietà (un find() di testo) il concetto/stringa passato.

Un esempio a caso di come potrebbe apparire detta proprietà:
“:deep2 :globalfilter :needrecalc :sortreverse :etc”
o qualsiasi altra combinazione di qualsiasi carattere che possa essere letta in reflection ed interpretata secondo le esigenze.

Note:

  • Allo stato attuale, si può ottenere qualcosa di analogo, usando impropriamente altre proprietà degli oggetti dell’ide, e magari riducendo a singoli caratteri i concetti rappresentabili (cose tipo _RPX_altra roba, dove R, P ed X sono tre concetti prefissi ad una proprietà leggibile)
    In questo senso attualmente uso un mix di: codice (tag nel property definition), watermark (sbiancato poi con i CSS), mask (nei pulsanti), code (per gli elementi dei book), name (nelle ID collection definition), caption (questo ultimamente lo ho sostituito con setTag e getTag).
    Certo, alla fine funziona, ma capite che razza di delirio?
  • Il metodo .isConceptPresent(index) non è necessario, ma la sua implementazione ci solleverebbe dal dover ogni volta istanziare la ID property definition, accedere la nostra stringConcept, e fare un check sul risultato del find. Decisamente una comodità, e probabilmente anche un guadagno in performance (facendo direttamente in java o C#)
  • l’uso della proprietà description, come suggerito, non è una buona idea: non è presente in tutti gli elementi, in molti di questi è utilizzato come tooltip e sarebbe visibile all’utilizzatore, dove ciò non avviene, essendo naturalmente un text viene già spesso usato per inserire commenti vari ed appunti di sviluppo.
  • la presenza di un campo, di una proprietà dedicata proprio a questi string concept o tag, renderebbe più leggibile il progetto, senza che un secondo sviluppatore si stupisca dello strano contenuto della proprietà mask o magari cambi il code di un box non aspettandosi alcuna ripercussione pratica sulla esecuzione, che invece ci sarà.

Mi fermo qui, ma spero di essere riuscito a trasmettere i vantaggi della soluzione proposta, sopratutto in termini di coerenza, chiarezza ed usabilità del sistema.

1 Mi Piace

@theguru grazie dei tuoi suggerimenti li giro a Luca Baldini.

@theguru gli sviluppatori di Pro Gamma ringraziano del tuo apprezzamento dei loro sforzi.

Grazie. Ho inserito tutto anche su forum e together, vi sto spammando! :slight_smile:
finche il ferro è caldo :slight_smile:

Mi interessa molto comprendere la segnalazione di @theguru per quanto riguarda la nuova proprietà stringa concept.

Non è già assimilabile alla proprietà concept di IDPropertyDefinition?
Allego un piccolo progetto per mostrare come può essere usata e letta.
test DO Concept.zip (468,8 KB)

Ho capito male? Può essere già utilizzabile in questo modo?

Ciao G, grazie della risposta.
In effetti ho cercato di essere più chiaro possibile riguardo all’utilità dei concept, nel post sopra.
So che INDE integra i concept, e se non erro anche un sistema di ricerca nella reflection (hasConcept() o simile), il problema sono i limiti architetturali.
Ti riporto quanto espresso sopra, dimmi se sto sbagliando.
Il “concept” attuale di INDE:
1 - si può applicare solo ai campi di database
2- i concetti stessi sono mutui esclusivi, non possono coesistere sullo stesso elemento

Per capirci, io vorrei poter applicare uno o più concept ad un pulsante, una box di un libro, una proprietà unbounded, etc.
Non arrivo a chiedere di poterlo applicare alle procedure, anche se questo aiuterebbe molto, non potendo, allo stato delle cose, passare una funzione/procedura come parametro.

Grazie del tuo interesse, ad ogni modo per adesso la priorità (in questo ambito), è fornire l’accesso alla proprietà library, ovvero, una volta trovato un object dentro ID_document_structure, poter capire di che oggetto si tratta :slight_smile:

EDIT: un modo diverso per spiegare quanto detto al posto precedente è, banalmente, un hashtag.
immagina che ogni elemento (campo db, proprietà, pannello, form, classe, campo pannello, book, box, […]) abbia un nuovo campo di testo, sempre raggiungibile da reflection, da valorizzare in questo modo:
#filterProp #hasList #antani #needRecalc #etcetera
ok, sto esagerando con i tag ma rende l’idea.