Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Qual a diferença entre classe estática e a instanciável?

Olá!

O professor usou o seguinte código:

Classe AutenticacaoHelper:

namespace ByteBank.Modelos
{
    internal class AutenticacaoHelper
    {
        public bool CompararSenhas(string senhaVerdadeira, string senhaTentativa)
        {
            return senhaVerdadeira == senhaTentativa;
        }
    }
}

Classe FuncionarioAutenticavel:

namespace ByteBank.Modelos.Funcionarios
{
    public abstract class FuncionarioAutenticavel : Funcionario, IAutenticavel
    {
        private AutenticacaoHelper _autenticacaoHelper = new AutenticacaoHelper();
        public string Senha { get; set; }

        public FuncionarioAutenticavel(double salario, string cpf)
            : base(salario, cpf)
        {
        }

        public bool Autenticar(string senha)
        {
            return _autenticacaoHelper.CompararSenhas(Senha, senha);
        }
    }
}

A classe AutenticacaoHelper precisou ser instanciada na classe FuncionarioAutenticavel para poder ser utilizada. Testei aqui tornando a classe static e não identifiquei diferenças. Funcionou também.

Seguem minhas alterações:

Classe AutenticacaoHelper:

namespace ByteBank.Modelos
{
     public static class AutenticacaoHelper
    {
        public static bool CompararSenhas(string senhaVerdadeira, string senhaTentativa)
        {
            return senhaVerdadeira == senhaTentativa;
        }
    }
}

Classe FuncionarioAutenticavel:

namespace ByteBank.Modelos.Funcionarios
{
    public abstract class FuncionarioAutenticavel : Funcionario, IAutenticavel
    {
        public string Senha { get; set; }

        public FuncionarioAutenticavel(double salario, string cpf)
            : base(salario, cpf)
        {
        }

        public bool Autenticar(string senha)
        {
            return AutenticacaoHelper.CompararSenhas(Senha, senha);
        }
    }
}

Qual a diferença entre essas duas formas? Quando devo usar uma ou a outra?

1 resposta
solução!

Olá Gabriel, tudo bem?

A diferença básica entre essas duas abordagens é que a abordagem da classe estática acaba utilizando menos recursos por não precisar alocar um novo objeto na memória. Porém na prática acaba sendo imperceptível.

Sobre quando usar uma abordagem ou outra. Em minha opinião você deveria utilizar classes estáticas toda vez que necessite criar um conjunto de métodos que opere somente em parâmetros de entrada, ou seja, não dependam de algum valor de instancia (propriedade, campo e etc).

Imagine que no seu exemplo a classe AutenticacaoHelper tivesse a propriedade CaseSensitive. Que seria responsável por ignorar se ambas as senhas estão em maiúscula, minuscula e etc.

namespace ByteBank.Modelos
{
     public  class AutenticacaoHelper
    {
        public bool CaseSensitive { get; set; }

       public AutenticacaoHelper(bool caseSensitive)
       {
           CaseSensitive = caseSensitive;
       }

        public bool CompararSenhas(string senhaVerdadeira, string senhaTentativa)
        {
            if (CaseSensitive) {
                return senhaVerdadeira.Equals(senhaTentativa, StringComparison.CurrentCultureIgnoreCase);

            }

            return senhaVerdadeira == senhaTentativa;
        }
    }
}

Nesse caso como o método CompararSenhas depende de um valor de instância (CaseSensitive) ele não poderia ser estático.

Utilizamos bastante essa abordagem de classes estáticas em mapeamentos de objetos. Por exemplo, converter um DTO em um entidade.

Não sei se conseguir deixar claro, mas caso tenha alguma dúvida é só chamar.

Abraços,