Share via


Visual Basic 6.0: Ese gran desconocido

Después de un tiempo sin escribir, embarcado en un desafío con VB6 me gustaría aportar la información que me ha sido util y que puede servir para proyectos relacionados. Durante años Visual Basic 6.0 junto con sus variantes cercanas (ASP y VBScript) ha sido la herramienta clave para desarrollar aplicaciones Windows, Web e incluso gran variedad de componentes COM/Active X.El disponer de una sintáxis fácil, la posibilidad de obviar temas referentes a Memoria, Threads, etc, y sobre todo el diseñador grafico del IDE facilitó mucho las tareas de desarrollo. Sin embargo, no evita que nos debamos preocupar de conocer cuales son las mejores prácticas a la hora de utilizarlo:

  • La facilidad para crear componentes COM y COM+, no evita que siguiendo unas buenas prácticas podamos crear componentes muy potentes y que si no seguimos dichas prácticas podamos encontrarnos con infinidad de problemas. Lo primero que debemos tener en cuenta es que desarrollar para COM tiene una serie de ventajas y sobre todo de caracteristicas que sin embargo no son validas para COM+.
  • En un componente COM, tenemos la posibilidad de devolver objetos complejos que mantengan estado de manera que llevemos a cabo y plateamiento de Orientación a Objetos sin embargo este planteamiento dentro de COM+ sería muy perjudicial puesto que los objetos COM+ se basan en no tener estado (stateless) por lo que resulta más recomendable utilizar enumerados, arrays y estructuras como mecanismos para el manejo de datos. La explicación es que COM+ se orientó a mejorar la escalabilidad, el tiempo de respuesta y la orientación a reutilización, por lo que los objetos con estado van en contra de estos principios.
  • Otro tema a tener en cuenta es no utilizar parametros ByRef en componentes COM+ o DCOM puesto que nos podemos encontrar con problemas en el manejo de Memoria (si en VB6 es posible trastocar el comportamiento de la memoria). Los parametros ByRef (operador por defecto en VB6) son muy validos en componentes In-Proc (no COM+) para el paso de objetos que queremos modificar dentro de una función, sin embargo en otros escenarios (como es el caso de llamadas Remotas) pueden dar problemas debido a que no queda claro quien maneja esas referencias (a la hora de borrar y crear) y sobre todo que la emulación del ByRef se basa en una copia remota de dichos parametros (lo que lo lia todo un poco más).
  • Un último punto importante es el tema de Arrays COM (SAFEARRAYS) que en VB6 se manejan de una manera muy transparente, pero que no deja de ser necesario tratarlos con cuidado. Es recomendable que todo objeto almacenado en un Array debe ser eliminado tanto del array como de memoria, y para ello podemos ir elemento a elemento borrandolo, o utilizar la instrucción Erase que lo hace por nosotros.

Podría extenderme más (y lo hare con más calma) para hablar de acceso al API de Windows, acceso a referencias de Memoria y punteros, Apartamentos y convivencia con .NET. Os incluyo una referencia a la guía de Best Practices en VB6 Implementing the Business Layer Servers in Visual Basic y para la gente que se encuentre en proyectos de migración, puede ser interesante esta información: Upgrading Microsoft Visual Basic 6.0 to Microsoft Visual Basic .NET