Compilación Condicional en Xojo: #If False e #If True

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!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *