Classi condivise

Tradotto automaticamente da Deepl

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.

Nicolas Brachfogel
- Proprietario del prodotto e sviluppatore senior - Nicolas Brachfogel è entrato in 4D nel 2017 come Senior Developer (4D Server e networking). In qualità di Product Owner per gestire il rilascio di Apple Silicon, si occupa di scrivere le storie degli utenti e di tradurle in specifiche funzionali, nonché di assicurarsi che le implementazioni delle funzionalità soddisfino le esigenze dei clienti. Diplomato all'Institut Supérieur d'Informatique Appliquée (INSIA), Nicolas ha iniziato la sua carriera come sviluppatore di software nel 2001. Dopo diversi anni di codifica in Java e C++, si è specializzato nello sviluppo di client-server per aziende di videogiochi. Come sviluppatore/architetto di server, ha lavorato con successo alle architetture server di molti giochi (Dofus Arena, Drakerz, Trivial Pursuit Go!).