Voulez-vous un moyen simplifié d’utiliser des objets partagés, en suivant la syntaxe classique des objets et en appelant automatiquement use/end use lorsque c’est nécessaire ?
Attachez vos ceintures; voici les classes partagées !
Création et gestion des classes partagées
Avec 4D 20 R5, nous avons ajouté un nouveau concept : Les classes partagées.
Les classes partagées ne peuvent être utilisées que pour créer des objets partagés et, de ce fait, simplifient leur utilisation. Pour créer une classe partagée, il suffit d’ajouter le mot clé shared à son constructeur :
//class SharedClass
shared Class constructor()
Les classes partagées ne peuvent pas être utilisées pour créer des objets standards : chaque fois que vous appellerez new() pour créer un nouvel objet de cette classe, il s’agira d’un objet partagé.
Fonction de classe shared
Le mot-clé shared peut également être utilisé pour les fonctions de classe, indiquant que cette fonction modifie l’objet. Il n’est pas nécessaire d’appeler use et end use à l’intérieur de la fonction, puisqu’ils sont automatiquement appelés lors de l’appel et de la sortie de la fonction. Ceci est évidemment valable pour le constructeur singleton.
shared Function myFunction()
This.attribute:="whatever"
Bien entendu, vous devez faire attention lorsque vous utilisez le mot-clé shared pour des fonctions qui n’en ont pas besoin afin d’éviter de bloquer d’autres processus qui essaient d’utiliser l’objet.
L’utilisation correcte des classes et fonctions partagées devrait vous permettre de manipuler vos objets partagés comme s’il s’agissait d’objets normaux, ce qui simplifiera votre code.
Considérations sur l’héritage
Un dernier point auquel vous devez faire attention est que les classes non partagées peuvent hériter des classes partagées, mais que les classes partagées ne peuvent pas hériter des classes non partagées. Planifiez donc votre modèle objet en conséquence.
Exemple
Supposons que vous ayez un long calcul à effectuer et que vous préfériez utiliser un worker pour éviter de bloquer vos processus importants. Mais il est évident que vous devez récupérer le résultat du calcul à un moment donné. Utilisons la 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
Pour l’utiliser, il suffit de faire :
$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
J’espère que les classes partagées vous aideront à utiliser des objets partagés dans votre application. Si vous avez des questions, n’hésitez pas à les poser sur le forum 4D.