Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Implementar as propriedades Login e Senha na interface IAutenticavel

Boa noite.

Na aula o professor faz a seguinte estrutura na interface IAutenticavel:

public interface IAutenticavel
    {
        public bool Autenticar(string login, string senha);
    }

Minha dúvida é, seria interessante definir as propriedades Login e Senha para forçar a implementação na classe que a implemente? Já que não deu erro algum, achei "legal" essa ideia, ou seria melhor deixar somente a assinatura de métodos? Segue exemplo:

public interface IAutenticavel
    {
        public string Login { get; set; }
        public string Senha { get; set; }
        public bool Autenticar(string login, string senha);
    }
2 respostas
solução!

Jean, não vejo problemas nisto, porém acredito que este tipo de prática acaba ferindo um dos princípios S.O.L.I.D., exatamente o Single Responsability, ou seja, esta interface está carregando a responsabilidade de manter os métodos e propriedades. O ideal seria separar em 2 interfaces, ex.: IAutenticavel e IDadosAutenticacao.

No geral, é mais comum darmos mais atenção a propriedades no objeto "model". Inclusive, no DDD, temos o IModel e IDAL separados.

Se vc ainda não conhecer bem estes conceitos, preocupa não que o tempo vai te obrigar a aprender sobre eles... :D

Olha um exemplo de como implementaria isto:

A interface:

    public interface IAutenticavel
    {
        public bool Autenticar();
    }

A implementação da interface:

    public class Autenticavel : IAutenticavel
    {
        // As propriedades readonly permitem o SET apenas no método construtor da classe. Elas também podem ser utilizadas pelos demais métodos desta classe.
        private readonly string Login;
        private readonly string Senha;

        // O método construtor é o responsável por receber e repassar os valores das propriedades para todos os métodos desta classe;
        public Autenticavel(string login, string senha)
        {
            this.Login = login;
            this.Senha = senha;
        }

        //O método que que a interface obrigou a implementação. Observe que ele não precisa receber parâmetros, pois o login e seja já é passado ao instanciar a classe. O interessante é que se houvessem 10 métodos que utilizassem estas propriedades, seria possível chamar todos informando os valores apenas uma vez na instanciação.
        public bool Autenticar()
        {
            if (this.Login == "abc" && this.Senha == "123")
                return true;

            return false;
        }
    }

E usando uma aplicação console, o método main:

    class Program
    {
        static void Main(string[] args)
        {
            // Lendo as informações do usuário;
            Console.WriteLine("Digite o seu login:");
            string login = Console.ReadLine();

            Console.WriteLine("Digite a sua senha:");
            string senha = Console.ReadLine();

            // Criamos uma variável com o tipo da interface e instanciamos nela a implementação;
            IAutenticavel auth = new Autenticavel("abc", "123");

            // Utilizamos o método da interface;
            if (auth.Autenticar())
                Console.WriteLine("Usuário autenticado");
            else
                Console.WriteLine("Falha na autenticação do usuário");
        }
    }

Entendi. De certa forma está passando essa responsabilidade ao construtor da classe que implementa o IAutenticavel, certo?