A continuación encontrarás traducido al castellano el artículo escrito por Martin T. y publicado originalmente en el Blog oficial de Xojo.
Si ya has estado utilizando Xojo durante algún tiempo entonces probablemente estés familiarizado con las directivas condicionales del compilador como, por ejemplo, #If TargetMacOS o #If DebugBuild. Pero existen dos variantes especialmente útiles que generalmente solemos subestimar en el desarrollo del día a día: #If False y #If True. En este artículo veremos qué hacen estas directivas, cuando utilizarlas y por qué suponen una mejor opción en comparación con los comentarios habituales bajo ciertas circunstancias.
¿Qué es la Compilación Condicional?
La compilación condicional te permite incluir o bien excluir secciones completas de código de la aplicación final, basándose para ello en una determinada condición. A diferencia de lo que ocurre con la instrucción If en tiempo de ejecución, esta decisión se toma durante la compilación. El código excluido durante la compilación condicional simplemente no existe en la aplicación compilada. does not exist in the compiled application.
#If False – Excluye completamente el código
#If False
MessageBox("Esta línea nunca se compilará")
Var result As Integer = DoSomething()
#EndIf
Cuando la condición es False, entonces el compilador ignorará el bloque de código. No se compilará, y no se incluirá en la aplicación final, e incluso tampoco se comprobará si existen errores de sintaxis. El código será, de hecho, invisible por completo para el compilador.
¿Por qué no comentarlo, simplemente?
A primera vista, #If False parece proporcionar el mismo resultado que el comentario; pero existen algunas diferencias clave:
1. Los comentarios anidados no suponen un problema
Si un bloque de código ya contiene comentarios, el hecho de dejar de comentar todo el bloque se convierte en un follón rápidamente:
' Var x As Integer = 42 ' Valor por omisión ' Var y As Integer = x * 2 ' duplícalo ' ' Este ya es un comentario
Con #If False, todo permanece claro:
#If False Var x As Integer = 42 ' Valor por omisión Var y As Integer = x * 2 ' duplícalo ' Este ya es un comentario #EndIf
2. Código incompleto o deficiente
En ocasiones quieres mantener el esbozo de una porción de código aun no finalizada sin que deje de funcionar la compilación. Dado que el compilador simplemente se saltará los contenidos del bloque #If False, el código contenido en el interior de dicho bloque puede contener incluso errores de sintaxis:
#If False ' Enfoque experimental – aun no completado Var data As = LoadFromServer( ProcessResult(data #EndIf
Este código no resultaría útil como comentario dado que tendrías que eliminar el comentario de cada línea individualmente. Con #If False, simplemente se evita.
3. Desactivar con rapidez grandes bloques de código
En el caso de secciones de código grandes, #If False / #EndIf resulta incluso más práctico en comparación con añadir el prefijo ‘ en cada línea. Además, el bloque se puede reactivar instantáneamente con sólo cambiar False a True.
#If True – Incluir siempre el Código
#If True
MessageBox("Siempre se compilará esta línea")
#EndIf
Un bloque #If True se compilará siempre; se comporta de forma idéntica al código habitual. Esto podría parecer inútil a simple vista, pero tiene algunas aplicaciones prácticas.
¿Cuándo es útil #If True?
1. Conmutación rápida durante el desarrollo
Imagina que estás trabajando en una característica y quieres activar o desactivar ciertas secciones de código:
#If True ' <- Definir a False para desactivar la nueva característica ' Nueva Característica Var service As New CloudSyncService service.SyncNow() #EndIf
Con sólo cambiar True a False puedes desactivar la característica sin tener que borrar o eliminar el comentario de cualquier código.
2. Marcador de posición para futuras condiciones
En ocasiones ya sabes que una sección de código estará sujeta a una determinada condición; como puedan ser una plataforma o tipo de compilación. Mediante #If True puedes preparar la estructura por adelantado:
#If True ' Por hacer: Cambia a TargetMacOS una vez que esté lista la opción para Windows Var folderPath As String = SpecialFolder.Applications.NativePath #EndIf
3. Agrupado visual del código
En métodos largos, #If True puede ser de utilidad como un bloque visual de estructura para resaltar código relacionado:
#If True ' --- Inicialización ---
Var db As New SQLiteDatabase
db.DatabaseFile = dbFile
db.Connect
#EndIf
#If True ' --- Carga los datos ---
Var rs As RowSet = db.SelectSQL("SELECT * FROM users")
#EndIf
Definir Constantes personalizadas del Compilador
Xojo también te permite definir tus propias constantes para realizar compilaciones condicionales.
#If kEnableLogging
WriteToLog("La aplicación se ha iniciado")
#EndIf
Esto te permite controlar características como funcionalidad de depuración de una forma centralizada mediante el uso de una constante, sin necesidad de que debas de modificar el código propiamente dicho.
Buenas prácticas
- #If False en vez de utilizar comentarios de forma masiva. Supone la solución más limpia en el caso de grandes bloques de código que han de desactivarse de forma temporal.
- Añade un comentario. Documenta siempre por qué se ha desactivado un bloque:
#If False ' Desactivado hasta que esté solucionado el bug #1234 ProcessCriticalData() #EndIf
- No usar de forma permanente. Los bloques #If False no deberían de permanecer en el código de forma indefinida. Si ya no se necesita el código, elimínalo. Si es necesario, actívalo.
- Opta preferiblemente por las directivas del compilador. Cuando tengas que lidiar con código específico de una plataforma, utiliza las constantes específicas (como TargetMacOS, TargetWindows, etc.) en vez de #If True o #If False.
- Evita los anidados. Si bien es posible anidar bloques #If, utilízalos con cautela dado que pueden reducir con rapidez la legibilidad del código.
Conclusiones
Las directivas #If False e #If True son herramientas simples pero potentes en el desarrollo diario con Xojo. Ofrecen una alternativa más clara en comparación con simplemente comentar grandes bloques de código, permitir la activación rápida de una característica durante el desarrollo, y permiten conservar una base de código estructurada y multiplataforma. Cuando se utiliza de forma sensata, permiten ahorrar tiempo y contribuyen a mejorar la organización incluso en proyectos de gran tamaño.
Si quieres convertir automáticamente una selección de código en un bloque #If / EndIf, entonces puedes hacerlo mediante la opción del menú contextual “Wrap In > #If / #EndIf”.
¡Feliz programación con Xojo!