2011-03-24 8 views
11

esta pregunta me persigue en la cabeza desde hace un tiempo ... Para que el registro sea útil, debe estar allí en el código, pero luego hace que el código sea difícil de leer. Al igual que el siguiente código:introducir el registro sin contaminación del código fuente

public IDictionary<decimal, Status> GetStatus(decimal[] keys) 
{ 
    _logger.Debug("ENTERED GetStatus"); 

    IDictionary<decimal, Status> statuses = new Dictionary<decimal, Status>(); 
    string inClause = null; 

    inClause = FormatInClause(keys, inClause); 
    _logger.DebugFormat(" inClause: '{0}' ", inClause); 
    if (string.IsNullOrEmpty(inClause)) 
    { 
     _logger.Error("Key collection is null or empty."); 
     throw new Exception("Key collection is null or empty."); 
    } 

    if (!IsOpen) 
     Connection.Open(); 

    using (IDbCommand cmd = Connection.CreateCommand()) 
    { 
     cmd.CommandText = " select id, date, status " + 
      " from ORDERS where id in (" + inClause + ") "; 

     inClause = null; 

     using (IDataReader reader = cmd.ExecuteReader()) 
     { 
      int i = 0; 
      while (reader.Read()) 
      { 
       object[] values = new object[reader.FieldCount]; 

       reader.GetValues(values); 
       DebugHelper.LogValues(_logger, " reader.Read() #" + i + " reader.GetValues(values): ", values); 

       statuses[(decimal)values[0]] = new Status(
        (decimal)values[0], 
        ValueOrDefult<string>(values[1]), 
        ValueOrDefult<string>(values[2]), 
        (decimal)values[3], 
        ValueOrDefult<DateTime>(values[4])); 
       _logger.DebugFormat(" reader.Read() #{0} created new Status() ", i); 

       values = null; 
       i++; 
      } 
     } 
    } 

    _logger.Debug("EXITED GetStatus"); 
    return statuses; 
} 

¿Existe alguna estrategia para el registro que no reduzca la legibilidad del código fuente?

Respuesta

7

Aspect oriented programming se supone que ayuda con cross-cutting concerns como el registro, por ejemplo. postsharp pero realmente no puede tener un control muy detallado sobre lo que se registra a menos que recurra a métodos más tradicionales

+0

Me pegó :) – Pondidum

+0

De acuerdo. PostSharp manejará el registro de tipo de entrada/salida. Lo he usado para esto mismo. Lo bueno es que PostSharp puede escribir los valores de los argumentos. – RQDQ

+1

Unity Framework también proporciona AOP, al igual que Spring.NET – DaveRead

-2

Su código fuente se ve bien para mí ... En realidad, se ve mejor así, porque puedo ver los mensajes de registro y calcular lo que hay entre cada 2 mensajes.

A pesar de que, una cosa me está molestando, es de hecho el _ en _logger.

algunas API de registro tienden a proponer una API abreviada como:

l.d("debug") 
l.c("critical") 
...etc 

La forma por encima o por su manera son los dos muy bien en mi humilde opinión.

EDITAR

Si todavía quiere hacer algo al respecto, simplemente envolver sus líneas de registro en #regions y contraerlos.

+6

No estoy de acuerdo con el estándar de nomenclatura. Todas las variables y nombres de métodos deben ser descriptivos, incluidos los de registro. Mezclar los estándares en el código hace que sea más difícil de leer. – jgauffin

+0

Imho es una cuestión de gusto. Si le haces el tipo de material "c" ("") pero ** solo ** para su depuración, no creo que esto perjudique en nada la legibilidad de la fuente. En realidad, resaltaría los mensajes en sí mismos en lugar de a qué función de registro se llama. He usado ambos hasta el día de hoy, y no he tenido problemas de legibilidad en absoluto. – CoolStraw

1

Puede seguir un par de reglas.

1) Solo registre los errores donde en realidad está "tratando" con ellos.

2) Use AOP para ajustar sus métodos para que no tenga que tener instrucciones de depuración al ingresar y salir de todos los métodos. También puede hacer que las llamadas AOP registren los parámetros/respuestas entrantes y salientes de los métodos.

3

en mi humilde opinión que su registro está lleno, porque su código es lo mismo. Deberías leer sobre los principios SÓLIDOS.

Por ejemplo, mueva el código del lector a un método diferente.

+0

gracias, voy a analizar los problemas que ha señalado en mi ejemplo –

Cuestiones relacionadas