Classes partagées

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.

Nicolas Brachfogel
- Product Owner & Senior Developer - Nicolas Brachfogel a rejoint 4D en 2017 en tant que développeur senior (4D Server et networking) et en tant que Product Owner pour gérer la mise en production d'Apple Silicon. Il est chargé de rédiger les user stories et de les traduire en spécifications fonctionnelles, ainsi que de s'assurer que les implémentations des fonctionnalités répondent aux besoins des clients. Diplômé de l'Institut Supérieur d'Informatique Appliquée (INSIA), Nicolas a commencé sa carrière en tant que développeur de logiciels en 2001. Après plusieurs années de programmation en Java et C++, il s'est spécialisé dans le développement client-serveur pour des sociétés de jeux vidéo. En tant que développeur/architecte serveur, il a travaillé avec succès sur les architectures serveur de nombreux jeux (Dofus Arena, Drakerz, Trivial Pursuit Go !).