2011-03-24 2 views
11

이 질문은 당분간 머리가 고개를 들고 있습니다 ... 로깅을 유용하게 사용하려면 코드에 모든 것이 있어야하지만 코드를 읽기가 어렵게 만듭니다. 다음 코드와 같습니다 :소스 코드 오염없이 로깅을 소개합니다

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; 
} 

소스 코드의 가독성을 떨어 뜨리지 않기위한 전략이 있습니까?

답변

7

Aspect oriented programming은 로깅과 같이 cross-cutting concerns을 도와야합니다. postsharp하지만 더 전통적인 방법에 의지하지 않으면 로그 된 내용에 대해 아주 세부적으로 제어 할 수 없습니다.

+0

나를 이길 : – Pondidum

+0

동의. PostSharp는 입력/종료 유형 로깅을 처리합니다. 나는 이걸 위해 사용한거야. 멋진 점은 PostSharp가 실제로 인수의 값을 쓸 수 있다는 것입니다. – RQDQ

+1

Unity Framework도 Spring.NET과 마찬가지로 AOP를 제공합니다. – DaveRead

-2

소스 코드가 나에게 잘 어울립니다. 실제로 로그 메시지를보고 각 메시지 2 개가 무엇인지 파악할 수 있기 때문에 사실 가장 좋습니다.

은 비록 한 가지 _ 그것은 참으로 의, 날 귀찮게한다_logger에.

일부 로깅 API는 같은 단축 API를 제시하는 경향이 :

방법의 위 또는 당신의 방법
l.d("debug") 
l.c("critical") 
...etc 

모두 좋은 이럴입니다.

편집

당신은 아직도 그것에 대해 뭔가를하고 싶은 경우, 단지 #regions에 로깅 라인을 감아을 축소합니다.

+6

이름 지정 표준에 동의하지 않습니다. 모든 변수와 메소드 이름은 로깅을 포함하여 설명 적이어야합니다. 코드의 표준을 혼합하면 읽는 것이 더 어려워집니다. – jgauffin

+0

Imho 맛이 좋습니다. 만약 당신이 l.c ("") 종류의 디버깅을 **하지만 ** 단지 ** 당신을한다면, 이것이 소스 가독성을 전혀 해치지 않을 것이라고 생각합니다. 실제로 그것은 로깅 기능이 호출되는 것이 아니라 메시지 자체를 강조 표시합니다. 나는 오늘까지 둘 다 사용 해왔다. 나는 가독성 문제가 전혀 없다. – CoolStraw

1

몇 가지 규칙을 따를 수 있습니다.

1) 실제로 "상대하고있는"오류 만 기록하십시오.

2) 모든 메소드의 시작과 종료시 디버깅 문을 사용할 필요가 없도록 AOP를 사용하여 메소드를 래핑하십시오. 또한 AOP 호출에 메소드의 들어오는 및 나가는 매개 변수/응답을 기록하게 할 수 있습니다. 코드가 너무 너무 때문에 로깅 이럴 측면 위버 같은 PostSharp

0

봐는 복잡하다. 솔리드 원칙을 읽어야합니다.

예를 들어 독자 코드를 별도의 메소드로 이동하십시오.

3

에서

+0

감사합니다. –