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

Funções

Olá! Como vai você ?

É o seguinte, sou totalmente iniciante e estou acompanhando o curso de linguagem C, eu preciso realizar um trabalho de um sistema bem simples pra um trabalho da faculdade, eu estou criando um sisteminha em C para venda de ingressos de uma peça de teatro, após essa introdução (hahaha) a dúvida é a seguinte:

No curso o professor ensina que o correto é dividir o código em funções, sendo assim eu criei uma responsável pela autenticação do usuário (login no sistema) e gostaria de saber se é aceitável a forma que eu fiz, está me aparentando ser muito grande e aqui no curso de C deu a entender que funções precisam ser pequenas (não tenho um pingo de noção, desculpa kk), a função que criei foi a seguinte:

int verifica_credenciais(){

    //armazena login/senha do usuario
    char login[20] = "Teatro";
    char password[20] = "@VendaDeIngressos";

    //guarda login/senha digitados
    char login_digitado[20];
    char password_digitado[20];

    //testa se login/senha digitados são os corretos;
    int verifica_login;
    int verifica_password;

    //conta o maximo de tentativas e quantas tentativas o usuario já usou;
    int maximo_tentativas = 3;
    int tentativas_usuario = 1;

    //verifica se as credenciais estão corretas;
    int acertou = 0;

    for (int i = 1; i <= maximo_tentativas; ++i)
    {
        printf("Digite seu usuario: ");
        gets(login_digitado);

        printf("Digite sua senha: ");
        gets(password_digitado);

        //compara se login salvo e login digitado são iguais;
        verifica_login = strcmp(login, login_digitado);
        //compara se password salvo e password digitado são iguais;
        verifica_password = strcmp(password, password_digitado);

        if(!verifica_login && !verifica_password)
        {
            printf("Suas credenciais estao corretas. Seja bem vindo!\n");
            acertou = 1;
            break;
        }else if (tentativas_usuario == maximo_tentativas)
        {
            printf("Voce realizou o maximo de tentativas, programa encerrado.\n");
        }else
        {
            printf("Credenciais incorretas, tente novamente.\n\n");
        }

        tentativas_usuario++;        
    }

    //caso usuario tenha acertado, retorna True (1);
    return acertou;
}

Fico no aguardo de um auxílio. Obrigado!!

1 resposta
solução!

Oi Felipe, tudo bem? Bom, o tamanho da função não necessariamente deve ser pequeno e por pequeno, não temos um número exato de linhas que determina isso.

O que podemos considerar como modo mais correto de criar função é verificar se a função tem mais de uma responsabilidade. Um exemplo seria: a função que autentica o usuário é a mesma que pede os dados para ele.

No exemplo citado, pegar os dados de autenticação e validar se eles estão corretos, parecem ser duas coisas que podem ser separadas. Neste sentido, capturar os dados do usuário pode ser uma função e a validação se esse usuário pode se autenticar ou não, pode ser outra função.

A ideia de ter tentativas pode estar isolada em outra função, justo por que essa é uma regra do sistema que está a parte da verificação e da solicitação dos dados.

Considerando essa ideia de responsabilidades, você poderia ter 3 funções:

  1. Captura os dados do usuário e retorna esses dados.
  2. Verifica as credenciais, que recebe essas credenciais capturadas pela função anterior como parâmetro e retorna um valor indicado se a credencial é válida ou não (pode ser true ou false o retorno).
  3. A lógica de validar as tentativas.

Não se atentando a uma linguagem específica, um pseudo-código dessas 3 funções funcionando juntas, seria algo parecido com isso:

void login() {
    tentativas = 3;
    for(int tentativa = 1; tentativa <= tentativas; tentativa++)    {
        usuario = pedeDado("qual é o usuário?");
        senha = pedeDado("qual é a senha?");
        autenticado = autentica(usuario, senha);
        if(autenticado) {
            // faz alguma coisa
            imprime("você logou no sistema")
        } else {
            // faz alguma outra coisa
            imprime("login ou senha incorretos, tente novamente, você tem x tentaivas");
        }
    }
}

Veja que tomei a liberdade de isolar o printf() em outra função que se chama imprime, e o gets em outra função que se chama pegaDado.

Pensando dessa forma, se algum dia a forma como imprimo informações ou pego dados do usuário mudar, eu não preciso mudar todos os printfs do sistema, nem todos os gets, só preciso alterar a função pegaDado ou imprime.

A forma de como o sistema autentica o usuário também está isolada. Então se um dia, essa autenticação precisa abrir um arquivo ou um banco de dados, eu também não vou precisar mudar nada na função de login.

Claro, algumas mudanças podem vir sim a acontecer em uma parte e alterar várias outras, mas essas devem ser pouco frequentes.

Deu pra entender? Espero ter ajudado! Bons estudos