2012-06-26 7 views
0

내 로깅 문을 들여 쓰는 방법을 찾고있었습니다. 약간의 인터넷 검색 및 검색 후 그래서 내 로그 작성기 문을 들여 쓰기 처리 할 내 log4net 래퍼 내에서 들여 쓰기 클래스를 구현했습니다.C# 함수의 오버로드 ++ 연산자

지금은 들여 쓰기를 늘리거나 줄이기 위해 thees 메서드를 호출해야합니다.

_logger.Indent.Increase(); 
_logger.Debug(msg); 
... 
_logger.Indent.Decrease(); 

그러나 모든 기능에이 두 개의 여분의 줄이 있으면 불필요하게 코드가 오염됩니다. 더 나은 방법으로이를 수행 할 수있는 구문 캔디 방식이 있습니까? 아니면 완전히 다른 방식으로 사용해야합니까?

어쨌든 이것은 좋을 것입니다! : P

_logger.Debug(msg)++; //Increase indent for this logger statement and all to come. 
_logger.Debug(msg)--; //Decrease Indent and logg... 
+0

나는 또 다른 문제를 해결하기 위해 IoC Ninject를 사용하고있다. Logger는 InSingeltonScope()이다. indentCount가 생성자에서 로거를 취하는 모든 새로운 클래스 내에서 0으로 리셋되기 때문에 정적 전역 싱글 톤을 갖는 것과 실제로 같지 않습니다. :/ – furier

+0

'++ '를 들여 쓰기로 정의하고'--' 안 들려? 코드를 이해하고 유지하는 데 어려움을 겪게 될 것이므로이 경로를 따라 가지 말 것을 강력히 권합니다. 코드를 보면서이 모든'++'와'-'연산자를 볼 미래의 개발자는 WTF 순간을 가질 것입니다. – MattDavey

+0

대신 LogScope 구현을 사용하고 ++ 및 - 연산자 오버로드 대신에 증가 및 감소 들여 쓰기를 유지했습니다. – furier

답변

2

당신은 당신이 사용할 수뿐만 아니라 로거를 증가시키고 각각 들여 쓰기를 감소하고, Debug (및 Warn, Error 등)가 반환하는 로거 자체에 대해 정의 된 ++-- 연산자를 가질 수 더 나은, (하지만 때문에 선행 증가에 괄호) 구문 아마 완벽하지 : [INC | DEC] 나에게

// Increment the indent, then log a message 
(++_logger).Debug(msg); 

// Log a message then decrement the indent 
_logger.Debug(msg)--; 

는이 사전을 사용한다는 점에서 약간 더 의미가 rement 운영자는 "말을하는지 [INC | dec] 들여 쓰기, 다음에 메시지를 기록 "하고 post- [inc | dec] rement 연산자 메시지 의미 " [inc | dec] 들여 쓰기"를 의미합니다.

public sealed class LogScope : IDisposable 
{ 
    private readonly Logger _logger; 

    public LogScope(Logger logger) 
    { 
     _logger = logger; 
     ++_logger; 
    } 

    public void Dispose() 
    { 
     --_logger; 
    } 
} 

은 그럼 당신은 할 수 있습니다 : 다음과 같이

++_logger; 
--_logger; 

당신은 또한 새로운 클래스를 정의 할 수 있습니다 : 이렇게

도 사용 증가를 조정할 수 있습니다

_logger.Debug("This message is not indented"); 

using (new LogScope(_logger)) 
{ 
    // Anything logged within the using block will be indented 
    _logger.Debug("This message is indented"); 
    using (new LogScope(_logger)) 
    { 
     // LogScopes can be nested such that logging here will be double-indented 
     _logger.Debug("This message is double-indented"); 
    } 
    _logger.Debug("This message is back to single-indent"); 
} 

// Logging here will revert to the original indent 
_logger.Debug("This message is not indented"); 
+0

끝내 줘서 고맙겠습니다. 나는 특히 LogScope 아이디어를 좋아한다! 아마도 모든 try/catch 블록을 훨씬 잘 처리 할 것입니다. 코드를 오염시키는 문을 덜어 내십시오 .Decrease 문 – furier

+0

주석을 만들 수 있습니까? 래핑 할 모든 함수 위에 [들여 쓰기]를 써야합니다. (새로운 LogScope()) {// 여기 코드} 블록에서? – furier

+0

@furier NInject에 익숙하지 않지만 래핑 된 객체의 주석이 달린 메소드에 대한 호출이 LogScope를 포함하도록 객체를 래핑 할 수 있지만 래핑 된 객체의 "외부"로부터의 호출에만 적용됩니다 , 충분하지 않을 수도 있습니다. 이 질문을 별도의 질문으로 할 수도 있습니다. – Iridium

0

디버그 기능이 로거를 들여 개체를 반환하고, 들여 쓰기 클래스 안에 당신이 ++ 정적 암시 적 연산자를 가지고 할 수있는 경우 -, 당신은 단지 그렇게 할 수 있습니다. 이게 네가 말하는거야?

+0

그래, 생각해보십시오. :) – furier

+0

hmmmmm ... 작동하지만, ++ 연산자를 사용하여 문장을 들여 쓰지는 않을 것입니다. :/ – furier