mercredi 21 mars 2007

Propriétés et Méthodes Statiques en LotusScript


En Java et JavaScript les propriétés et méthodes statiques sont partagés par toutes les instances d'une classe donnée. Les membres non statiques sont liés aux objets d'une classe, ils appartiennent à l'instance d'une classe ainsi les instances de la classe File partagent la propriété statique pathSeparator qui dépend du système d'exploitation, alors que les propriétés getAbsolutePath( ) et canWrite( ) diffèrent d'un objet à un autre et que la méthode delete( ) produit un résultat différent selon l'objet qui l'exécute. Il est inutile d'instancier des objets pour utiliser les membres statiques et la propriété pathSeparator de la classe java.io.File est référençable en codant File.pathSeparator ou bien java.io.File.pathSeparator.

Il peut être utile de créer en LotusScript des méthodes ou des propriétés de classe. Considérez une classe Platform et ses deux propriétés Newline et supportsCOM. Bien que ces propriétés varient selon le système d'exploitation, elles sont constantes pour toutes les instances de la classe Platform pour un client Notes ou serveur Domino donné. Imaginez la classe Trigo d'un paquetage LotusScript.math ses méthodes sin(), cos() et une propriété statique Pi aux précisions décimales supérieures à celles offertes nativement en LotusScript par la constante Pi et les fonctions trigonométriques.

Bien que le langage LotusScript ne dispose pas de membres statiques au niveau où Java et JavaScript les proposent, vous pouvez les implémenter de façon similaire avec une syntaxe très proche. La propriété Release de la classe LotusScript.lang.Interpreter disponible dans le projet libre OpenDOM sur le site www.openntf.org permet d'illustrer celà.

Private Release As String
Release = lsi_info( 6 )

Alors que ces deux lignes initialisent très simplement la version de l'interpréteur LotusScript, je leur préfère le codage défensif suivant destiné à protéger la variable globale Release de toute modification :

Static Private Property Get INTERPRETER_RELEASE As String
Static this As String
If this = "" Then this = Lsi_info( 6 )
INTERPRETER_RELEASE = this
End Property ' LotusScript.lang.Interpreter.RELEASE property

La version LotusScript réduite de la classe publique Interpreter s'écrit comme suit :

Public Class Interpreter '
Property Get RELEASE As String '
Me.RELEASE = INTERPRETER_RELEASE
End Property ' LotusScript.lang.Interpreter.RELEASE
End Class ' LotusScript.lang.Interpreter Class

De cette façon tous les objets instanciés de la classe Interpreter partagent une propriété RELEASE qualifiable de statique comme en Java ou JavaScript. La syntaxe Interpreter.RELEASE est implémentable dans la bibliothèque "LotusScript.lang" de la manière suivante :

Static Public Property Get Interpreter As Interpreter
Static this As Interpreter
If this Is Nothing Then Set this = New Interpreter
Set Interpreter = this
End Property ' LotusScript.lang.Interpreter class

Deux courtes classes et deux propriétés supplémentaires suffisent à mentionner le chemin pleinement qualifié d'une classe comme dans LotusScript.lang.Interpreter.RELEASE :

Public Class lang '
Public Property Get Interpreter '
Set Me.Interpreter = LANG_INTERPRETER
End Property ' LotusScript.lang.Interpreter
End Class ' LotusScript.lang.* Package
Public Class LotusScript '
Public Property Get lang As lang '
Set Me.lang = LOTUSSCRIPT_LANG
End Property ' LotusScript.lang.* Package
Public io As Variant ' As io__ '
Public net As Variant ' As net__ '
End Class ' LotusScript.* Package

Static Private Property Get LOTUSSCRIPT_LANG As lang
Static this As lang
If this Is Nothing Then Set this = New lang
Set LOTUSSCRIPT_LANG = this
End Property ' LotusScript.lang.* package
Static Public Property Get LotusScript As LotusScript
Static this As LotusScript
If this Is Nothing Then
Set this = New LotusScript
End If
Set LotusScript = this
End Property ' LotusScript.* package

Réutiliser complètement la bibliothèque "LotusScript.lang" dans un agent, un masque ou une vue se résume à :

Use "LotusScript.lang"
Msgbox LotusScript.lang.Interpreter.RELEASE,, _
"LotusScript.lang.Interpreter.RELEASE"
' OU BIEN
With LotusScript.lang
Msgbox Interpreter.RELEASE,, _
"Interpreter.RELEASE"
End With

dimanche 11 mars 2007

Eradiquer l'infâmant « Public symbol is declared in another module: V_EMPTY »


Inclure les fichiers *.lss demeure le cauchemar des programmeurs Notes. En effet, de nombreux développeurs ont abandonné la pratique de %INCLUDE "LsConst.lss" ou d'autres bibliothèques dans leur code. Nombreux son ceux qui redéfinissent des constantes privées dans leurs bibliothèques, masques ou vues, ce qui n'est pas recommandable.

Une solution aurait été de définir les constantes globales du LotusScript et de Notes au sein d'un fichier .lsx connu de "Domino Designer". Mais IBM/Lotus n'a apparemment pas envisagé celà.

Jusqu'à maintenant, ma solution consiste à créer une bibliothèque "LsConst" référençable au sein des éléments de conception. Les constantes ne doivent être déclarées ni publiques ni privées et la bibliothèque débute par Option Public. Les bibliothèques, les masques ou les vues la référencent par Use "LsConst" et incluent indifféremment Option Private | Public et/ou Option Explicit | Declare; notez cependant que Option Declare est vivement recommandé !

Les avantages sont multiples :
  • "LsConst" est référençable SIMULTANEMENT dans les bibliothèques, les masques, les vues etc.. elle est INTEGRALEMENT réutilisée.
  • Les constantes présentes au sein des bibliothèques liées SONT accessibles e.g. je peux référencer la constante LSI_THREAD_CALLPROC dans mon code avec USE "LsConst" puisque la bibliothèque "LsPrcVal" est enchâssée dans "LsConst".
  • La taille des bibliothèques de script est réduite, (code source et code objet) en référençant "LsConst" comme décrit précédemment.
  • Aucune Option de compilation n'est imposée au développeur.
  • La bibliothèque "LsConst" n'est pas nécessaire en production (sauf dans les rares cas où les bibliothèques de script sont dynamiquement chargées à l'exécution...)
Quelques inconvénients demeurent:
  • L'installation d'une nouvelle version de Notes ou Domino nécessite une relecture attentive des librairies Lsconst.lss, Lserr.lss, Lsxbeerr.lss et lsxuierr.lss.
Les bibliothèques "LotusScript.exceptions" et "LotusScript.lang.Lsconst", du project public OpenDOM, exploitent ce mécanisme et sont consultables sur www.openntf.org.

Locations of visitors to this page