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