Ir ao conteúdo
  • Cadastre-se

C# Métodos Dentro de Métodos


Ariel Souto

Posts recomendados

Bom dia/tarde/noite. Sou iniciante em programação, iniciando meus estudos de lógica de programação 06/06/2019. No momento estou aprendendo C# e gostaria de tirar uma dúvida com vocês, que com certeza são mais experientes do que eu.

 

Estou realizando um exercício para melhor fixação e aprendizagem. Nesse exercício criei uma classe Conta. Já implementei as propriedades e alguns métodos. No momento estou querendo realizar um método de AlterarSenha() e dentro dele tem várias etapas. Segundo a ideologia Clean Code, devemos reduzir o nosso código ao máximo e para isso utilizamos os métodos. Dentro desse método que quero chamar, vão existir as seguinte etapas:

 

1) Verificar se a propriedade bool _permissaoDeTrocaDeSenha está como true. (criei essa propriedade, pois se eu tentar trocar a senha e errar 3 tentativas ela se tornará false e bloqueará a troca de senha)

2) Vou criar um código aleatório com o método Random() para gerar um PinCode. Aqui preciso verificar se o PinCode que o cliente recebeu e digitou bate com o PinCode gerado.

3) Vou solicitar que o cliente digite a senha atual e verificar se a senha digitada bate com a atual.

4) Vou conferir se a nova senha tem mais de 5 caracteres.

 

Enfim, bolei assim:

 

public void AlterarSenha(int pinCode, int senhaAtual, int senhaNova)
{
  //1) se _permissaoTrocaDeSenha = true.
  	//2) se pinCode = PinCode.
  		//3) se senhaAtual = _senha.
  			//4) se senhaNova.length > 5.
  				//entra na troca: alterar _senha para senhaNova.
  			//senão: "ERRO: infelizmente não foi possível trocar a senha. Ela deve ter no mínimo 6 dígitos."
  		//senão "ERRO: sua senha atual está errada. Operação finalizada."
  	//senão "PinCode Inválido!"
  //senão "A troca de senha, por motivos de segurança, está temporariamente bloqueada. Entre em contato com o gerente."
}

 

Bom, agora vem a minha pergunta: Eu ACHO que devo criar um método separado para cada etapa dessas (seguindo a ideologia Clean Code e POO, buscando no futuro talvez uma reutilização de código, por exemplo). Aí eu fiquei me questionando:

 

1) Devo criar esses métodos um dentro do outro, tipo uma cascata?

2) Ou devo criar todos esses métodos dentro do método principal AlterarSenha()?

3) Ou devo criar todos esses métodos de forma individual dentro da Classe Conta? (Se essa for a resposta correta, serão MUITOS métodos dentro da Classe Conta, pois além desses que citei acima, a Classe Conta já tem outros métodos que eu criei como: Sacar(), Depositar(), etc... E nesse caso como eu organizaria esse tanto de métodos para que fique fácil encontrá-los no código? Seria por ordem alfabética?)

 

Sou grato a todos que puderem me ajudar.

Link para o comentário
Compartilhar em outros sites

você cria na classe Classe (opção 3). As opções 1 e 2 nem são possíveis.

Eu sugiro você cirar um classe "Senha" separada da "Conta", se você realmente acha que a classe "Conta" está muito complexa. Para você ter uma idéias do que estou falando:

class Senha
{
	private:
		bool permissao_de_troca;
    public:
        bool is_troca_senha_possivel();
        void gera_pincode();
        void verifica_tamanho();
       etc.
    
}

class Conta
{
	Senha senha;
    (...)
    
}
public void AlterarSenha(int pinCode, int senhaAtual, int senhaNova)
{ 
   if (senha.is_troca_senha_possivel)
   {
      senha.gera_pincode();
      senha.verifica_tamaho();
   }
   etc...

}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Flávio Pedroza Obrigado pela dica, Flávio. Vou tentar fazer agora como você disse. Mas antes, eu gostaria de você desse uma olhada no que eu fiz enquanto estava aguardando alguma resposta:

 

Eu fiz a opção 3 mesmo. Eu não gostei muito dela porque achei que ficou repetindo muito nos parâmetros.

 

//MÉTODOS DA TROCA DE SENHA --------------------------------------------------------------------
        public void BloquearTrocaDeSenha()
        {
            if (_tentativasTrocaDeSenha == 0)
            {
                _permissaoDeTrocaDeSenha = false;
            }
            else
            {
                _permissaoDeTrocaDeSenha = true;
            }
        }

        public void PermitirTrocaDeSenha(int code, int senhaAtual, int senhaNova)
        {
            BloquearTrocaDeSenha();
            if (_permissaoDeTrocaDeSenha == true)
            {
                ConfirmarPinCode(code, senhaAtual, senhaNova);
            }
            else
            {
                Console.WriteLine("A troca de senha, por motivos de segurança, está temporariamente bloqueada. Entre em contato com o gerente.");
            }
        }

        public void ConfirmarPinCode(int code, int senhaAtual, int senhaNova)
        {
            //gerando um PinCode aleatório.
            //Random numAleatorio = new Random();
            //int pinCode = numAleatorio.Next(1, 3);
            int pinCode = 1; //deixei esse por enquanto para testar.

            if (pinCode == code)
            {
                VerificarSenhaAtual(senhaAtual, senhaNova);
            }
            else
            {
                Console.WriteLine("ERRO: PinCode Inválido.");
                _tentativasTrocaDeSenha--;
            }
        }

        public void VerificarSenhaAtual(int senhaAtual, int senhaNova)
        {
            if (senhaAtual == _senha)
            {
                VerificarTamanhoDaSenhaNova(senhaNova);
            }
            else
            {
                Console.WriteLine("ERRO: sua senha atual está errada. Operação finalizada.");
                _tentativasTrocaDeSenha--;
            }
        }

        public void VerificarTamanhoDaSenhaNova(int senhaNova)
        {
            if (senhaNova.ToString().Length > 5)
            {
                _senha = senhaNova;
            }
            else
            {
                Console.WriteLine("ERRO: infelizmente não foi possível trocar a senha. Ela deve ter no mínimo 6 dígitos.");
            }
        }

 

Você achar que do jeito que eu fiz acima está correto/usual para o mercado de trabalho? (Claro que vou fazer do jeito que você sugeriu, que com certeza será o mais ideal, mas gostaria de saber se esses métodos com ifs chamando outros métodos e repetindo vários parâmetros de método em método está correto ou se teria uma forma melhor de fazer essa parte).

Link para o comentário
Compartilhar em outros sites

Sim, achei seu código muito bom, eu, particularmente, também seguiria essa abordagem, de separar tudo em métodos. Fica mais fácil de manter o código. 

Por exemplo, no futuro se eu quiser permitir senhas maiores, com 6, 7 dígitos, basta alterar um único método "VerificarTamanhoDaSenhaNova".

Mas em programação existem muitas maneiras de atacar o mesmo problema, e raramente existe algo que seja 100% correto.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...