Volete un modo semplificato di usare gli oggetti condivisi, seguendo la sintassi classica degli oggetti e chiamando automaticamente use/end use quando necessario?
Allacciate le cinture: arrivano le classi condivise!
Creazione e gestione delle classi condivise
Con 4D 20 R5 abbiamo aggiunto un nuovo concetto: Classi condivise.
Le classi condivise possono essere utilizzate solo per creare oggetti condivisi e, in quanto tali, ne semplificano l’uso. Per creare una classe condivisa, è sufficiente aggiungere la parola chiave shared al suo costruttore:
//class SharedClass
shared Class constructor()
Le classi condivise non possono essere utilizzate per creare oggetti standard: ogni volta che si chiama new() per creare un nuovo oggetto di questa classe, questo sarà un oggetto condiviso.
Estensione alle funzioni di classe
La parola chiave shared può essere usata anche per le funzioni di classe, indicando che questa funzione modifica l’oggetto. Non è necessario chiamare use e end use all’interno della funzione, perché vengono chiamati automaticamente quando la funzione viene chiamata ed esce. Questo vale ovviamente per il costruttore di singleton.
shared Function myFunction()
This.attribute:="whatever"
Naturalmente, bisogna fare attenzione quando si usa la parola chiave shared per funzioni che non ne hanno bisogno, per evitare di bloccare altri processi che cercano di usare l’oggetto.
L’uso corretto di classi e funzioni condivise dovrebbe consentire di manipolare gli oggetti condivisi come se fossero oggetti normali, semplificando il codice.
Considerazioni sull’ereditarietà
Un ultimo punto a cui prestare attenzione è che le classi non condivise possono ereditare dalle classi condivise, ma le classi condivise non possono ereditare dalle classi non condivise. Quindi, bisogna pianificare il modello di oggetti di conseguenza.
Esempio
Supponiamo di dover eseguire un lungo calcolo e di preferire l’uso di un worker per evitare di bloccare i processi importanti. Ma, ovviamente, è necessario recuperare il risultato del calcolo a un certo punto. Utilizziamo questa classe CalculationResult:
// class CalculationResult
shared Class constructor()
This.isFinished:=False
Function makeCalculation()
...
This.finished:=True
shared Function set finished($finished : Boolean)
This.isFinished:=$finished
shared Function get finished()->$finished : Boolean
$finished:=This.isFinished
Per usarla, basta fare:
$calculation:=cs.CalculationResult.new()
CALL WORKER("AnyWorker"; Formula($calculation.makeCalculation()))
While (Not($calculation.isFinished))
//Code that will be executed while the calculation is in progress
End while
Spero che le classi condivise vi aiutino a utilizzare oggetti condivisi nelle vostre applicazioni. Se avete domande, non esitate a farle nel forum 4D.