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

Desafio Exceções de Validação - NOME

Segue a implementção que fiz usando uma Exception própria para tratar a validação do nome. Caso tenha alguma coisa para melhorar comentem:

Classe criada:

<?php

namespace Alura\Banco\Modelo;

class NomeInvalidoException extends \DomainException
{
    public function __construct(string $nome)
    {
        $tamanhoNome = strlen($nome);
        $mensagem = "Nome inválido. Um nome válido precisa ter pelo menos 5 letras e $nome possui $tamanhoNome letras.";
        parent::__construct($mensagem);
    }
}

Classe Pessoa onde existe o método validaNome:

<?php

namespace Alura\Banco\Modelo;

abstract class Pessoa
{
    use AcessoPropriedades;

    protected string $nome;
    private CPF $cpf;

    public function __construct(string $nome, CPF $cpf)
    {
        $this->validaNome($nome);
        $this->nome = $nome;
        $this->cpf = $cpf;
    }

    public function recuperaNome(): string
    {
        return $this->nome;
    }

    public function recuperaCpf(): string
    {
        return $this->cpf->recuperaNumeroCPF();
    }

    final protected function validaNome(string $nome): void
    {
        if (strlen($nome) < 5) {
            throw new NomeInvalidoException($nome);
        }
    }

}

Aquivo de teste:

<?php

use Alura\Banco\Modelo\Conta\Titular;
use Alura\Banco\Modelo\CPF;
use Alura\Banco\Modelo\Endereco;
use Alura\Banco\Modelo\NomeInvalidoException;

require_once 'autoload.php';

try {
    $titular = new Titular(
        new CPF("123.456.789-10"),
        "Ana",
        new Endereco("Campo Grande", "Tiradentes", "A", "456")
    );
} catch (NomeInvalidoException $exception) {
    echo $exception->getMessage() . PHP_EOL;
}
3 respostas
solução!

Boa, Rafael. Eu só uniria o método validaNome com a atribuição do nome em si. Algo assim:

final protected function defineNome(string $nome): void
{
    if (strlen($nome) < 5) {
        throw new NomeInvalidoException($nome);
    }

    $this->nome = $nome;
}

Aí no construtor só chamaria ela, entende?

Entendi Vinicius.

Não tinha pensado nisso. Como o método chama-se validaNome não me veio a idéia de usar ele para atribuir o valor na propriedade nome. :)

Mas ai do jeito que você fez renomeando o método para defineNome fica mais claro e faz mais sentido.

Valeu a dica.

Show de bola Rafael. Não se esqueça de marcar o tópico como solucionado.

;-)