Comprendre la nécessité des templates dans VB

En programmation, le principe DRY—“Don’t Repeat Yourself”—est essentiel pour écrire un code propre, efficace et maintenable. Ce principe devient particulièrement critique lorsqu’on travaille avec des langages comme Visual Basic for Applications (VBA), où la redondance est courante en raison du support limité pour des techniques d’abstraction comme les templates en C++.

Si vous vous retrouvez avec plusieurs extraits de code qui effectuent des fonctions similaires sur différents types d’objets, il est temps de considérer une solution plus efficace. La question se pose : comment pouvons-nous consolider des opérations similaires sans recourir à un code répétitif ?

Plongeons dans la manière dont vous pouvez tirer parti des templates (dans une certaine mesure) au sein de VBA ou, de préférence, utiliser des outils plus récents lorsque cela est possible.

Le problème : des extraits de code répétitifs dans VBA

Considérons l’exemple suivant où nous avons deux extraits de code qui font essentiellement la même chose pour différents types :

Dim i as Obj1
Set i = RoutineThatReturnsObj1()
i.property = newvalue

Dim i as Obj2
Set i = RoutineThatReturnsObj2()
i.property = newvalue

Dans ce cas, il est clair que les deux routines effectuent une affectation et une opération de définition de propriété, mais sur des types d’objets différents. Le programmeur souhaite créer une solution plus généralisée qui réduit la redondance.

La solution envisagée

Création d’une routine générale

Pour éliminer le code répétitif, le programmeur propose une routine qui peut gérer les deux scénarios :

Sub MyRoutine(o as ObjectType, r as RoutineToInitializeObject, newvalue as value) 
   Dim i as o
   Set i = r
   i.property = newvalue
End Sub

Cependant, il est important de noter que le VBA natif n’a pas les capacités de template sophistiquées que l’on trouve dans des langages comme C++. Par conséquent, réaliser un effet similaire dans les limites de VBA peut être un défi.

L’alternative : utiliser .NET avec VBA

Bien que le VBA traditionnel ne prenne pas en charge les génériques ou les templates comme C++, la transition vers les Outils Visual Studio pour Office (VSTO) offre une alternative viable. Si vous êtes disposé ou en mesure de moderniser votre approche, vous pouvez utiliser des génériques dans .NET.

Mise en œuvre des génériques

Voici comment vous pouvez utiliser des génériques dans un contexte .NET :

Function MyRoutine(Of O)(R As Delegate, newvalue As Object) As O
    Dim i As O = CType(r.Method.Invoke(Nothing, Nothing), O)

    ' Vous avez besoin d'un autre paramètre pour spécifier quelle propriété utiliser 
    ' et ensuite utiliser la réflexion pour définir la valeur'
    i.property = newvalue 
    return i
End Function

Dans cet exemple :

  • Of O représente un paramètre de type qui peut être spécifié à l’exécution.
  • CType est utilisé pour convertir la valeur de retour du délégué invoqué dans le type souhaité.
  • Pour définir la valeur de la propriété, la réflexion est utilisée, offrant un accès dynamique aux propriétés spécifiées, ce qui n’est pas possible dans le VBA traditionnel.

Conclusion

Bien que le VBA traditionnel manque des fonctionnalités de templating que l’on retrouve dans des langages de programmation plus avancés comme C++, il existe des méthodes alternatives pour minimiser la répétition du code. En utilisant les Outils Visual Studio pour Office avec .NET, vous pouvez tirer parti des génériques pour créer des structures de code dynamiques et réutilisables.

Si vous vous retrouvez souvent à écrire un code similaire pour différents types d’objets dans vos projets VBA, envisagez de moderniser votre environnement de développement. Adopter ces changements améliore non seulement la clarté du code mais s’aligne également sur les meilleures pratiques en matière de développement logiciel.

En comprenant les limitations et les possibilités au sein de VB, vous pouvez écrire un code plus propre et plus efficace et respecter efficacement le principe DRY.