Execução dentro de um bloco

21 visualizações
Pular para a primeira mensagem não lida

André Körbes

não lida,
24 de mai. de 2013, 10:44:2424/05/2013
para dotnetar...@googlegroups.com
Olá pessoal,

Estou desenvolvendo uma classe para fazer log, onde tenho até agora dois métodos, um para fazer log de exception e um para log de mensagem em geral.

O problema é que meu arquivo de log tem que ter no máximo 5mb, então antes de escrever qualquer coisa, eu preciso ver se esse tamanho foi ultrapassado e tomar alguma ação. E como essa classe tem que ser thread-safe, tudo isso precisa acontecer dentro de um lock. Ou seja, meu esqueleto dos dois métodos está assim:

try
{
    PrepareWrite()
    
    Escreve no log
}
catch (Exception e)
{
    Debug.WriteLine(e.ToString())
}
finally
{
    TerminateWrite()
}

O problema é que esse esqueleto está repetido hoje em dois métodos (o da exception e da mensagem), mas essa classe pode crescer no futuro, e eu não quero essa mesma estrutura se repetindo, correndo o risco de ser esquecida, alterada, etc.

Pensei em algumas soluções:

- Usar esse esqueleto em apenas um método privado, e a parte do "Escreve no log" ser um Action. Isso seria bem fácil de fazer com lambda, mas hoje estou preso no .net 2.0 e fica bem chato criar delegates pra cada função.

- Criar um scope guard implementando IDisposable e transformar esse bloco num using em cada função. Ainda teria repetição mas me parece mais elegante. O problema é que esse scope guard faria um lock no construtor e um unlock no Dispose. Se alguém no futuro usar essa classe de forma errada, estaria com um grande problema.


O que vocês acham? Tem alguma solução mais elegante para esse problema? Aceito sugestões!

André




Thiago de Menezes Cristo

não lida,
24 de mai. de 2013, 11:01:2924/05/2013
para dotnetar...@googlegroups.com
André,

Conheço pouco de patterns (estou estudando isso agora), mas na hora que vi seu problema me veio o Template Method na cabeça e deve servir pra você. Seu código seria algo do tipo abaixo. Viajei?


Abs

using System;
 
namespace DoFactory.GangOfFour.Template.Structural
{
  class MainApp
  {
    /// <summary>
    /// Entry point into console application.
    /// </summary>
    static void Main()
    {
      LogWritter excLog = new ExcepctionLog();
      excLog.Write();
 
      LogWritter msgLog = new MessageLog();
      msgLog.Write();
 
      Console.ReadKey();
    }
  }
 
  abstract class LogWritter
  {
    public abstract void PrepareWrite(); 
public abstract void WriteLog(); 
public abstract void TerminateWrite();
    
    public void Write()
    {
try
{
PrepareWrite()
WriteLog(); 
}
catch (Exception e)
{
Debug.WriteLine(e.ToString())
}
finally
{
TerminateWrite()
}
    }
  }

  class ExcepctionLog : LogWritter
  {
    public override void PrepareWrite()
    {
      ....
    }
    public override void WriteLog()
    {
      ...
    }
public override void TerminateWrite()
    {
      ...
    }
  }
 
  
  class MessageLog : LogWritter
  {
    public override void PrepareWrite()
    {
      ....
    }
    public override void WriteLog()
    {
      ...
    }
public override void TerminateWrite()
    {
      ...
    }
  }
}



Thiago de Menezes Cristo


2013/5/24 André Körbes <andre....@gmail.com>

--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetar...@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitec...@googlegroups.com
Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo ".Net Architects" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para dotnetarchitec...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Antonio Pedro

não lida,
24 de mai. de 2013, 12:40:2124/05/2013
para dotnetar...@googlegroups.com
Existem tantos frameworks para log (costumo usar log4net) na internet, você realmente precisa fazer isso?

Att,

Antonio Nascimento


From: thiago...@gmail.com
Date: Fri, 24 May 2013 12:01:29 -0300
Subject: Re: [dotnetarchitects] Execução dentro de um bloco
To: dotnetar...@googlegroups.com

Renato Cantarino

não lida,
24 de mai. de 2013, 12:41:3524/05/2013
para dotnetar...@googlegroups.com
elmah

Att,
Renato Cantarino

André Körbes

não lida,
24 de mai. de 2013, 12:46:0024/05/2013
para dotnetar...@googlegroups.com
Pessoal, antes que continuem a vir sugestões de frameworks de log, que eu não tenho liberdade para usar, o problema pode ser colocado de diversas formas diferentes, não só para log, que é o meu caso.
E mesmo que esses frameworks resolvam o problema, como eles resolvem?

@Thiago, gosto da ideia do template method, e é uma coisa que talvez aplique quando a classe crescer mais (se for o caso), pois é bastante infraestrutura necessária para manter a interface clean que eu tenho hoje (Tracer.Exception e Tracer.Message).

André

Luiz Carlos Faria

não lida,
24 de mai. de 2013, 13:45:3624/05/2013
para dotnetar...@googlegroups.com
No OA eu uso o log em conjunto com alguns padrões, como Exception Handler e Trace Handler, que fazem o trabalho sujo e automático de log. Possuo uma abstração que permite output inclusive no Log4Net e NLog, pois as mensagens de log possuem um padrão bem mais complexos do que os propostos por esses frameworks de log. Graças a essa abordagem ainda posso usar um mecanismo de filas para armazenar e persistir meus logs (Lucene.Net + DB).

Entendo a necessidade do André, e acredito que estes pensamentos possam ajudar.


Em 24 de maio de 2013 13:46, André Körbes <andre....@gmail.com> escreveu:
deia do template metho


Responder a todos
Responder ao autor
Encaminhar
0 nova mensagem