Buenas prácticas trabajando con parámetros o configuración del sistema



En éste artculo repasaremos algunas buenas prácticas sobre la utilización de parámetros para resolver temas como:
  • ¿Donde se utiliza cierto parámetro?
  • ¿Por qué tengo dos claves de parámetro para la misma configuración?
  • ¿Como resolver el valor por defecto del parámetro?
  • ¿Como almacenar parámetros?

Estructura y almacenamiento

Para el almacenamiento recomiendo una estructura atributo valor, la cual es elástica, por lo que no quedamos atados a una estructura en particular.

En este sentido, podríamos tener la estructura siguiente:

Parameters
* ParameterKey - VarChar(32)
* ParameterValue VarChar(512)

Para el caso de las claves (ParameterKey), es importante que sean descriptivas. Si fuesen numéricas, cada vez que ingresemos a revisar la base de datos, necesitamos la lista de mapeo para encontrar el parámetro deseado.
En lo que respecta a si la clave es case sensitive, se recomiendan lo más simple posible a fin de evitar errores en queries y otros. Por lo que se debiera establecer un solo case, ya sea mayúscula o minúscula.

Los tipos de datos utilizados dependerán del tipo de aplicación y cardinalidad de esta la tabla. Por lo que los expuestos funcionan a modo de ejemplo.

Métodos accesores y modificadores

Ya que tenemos definida la estructura, como buena práctica de desarrollo, es importante concentrar la lógica para la manipulación de la misma en un solo lugar.
Para ello, simplemente podremos definir dos procedimientos o métodos:
  • ParameterGet( in:ParameterKey, out:ParameterValue)
  • ParameterSet( in:ParameterKey, in:ParameterValue)
Como queda claro en el nombre de cada uno, ParameterGet retorna el valor de un parámetro y ParameterSet lo establece, realizando un upsert.

A su vez, conviene definir una serie de wrappers o envoltorios a fín de simplificar la utilización de parámetros, para no estar realizando conversiones innecesarias cada vez, ej.:
  • ParameterBoolGet( in:ParameterKey, out:BoolValue)
  • ParameterIntGet( in:ParameterKey, out:IntValue)
  • ParameterDecimalGet( in:ParameterKey, out:DecimalValue)
Ejemplo de "ParameterBoolGet":

&ParameterValue = ParameterGet( &ParameterKey)
&BoolValue.FromString( &ParameterValue)

Importante: No copiar la lógica de ParameterGet dentro de estos wrappers. De otra forma estaríamos duplicando código.

Encapsularlos en un procedimiento (gx) o función

Esto nos permite dos cosas:
  1. Tener una referencia de nuestros parámetros, lo que nos permite saber en donde están siendo utilizados.
  2. Un solo lugar encargado de la lógica del parámetro. Por ejemplo, su valor por defecto.

Para ejemplificar el caso, imaginemos estamos trabajando en un sistema el cual tiene un impuesto parametrizado. En ese caso, podríamos tener el siguiente proc o función:

Firma: ParameterTaxGet( out:&TaxValue)

&TaxValue = ParameterDecimalGet( Parameters.Tax)

// Se establece el valor por defecto
if &TaxValue.IsEmpty()
   &TaxValue = 22
   
   // Eventualmente, en algunos casos es necesario persistirlo en la DB
   ParameterSet(  Parameters.Tax, &TaxValue.ToString())
endif

Como se peude ver, la lógica queda encapsulada en un solo lugar y permite la manipulación completa del parámetro.

Ultimas consideraciones

Evitar escribir la clave del parámetro en el código

Al no escribir la clave-parámetro en el código, nos adelantamos a posibles errores de escritura y de referencias al parámetro.

Para esto, alcanza con definir un enumerado que contenga las claves de parámetros. Esto a su vez nos posibilita tener una idea clara de los parámetros utilizados en nuestro sistema.

Utilizar parámetros solo para la configuración del sistema

Se debe identificar si lo que queremos guardar como parámetro, es realmente un parámetro o si se trata de una salida facil para no crear las estructuras adecuadas.

Veamos el siguiente ejemplo del uso inadecuado de parámetros:

ParameterKey ParameterValue
CUSTOMER INVOICE MODE - 5 CREDIT
CUSTOMER INVOICE MODE - 6 DEBIT
CUSTOMER INVOICE MODE - 7 CREDIT

Aquí se puede ver que se establece un modo de factura para cada ID de cliente (5, 6, 7).

Como podemos visualizar, lo que se está reigistrando no es una configuraión del sistema, sino más bien una configuración a nivel de la entidad Customer. En este caso, convendría crear este atributo en dicha entidad.

Auditoría

Este punto dependerá de cada sistema, pero es importante dejar nota que se podrían disponer algunos atributos más, en la tabla de parámetros, en los cuales quede registrado fecha-hora y usuario que modificó el registro.

Comentarios

  1. Although casinos could earn some cash from meals, leisure, and other venues, the breadwinner for the industry is the video games. A significant portion of casino income are outcome of|the 다파벳 results of} the accrual of the entire losses from casino patrons annually. The house benefit obviously isn’t insurmountable—people do win . However, it does mean that the extra you play, the extra the maths works in opposition to you, and the better the possibilities are of you strolling out of the casino with less cash in your wallet than if you came in.

    ResponderBorrar
  2. Baskets are helpful when you could have} items to store and nuisance if you don’t. No extra worrying about scarce counter house end result of|as a outcome of} with this superior 3D print thought, have the ability to|you presumably can} merely fold up and stowaway the basket if you don’t have want for it. This cool 3D print will be an actual game changer for you should you like to color. It matches completely on your thumb and could be helpful for wiping your brush down when switching colours, mixing small amounts of colors Shower Caps for element work and extra. This is one other superb 3D print for those of us who like to journey. This collapsible journey coat hanger will fix all your hotel residing woes.

    ResponderBorrar

Publicar un comentario

Entradas más populares de este blog

Enviando nuestros logs a Kibana rápido y simple

Resumen de lo que nos trae el upgrade 9 de GeneXus 17

Buenas prácticas al registrar logs en desarrollo de software