DEV Community

Rod Barbosa
Rod Barbosa

Posted on

Funcionalidade, o que fazer

Então pessoal, quem nunca teve um frio na barriga ou mesmo um desconforto no momento deve ter de escrever uma funcionalidade para um sistema. E quando o sistema é de temas sensíveis esta sensação é ainda amplificada. Não se preocupe isto não é incomum e mesmo depois de muito esta sensação ainda vai existir, apenas será com intensidade menor.

Neste momento estou considerando que você é um DEV e que codifica funcionalidade após o recebimento da documentação. Ou seja, não esta fazendo a analise de negócio. Para escrever uma funcionalidade gosto de sempre ter em mente 'safe clauses' e aconselho a utilização do mesmo para todos que conheço.

O que quero dizer com isto? Bom, toda funcionalidade tem um fluxo e deve seguir regras para o seu sucesso. Só para deixar claro, me refiro a funcionalidade como sendo um conjunto de funções. Exemplo, salvar cliente é uma funcionalidade enquanto gravar no banco é uma função que agrega a funcionalidade em questão. Aproveitando a menção, irei aproveitar a funcionalidade 'salvar cliente' com sintaxe em C# para exemplificar o assunto.

Mas antes de descrever a funcionalidade irei falar sobre a ideia. A funcionalidade deve fazer todas as validações no inicio e a ultima linha da funcionalidade deve representar o sucesso da execução. Parece redundante ou não diferente do que normalmente se faz mas acreditem, já vi cada código de dar medo.

Então, para salvar cliente existe algumas regras que segue:

  • Todo cliente deve ter nome. O nome deve ter o mínimo 3 e máximo de 150 caracteres;
  • O cliente deve infromar um documento valido, este documento pode ser o CPF ou CNPJ;
  • O cliente deve ter 18 anos ou mais;
  • Os dados do clientes deve ser salvos em banco de dados.

Para isto terei uma função para validar o nome.

public bool ValidateClientName(string name)
{
    if (name is null)
    {
        return false;
    }

    if (name.Length <3 || name.Length > 150)
    {
         return false;
    }

    return true;
}
Enter fullscreen mode Exit fullscreen mode

Nesta função também é aplicado o mesmo conceito, ou seja, caso o nome seja nulo já é feito um retorno negativo porque não faz mais sentido continuar a validação.

Função para validar CPF/CNPJ. Esta função irei coloca-la de forma reduzida, a rotina efetiva para validar o numero pode ser encontrada em diversos sites ou até mesmo em pacotes prontos.

public bool ValidateClientDocument(string document)
{
    if (document is null)
    {
        return false;
    }

    string onlyNumbers = KeepOnlyNumbersFromString(documento);

    // CPF tem 11 digitos
    if (onlyNumbers.Length == 11 && !ValidateCpf(onlyNumbers)
    {
        return false;
    }

    // CNPJ tem 14 digitos
    if (onlyNumbers.Length == 14 && !ValidateCnpj(onlyNumbers))
    {
        return false;
    }

    return true;
}
Enter fullscreen mode Exit fullscreen mode

Função para validar idade.

public bool ValidateClientAge(DateTime birthday)
{
    TimeSpan dateDiff = DateTime.Now - birthday;

    int age = (DateTime.MinValue + dateDiff).Year - 1;

    if(age < 18)
    {
        return false;
    }

    return true;
}
Enter fullscreen mode Exit fullscreen mode

A função de salvar em banco de dados só estarei considerando a existência de uma.

Funcionalidade

public void SaveClient(string nane, string document, DateTime birthday)
{
    if(!ValidateClientName(name))
    {
        throw new ArgumentException("Nome invalido");
    }

    if(ValidadeClienDocument(document))
    {
        throw new ArgumentException("CPF/CNPJ invalido");
    }

    if(!ValidateClientAge(birthday))
    {
        throw new ArgumentException("O cliente deve ter 18 anos ou mais.");
    }

    SaveToDb(name, document, birthday);
}
Enter fullscreen mode Exit fullscreen mode

Então como havia dito anteriormente uma funcionalidade é um conjunto de função. E pode ser visto nas funções que a função termina no momento que é encontrado o primeiro erro isto porque se perde a necessidade de continuar a validação. Claro que aqui foi feito um resumo e dependendo do que é especificado na funcionalidade as funções podem ter comportamentos variados, um exemplo seria o retorno de todos os erros de validação de uma única vez.

Contudo, no nosso cenário descrito o objetivo foi atingido e garantimos que na detecção de algo fora do escopa a funcionalidade deveria parar.

Top comments (0)