Funcionalidade, o que fazer
Tags: beginners, braziliandevs
Published: 2021-09-25 22:31:31

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.
```csharp
public bool ValidateClientName(string name)
{
    if (name is null)
    {
        return false;
    }

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

    return true;
}
```
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.
```csharp
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;
}
```

Função para validar idade.
```csharp
public bool ValidateClientAge(DateTime birthday)
{
    TimeSpan dateDiff = DateTime.Now - birthday;

    int age = (DateTime.MinValue + dateDiff).Year - 1;
		
    if(age < 18)
    {
        return false;
    }

    return true;
}
```

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

Funcionalidade
```csharp
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);
}
```

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.