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

Exercício __set

Teve duas formas que eu pensei. Uma foi a forma de criar métodos pra alterar cada coisa do endereço. Assim ficariam estes métodos na classe Endereco.php:

   public function alteraRua($rua):void
    {
        $this->rua= $rua;
    }

    public function alteraNumero($numero):void
    {
        $this->numero= $numero;
    }

    public function alteraBairro($bairro):void
    {
        $this->bairro = $bairro;
    }

    public function alteraCidade($cidade):void
    {
        $this->cidade = $cidade;
    }

    public function __set($nomeAtributo, $valorAtribuido):void
    {
        $metodo = 'altera'.ucfirst($nomeAtributo);
        $this->$metodo($valorAtribuido);
    }

chamando no arquivo teste endereco.php deste jeito:

<?php

use Alura\B\Modelo\Endereco;
require_once 'autoload.php';

$umEndereco = new Endereco('Petrópolis', 'bairro Qualquer', 
'Minha rua', '71B');

echo $umEndereco.PHP_EOL;

$umEndereco->rua = "NOVARUA";
$umEndereco->numero = "NOVONUMERO";
$umEndereco->bairro = "NOVOBAIRRO";
$umEndereco->cidade = "NOVACIDADE";

echo $umEndereco.PHP_EOL;

O resultado no terminal fica:

Minha rua, 71B, bairro Qualquer, Petrópolis

NOVARUA, NOVONUMERO, NOVOBAIRRO, NOVACIDADE

MAS eu testei uma outra forma , com menos linhas, e ela funciona também. Só que eu gostaria de saber se ela é recomendada ou não, pelas 'boas práticas'. Se não for, qual a explicação? A forma com menos linhas a seguir:

Na classe Endereco.php colocar somente o __set método mágico desta forma:

    public function __set($nomeAtributo, $valorAtribuido):void
    {
        $this->$nomeAtributo = $valorAtribuido;
    }

e no arquivo teste endereco.php ficaria a mesma coisa:

<?php

use Alura\B\Modelo\Endereco;
require_once 'autoload.php';

$umEndereco = new Endereco('Petrópolis', 'bairro Qualquer', 'Minha rua', '71B');

echo $umEndereco.PHP_EOL.PHP_EOL;

$umEndereco->rua = "NOVARUA";
$umEndereco->numero = "NOVONUMERO";
$umEndereco->bairro = "NOVOBAIRRO";
$umEndereco->cidade = "NOVACIDADE";

echo $umEndereco.PHP_EOL;

E o resultado seria o mesmo.

Minha rua, 71B, bairro Qualquer, Petrópolis

NOVARUA, NOVONUMERO, NOVOBAIRRO, NOVACIDADE

Qual a sua recomendação, professor?

2 respostas
solução!

Ótimo, Amanda. Muito bom quando a gente chega em 2 soluções.

Eu prefiro a primeira pois assim, se eu não quiser permitir a alteração da cidade, por exemplo, basta não criar o método alteraCidade. Dessa forma mantenho tanto a praticidade quanto o encapsulamento. :-)

Sim! É bom que porque fez pensar e refletir sobre essas duas formas, mas é verdade o que você disse, professor, sobre manter o encapsulamento e quando precisar modificar em algum método, ser só nele também. Obrigada!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software