août
2009
Dans une fonction qui se veut libre d’effets de bord, certaines operations qui semblent anodines peuvent compromettre la propriété désirée de la fonction. Par exemple, le chargement d’une classe en mémoire.
Quand dodo charge une classe en mémoire pour la première fois il crée normalement une instance de cette classe qui est utilisée comme prototype pour tous les objets de la classe. Si la classe comprend un constructeur sans paramètres, ce constructeur est utilisé. Mais un constructeur n’est pas libre d’effets de bord. Il peut faire des opérations qui sont visibles pour d’autres parties du programme.
D’un autre côté, même si un tel constructeur n’est pas défini pour la classe, l’initialisation d’un attribut de l’instance ou de la classe peut causer le chargement d’une autre classe. Le chargement de cette autre classe n’est pas toujours sans effets de bord.
Pour conserver la propriété « libre d’effets de bord » de la fonction, il est nécessaire de charger la classe sans effets de bord. Cela signifie que si la classe en question possède un constructeur sans paramètres, ou que l’une des classes utilisées par cette classe doit être chargée avec des effets de bord, la classe ne peut pas être complètement initialisée dans la contexte de la fonction.
En conséquence une fonction peut terminer en erreur simplement du fait qu’elle déclare un objet d’une classe qui n’a pas été initialisée.
Pour éviter que cela n’arrive il faut charger la classe en mémoire dans un constructeur appelé avant la fonction. Par exemple, il pourrait être le constructeur de la classe qui contient la fonction, ou le corps principal du programme ou d’une librairie.