O resharper gosta de apontar várias funções por página asp.net que podem ser tornadas estáticas. Isso me ajuda se eu as tornar estáticas? Devo torná-los estáticos e movê-los para uma classe de utilidade?
c#
.net
refactoring
resharper
static-methods
dlamblin
fonte
fonte
Respostas:
Métodos estáticos versus métodos de instância
10.2.5 Os membros estáticos e de instância da Especificação da linguagem C # explicam a diferença. Geralmente, os métodos estáticos podem fornecer um aprimoramento de desempenho muito pequeno em relação aos métodos de instância, mas apenas em situações um pouco extremas (consulte esta resposta para obter mais detalhes sobre isso).
A regra CA1822 no FxCop ou na Análise de código afirma:
Classe de utilitário
Você não deve movê-los para uma classe de utilitário, a menos que faça sentido em seu design. Se o método estático se relacionar a um tipo específico, como um
ToRadians(double degrees)
método a uma classe que representa ângulos, faz sentido que esse método exista como membro estático desse tipo (observe, este é um exemplo complicado para fins de demonstração).fonte
Desempenho, poluição de namespace, etc, são todos secundários em minha opinião. Pergunte a si mesmo o que é lógico. O método está operando logicamente em uma instância do tipo ou está relacionado ao próprio tipo? Se for o último, torne-o um método estático. Somente mova-o para uma classe de utilitário se estiver relacionado a um tipo que não está sob seu controle.
Às vezes, há métodos que logicamente atuam em uma instância, mas não acontecem de usar qualquer um do estado da instância ainda . Por exemplo, se você estivesse construindo um sistema de arquivos e tivesse o conceito de diretório, mas ainda não o tivesse implementado, poderia escrever uma propriedade retornando o tipo de objeto do sistema de arquivos e sempre seria apenas "arquivo" - mas está logicamente relacionado à instância e, portanto, deve ser um método de instância. Isso também é importante se você deseja tornar o método virtual - sua implementação específica pode não precisar de estado, mas classes derivadas podem. (Por exemplo, perguntando a uma coleção se é ou não somente leitura - talvez você ainda não tenha implementado uma forma somente leitura dessa coleção, mas é claramente uma propriedade da própria coleção, não do tipo.)
fonte
Marcar um método como
static
dentro de uma classe torna óbvio que ele não usa nenhum membro da instância, o que pode ser útil saber ao percorrer o código.Você não precisa necessariamente movê-lo para outra classe, a menos que seja destinado a ser compartilhado por outra classe que esteja intimamente associada, em termos de conceito.
fonte
Tenho certeza de que isso não está acontecendo no seu caso, mas um "mau cheiro" que eu já vi em algum código que tive que sofrer ao manter usado muitos métodos estáticos.
Infelizmente, eram métodos estáticos que assumiram um estado de aplicativo específico. (com certeza, teremos apenas um usuário por aplicativo! Por que a classe User não controla isso em variáveis estáticas?) Elas eram maneiras glorificadas de acessar variáveis globais. Eles também tinham construtores estáticos (!), Que quase sempre são uma má idéia. (Eu sei que existem algumas exceções razoáveis).
No entanto, métodos estáticos são bastante úteis quando fatoram a lógica de domínio que na verdade não depende do estado de uma instância do objeto. Eles podem tornar seu código muito mais legível.
Apenas certifique-se de colocá-los no lugar certo. Os métodos estáticos estão manipulando intrusivamente o estado interno de outros objetos? Pode-se argumentar que o comportamento deles pertence a uma dessas classes? Se você não está separando as preocupações corretamente, pode ter dores de cabeça mais tarde.
fonte
Esta é uma leitura interessante:
http://thecuttingledge.com/?p=57
O ReSharper não está sugerindo que você torne seu método estático. Você deve se perguntar por que esse método está nessa classe, em vez de, digamos, uma das classes que aparece em sua assinatura ...
mas aqui está o que a documentação do novo compartilhador diz: http://confluence.jetbrains.net/display/ReSharper/Member+can+be+made+static
fonte
Apenas para adicionar à resposta de @Jason True , é importante perceber que apenas colocar 'estático' em um método não garante que o método seja 'puro'. Ele será sem estado no que diz respeito à classe em que é declarado, mas pode acessar outros objetos 'estáticos' com estado (configuração do aplicativo etc.); isso nem sempre é uma coisa ruim, mas um dos motivos pelos quais Pessoalmente, tendem a preferir métodos estáticos quando posso: se eles forem puros, você poderá testar e argumentar isoladamente, sem ter que se preocupar com o estado circundante.
fonte
Você deve fazer o que for mais legível e intuitivo em um determinado cenário.
O argumento de desempenho não é bom, exceto nas situações mais extremas, pois a única coisa que realmente está acontecendo é que um parâmetro extra (
this
) está sendo empurrado para a pilha por métodos de instância.fonte
Para lógica complexa dentro de uma classe, eu encontrei métodos estáticos privados úteis na criação de lógica isolada, na qual as entradas da instância são claramente definidas na assinatura do método e nenhum efeito colateral da instância pode ocorrer. Todas as saídas devem ser via valor de retorno ou parâmetros de saída / ref. Quebrando a lógica complexa em blocos de código sem efeitos colaterais pode melhorar a legibilidade do código e a confiança da equipe de desenvolvimento nele.
Por outro lado, pode levar a uma classe poluída por uma proliferação de métodos de utilidade. Como de costume, a nomeação lógica, a documentação e a aplicação consistente das convenções de codificação da equipe podem aliviar isso.
fonte
ReSharper não verifica a lógica. Ele verifica apenas se o método usa membros da instância. Se o método for privado e chamado apenas por (talvez apenas um) método de instância, isso é um sinal para permitir que ele seja um método de instância.
fonte
Se as funções forem compartilhadas em várias páginas, você também poderá colocá-las em uma classe de página base e, em seguida, todas as páginas asp.net usando essa funcionalidade serão herdadas (e as funções ainda poderão ser estáticas).
fonte
Tornar um método estático significa que você pode chamar o método de fora da classe sem antes criar uma instância dessa classe. Isso é útil ao trabalhar com objetos ou complementos de fornecedores de terceiros. Imagine se você tivesse que criar primeiro um objeto do console "con" antes de chamar con.Writeline ();
fonte
Ajuda a controlar a poluição do espaço para nome.
fonte
Class.a_core_function( .. )
vsa_core_function( .. )
Apenas minha tuppência: a adição de todos os métodos estáticos compartilhados a uma classe de utilitário permite adicionar
às instruções using, que tornam o código mais rápido para digitar e mais fácil de ler. Por exemplo, eu tenho um grande número do que seria chamado de "variáveis globais" em algum código que herdei. Em vez de criar variáveis globais em uma classe que era uma classe de instância, eu as defino como propriedades estáticas de uma classe global. Ele faz o trabalho, se estiver confuso, e eu posso apenas referenciar as propriedades pelo nome, porque eu tenho o namespace estático já mencionado.
Não tenho ideia se isso é uma boa prática ou não. Eu tenho muito a aprender sobre C # 4/5 e tanto código legado para refatorar que estou apenas tentando deixar as dicas de Roselyn me guiarem.
Joey
fonte
Espero que você já tenha entendido a diferença entre os métodos estático e de instância. Além disso, pode haver uma resposta longa e uma resposta curta. Respostas longas já são fornecidas por outros.
Minha resposta curta: Sim, você pode convertê-los em métodos estáticos, se o Resharper sugerir. Não há mal em fazê-lo. Em vez disso, ao tornar o método estático, você está realmente protegendo o método para que, desnecessariamente, não insira nenhum membro da instância nesse método. Dessa forma, você pode alcançar um princípio de POO " Minimize a acessibilidade de classes e membros ".
Quando o ReSharper sugere que um método de instância pode ser convertido em um método estático, ele está realmente dizendo: "Por que .. esse método está nesta classe, pois na verdade não está usando nenhum de seus estados?" Então, dá-lhe alimento para o pensamento. Então, é você quem pode perceber a necessidade de mover esse método para uma classe de utilidade estática ou não. De acordo com os princípios do SOLID, uma classe deve ter apenas uma responsabilidade central. Assim, você pode fazer uma limpeza melhor de suas aulas dessa maneira. Às vezes, você precisa de alguns métodos auxiliares, mesmo na classe de instância. Se for esse o caso, você pode mantê-los em um #region helper.
fonte