lunes, 2 de julio de 2018

DYN365 | Macros O Constantes

Vamos a explicar en contexto lo que es una macro y una constante en DYN365FO, como también porque usar una u otra.

Constante.

Una constante representa un valor que nunca cambia.En AX2012 no existía este tipo de variable que ahora en DYN365 ya cuenta con ello y estas constantes son campos cuyos valores se establecen en tiempo de compilación y no se pueden cambiar en tiempo de ejecución. 

Para definir una variable constante declaramos de esta manera:

class Constants
{
    public const double Pi = 3.14159;
    public const int SpeedOfLight = 600000;
}

Macros.

Son fragmentos de código los cuales no se puede ejecutar de forma independiente, pero se puede usar en cualquier lugar donde se pueda escribir código en el sistema, por ejemplo en Jobs, clases y formularios. En AX2012 como en DYN365 el nodo Macros contiene las macros utilizadas por la aplicación estándar. 




Además de ver el código existente, puede agregar sus propias macros.

Definición de macros

class Macros
{
  #define.MyMacro("Value");
}

Puede usar macros de la misma manera que lo hicimos en AX 2012. Sin embargo, en algunos casos es imprescindible esto para la reutilizar bloques de código. Por ejemplo

class SecurityDigitClass
{

    static void MyMacroInSelect()
    {
        Bom  bom;
        date emptyDate;
   
        // parameters: %1 = table instance, %2 date, %3 empty date value
        #localmacro.bomDateFilter
        && ( %2 == dateNull() || (
            ((%1.FromDate <= %2) && (%1.ToDate >= %2)) ||
            ((%1.FromDate == %3) && (%1.ToDate == %3)) ||
            ((%1.FromDate <= %2) && (%1.ToDate == %3)) ||
            ((%1.FromDate == %3) && (%1.ToDate >= %2))
            ))
    #endMacro
        ;
   
        while select bom
    where bom.ItemId == '123'
    #bomDateFilter(bom, systemDateGet(), emptyDate)
        {
            info(bom.bomid);
        }
    }

}

¿Macro o Constate?

En DYN365 X++ ahora el tipo de variable constante con la  palabra clave const es compatible, podemos y debemos usar CONS (Constantes) como vemos a continuación presentamos el uso de ambos.


 #define.macroValue("Macro value");

 const str constValue = "Constant value";
   info(strFmt("%1 - %2",#macroValue, constValue));



Para usar "const" de la misma manera que estábamos usando antes con un archivo Macro, debe reemplazarlo por una "clase estática". 

static class ConstClass()
 {
    static const public str constValue = "Constant value";
 }

Usando la clase constante

str constValue = constClass::ConsValue;



Microsoft recomienda usar "const" en lugar de "macro", y enumeran algunos beneficios:

  • IntelliSense en el editor.
  • Soporte para "Ir a definición" en el editor.
  • Control total del tipo de la constante.
  • Compilación más rápida: las macros son notoriamente difíciles de manejar para el compilador.



En resumen el uso de macros fue poderoso para también reutilizar bloques de codificación.
En la compilación, la parte macro se insertará en la codificación, lo que requiere tiempo de compilación adicional.Por esta razón, trate de evitar el uso de macros. 
Microsoft apunta a obtener compilaciones lo más rápido posible,por esta razón, podría ocurrir que las macros se deprecien en el futuro.

Además del rendimiento, las macros rompen muchas herramientas de desarrollo. Si usa macros para insertar bloques de código, ninguna de las herramientas de desarrollo puede ver ese código. Así que cosas como las herramientas de actualización de código, los complementos de Visual Studio y cualquier herramienta futura nunca podrán comprender las macros, ya que esas herramientas funcionan en contra del código, y las macros no se "resuelven" (reemplazan) hasta la compilación.

Por todos estos motivos ya descritos apostamos a que se utilice lo menos posibles macros y usemos ya constantes, y no arriesguemos a una penalizacion de rendimiento al usar macros.