Entendiendo la Necesidad de Plantillas en VB
En programación, el principio DRY—“No te Repitas”—es esencial para escribir código limpio, eficiente y mantenible. Este principio se vuelve particularmente crítico al trabajar con lenguajes como Visual Basic para Aplicaciones (VBA), donde la redundancia es común debido al soporte limitado para técnicas de abstracción como las plantillas en C++.
Si te encuentras con múltiples fragmentos de código que realizan funciones similares en diferentes tipos de objetos, es hora de considerar una solución más eficiente. Surge la pregunta: ¿Cómo podemos consolidar operaciones similares sin recurrir a código repetitivo?
Vamos a profundizar en cómo puedes aprovechar las plantillas (de alguna manera) dentro de VBA o, preferiblemente, utilizando herramientas más nuevas cuando sea aplicable.
El Problema: Fragmentos de Código Repetitivos en VBA
Considera el siguiente ejemplo donde tenemos dos fragmentos de código que esencialmente hacen lo mismo para diferentes tipos:
Dim i as Obj1
Set i = RoutineThatReturnsObj1()
i.property = newvalue
Dim i as Obj2
Set i = RoutineThatReturnsObj2()
i.property = newvalue
En este caso, queda claro que ambas rutinas realizan una asignación y una operación de establecimiento de propiedad, pero en diferentes tipos de objetos. El programador desea crear una solución más generalizada que reduzca la redundancia.
La Solución Intencionada
Creando una Rutina General
Para eliminar el código repetitivo, el programador sugiere una rutina que pueda manejar ambos escenarios:
Sub MyRoutine(o as ObjectType, r as RoutineToInitializeObject, newvalue as value)
Dim i as o
Set i = r
i.property = newvalue
End Sub
Sin embargo, es importante notar que VBA nativo carece de las sofisticadas capacidades de plantillas que se encuentran en lenguajes como C++. Por lo tanto, lograr un efecto similar dentro de las limitaciones de VBA puede ser un desafío.
La Alternativa: Usando .NET con VBA
Mientras que VBA tradicional no soporta genéricos o plantillas como C++, la transición a las Herramientas de Visual Studio para Office (VSTO) ofrece una alternativa viable. Si estás dispuesto o puedes modernizar tu enfoque, puedes usar genéricos en .NET.
Implementando Genéricos
Aquí te mostramos cómo puedes utilizar genéricos en un contexto de .NET:
Function MyRoutine(Of O)(R As Delegate, newvalue As Object) As O
Dim i As O = CType(r.Method.Invoke(Nothing, Nothing), O)
' Necesitas otro parámetro para especificar qué propiedad usar
' y luego usar reflexión para establecer el valor'
i.property = newvalue
return i
End Function
En este ejemplo:
- Of O representa un parámetro de tipo que puede ser especificado en tiempo de ejecución.
- CType se utiliza para convertir el valor de retorno del delegate invocado en el tipo deseado.
- Para establecer el valor de la propiedad, se emplea reflexión, lo que proporciona acceso dinámico a las propiedades especificadas, algo que no es posible en VBA tradicional.
Conclusión
Aunque VBA tradicional carece de las características de plantillas vistas en lenguajes de programación más avanzados como C++, hay métodos alternativos para minimizar la repetición de código. Usando las Herramientas de Visual Studio para Office con .NET, puedes aprovechar los genéricos para crear estructuras de código dinámicas y reutilizables.
Si te encuentras escribiendo frecuentemente código similar a través de varios tipos de objetos dentro de tus proyectos VBA, considera modernizar tu entorno de desarrollo. Adoptar estos cambios no solo mejora la claridad del código, sino que también se alinea con las mejores prácticas en desarrollo de software.
Al entender las limitaciones y posibilidades dentro de VB, puedes escribir código más limpio y eficiente y adherirte al principio DRY de manera efectiva.