viernes, 12 de febrero de 2021

Gestión de mensajes

La gestión eficiente de mensajes merece una atención especial en el campo de la construcción de software por dos razones: reutilización y, opcionalmente, internacionalización. La reutilización es común a todas las aplicaciones; resulta tedioso tener que escribir un mensaje de error varias veces a lo largo de un programa. Respecto a la internacionalización, la escritura de dicho texto directamente en el código fuente hace inviable que el sistema pueda traducirse a otros idiomas.

Existen dos formas de optimizar la gestión de mensajes: una, dependiente del entorno de desarrollo, consiste en utilizar archivos de recursos específicos de aquél en los cuales pueden definirse diferentes mensajes en varios idiomas; la otra, independiente, utiliza archivos propios o tablas en la base de datos para la gestión de mensajes. Me centraré en la segunda, al ser más general, teniendo en cuenta que no todos los entornos facilitan el trabajo con archivos de recursos.

La solución es tan sencilla como definir una serie de tablas como las siguientes: 

Tabla

Campo

Tipo

Error

Id

int32

Id_Language

int32

Code

int32

Message

varchar(512)

 

 

 

Tabla

Campo

Tipo

Language

Id

int32

Name

varchar(32)   

donde a continuación se muestran valores de ejemplo:

Id

Id_Language

Code

Message

1

1

1

El valor {0} de la variable/parámetro '{1}' debe estar en el rango {2}.

2

1

2

La variable/parámetro '{0}' no puede ser nulo o vacío.

3

2

2

Variable/parameter '{0}' can't be null or empty.

[...]

[...]

[...]

[...]

Id

Name

1

Spanish

2

English

[...]

[...]

De igual modo, se crea una clase Error con un código similar al propuesto (en este caso, en C#):


public static class Error
{
  // Deben corresponderse a los identificadores equivalentes
  // de la tabla Error

  public enum EError { InvalidRange = 1, EmptyOrNull = 2, […] }
  public enum EErrorType { Error, Fatal }

  public void PrintError(EError eError, params Object[] aoValue) {
    Print(EErrorType.Error, eError, aoValue);
  }

  public void PrintFatal(EError eError, params Object[] aoValue) {
    Print(EErrorType.Fatal, eError, aoValue);
  }

  private void Print(EErrorType eErrorType, EError eError,
    params Object[] aoValue) {
    MessageBox.Show(Messaje(eError, aoValue), ErrorType(eErrorType));
  }

  prívate string ErrorType(EErrorType eErrorType) {
    return eErrorType == EErrorType.Error ? "Error" : "Fatal";
  }

  private string Message(EErrorType eErrorType, EError eError,
    params Object[] aoValue) {
    return String.Format(MesssagePattern(eError), oValue);
  }

   private string MessagePattern(EError eError) {
    return (Database.MessajeError((int)eError,
      (int)Config.CurrentLanguage).ToString();
  }
}

Donde Database y Global son clases estáticas para acceso a información de la base de datos (en este caso, el mensaje del error) y para almacenar la información de configuración de la aplicación, respectivamente.


Con este código y el correspondiente cuidado al cargar la tabla en la base de datos, pueden gestionarse fácilmente los mensajes de error. Asimismo, la modificación del texto de los mensajes de error y la inclusión de nuevos idiomas no necesita la parada del sistema.

No hay comentarios:

Publicar un comentario