none
Static ou instanciar um objeto? RRS feed

  • Pergunta

  • Pessoal,

    definir uma classe, e seus métodos, de acesso a dados como "static" , para que não seja necessário instancia-la toda vez, é uma boa prática??

     

    quinta-feira, 11 de agosto de 2011 18:24

Respostas

  • Olá Eiras,

    Se o seu método vai executar alguma função mto específica e que não depende de nenhum outro atributo, ou método da classe - Utilize métodos estáticos.

    Tome como exemplo a classes Math. Todos os métodos desta classe são estáticos, pois são muito específicos e indicados para cada situação.

     

    Caso, a sua classe possua parâmetros que determinarão o seu comportamento, ou dependa de outros métodos, ou seja do tipo de classe que pode crescer com o tempo, então é melhor não utilizar métodos estáticos.

     

    Um fato curioso ocorreu comigo a um tempo atrás. Eu tinha uma classe, com um métod que executava um determinado comportamento utilizando Open XML. E esse método era bastante simples, apenas fazia uma pequena edição do XML de um documento. E estava incluso em uma classe em um método por instância.

    Esse método apesar de ser simples, demorava 15 segundos para ser executado dentro de um laço de repetição com 300 documentos.Isto é, um looping com 300 documentos, para cada documento eu chamava este método, e o looping todo demorava 15 segundos para executar.

    A fim de melhorar a performance, por ser um bloco de código mto simples, transformei o método em estático, e a execução caiu de 15 segundos para 2 segundos.

     

    Mas este é um fator que não ocorre para todos os métodos, acredito que para mim funcionou desta maneira, por ser algo muito simples, e que não exigia nenhuma instrução de condição, apenas executava uma regra no arquivo...

     

    Fica aqui a experiência...


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    quinta-feira, 11 de agosto de 2011 18:50
  • Sim e nao... depende.

    Eu pessoalmente acho uma pessima pratica.

    http://blog.goyello.com/2009/12/17/why-static-classes-are-evil/

     

    Eu diria, use com moderaçao.

     

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    quinta-feira, 11 de agosto de 2011 18:33

Todas as Respostas

  • Sim e nao... depende.

    Eu pessoalmente acho uma pessima pratica.

    http://blog.goyello.com/2009/12/17/why-static-classes-are-evil/

     

    Eu diria, use com moderaçao.

     

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    quinta-feira, 11 de agosto de 2011 18:33
  • Olá Eiras,

    Se o seu método vai executar alguma função mto específica e que não depende de nenhum outro atributo, ou método da classe - Utilize métodos estáticos.

    Tome como exemplo a classes Math. Todos os métodos desta classe são estáticos, pois são muito específicos e indicados para cada situação.

     

    Caso, a sua classe possua parâmetros que determinarão o seu comportamento, ou dependa de outros métodos, ou seja do tipo de classe que pode crescer com o tempo, então é melhor não utilizar métodos estáticos.

     

    Um fato curioso ocorreu comigo a um tempo atrás. Eu tinha uma classe, com um métod que executava um determinado comportamento utilizando Open XML. E esse método era bastante simples, apenas fazia uma pequena edição do XML de um documento. E estava incluso em uma classe em um método por instância.

    Esse método apesar de ser simples, demorava 15 segundos para ser executado dentro de um laço de repetição com 300 documentos.Isto é, um looping com 300 documentos, para cada documento eu chamava este método, e o looping todo demorava 15 segundos para executar.

    A fim de melhorar a performance, por ser um bloco de código mto simples, transformei o método em estático, e a execução caiu de 15 segundos para 2 segundos.

     

    Mas este é um fator que não ocorre para todos os métodos, acredito que para mim funcionou desta maneira, por ser algo muito simples, e que não exigia nenhuma instrução de condição, apenas executava uma regra no arquivo...

     

    Fica aqui a experiência...


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    quinta-feira, 11 de agosto de 2011 18:50
  • Willian,

     

        Desculpe, espero que não fique bravo se ver esse post, mas são duas coisas diferentes. Ele perguntou sobre métodos estáticos e você respondeu sobre classes estáticas.

        Para classes concordo com você. É necessário ter conhecimento de onde e quando usar. Um singleton no IIS já me deu muito trablaho uma vez. Agora métodos não tem muito problema. Até prefiro criar uma classe DateTimeManager, StringManager do que usar os tais HELPERs gigantes que fazem tudo.

     

    Cordialmente,

    Ricardo

    domingo, 14 de agosto de 2011 21:12
  • Ricardo.. eu nao fico bravo com ninguem... desde que nao xingem minha mae :)

     

    Mas minha interpretaçao da questao foi baseado na frase:

    "definir uma classe, e seus métodos, de acesso a dados como "static" "

     

    Mesmo assim eu nao gosto de criar metodos estaticos. Como eu disse antes " pessoalmente eu acho uma péssima pratica", mas tem gente que gosta.

    Vejamos um exemplo:

    public class Teste
    {
      public int DynTeste(int a)
      {
        return a + 1;
      }
    
      public static int StaticTeste(int a)
      {
        return a + 1;
      }
    }
    
    class use_teste
    {
      public void UseTeste()
      {
        int a = Teste.StaticTeste(1);
        Teste tes = new Teste();
        int b = tes.DynTeste(1);
      }
    }
    
    

    Ok.. o metodo estatico eu chamo direto, sem precisar cria uma instancia de Teste... mas nao vejo vantagem nisso. Por vantagem é algo que melhore sensivelmente a performance do meu sistema). 

     

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    segunda-feira, 15 de agosto de 2011 15:37
  • William,

     

        Perfeito. Não xingue a minha também, ok?

        Quanto aos métodos, temos opiniões diferentes, mas acredito no uso conciênte. Mas eu levantei a questão pelo link que você havia enviado. Aquele link fala de classes estáticas (com atributos), assim:

     

    /// <summary>
    /// Static class example. Note the static keyword usage.
    /// </summary>
    static public class SiteStatic
    {
      /// <summary>
      /// The data must be a static member in this example.
      /// </summary>
      static object[] _data = new object[10];
    
      /// <summary>
      /// C# doesn't define when this constructor is run, but it will likely
      /// be run right before it is used.
      /// </summary>
      static SiteStatic()
      {
    	// Initialize all of our static members.
      }
    }
    


        Peguei o código pronto, mas o caso acima é um exemplo do problema citado no artigo. Um atributo, varíavel ou propriedade estática só será destruido quando o executável "parar" de "rodar". Se for no IIS (que faz o papel do executável) aí piora, entende? Essa variavel funcionaria como uma variável de aplicação (a variável _data) acima. Esse eu vejo como o maior perigo de classes estáticas.

        Foi só isso que resolvi salientar procê.

     

    Att,

    Ricardo

    quarta-feira, 17 de agosto de 2011 03:48