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

Acesso direto sem usar $this->

Respeitando os princípios do SOLID, existe algum jeito de usar $enviadorEmail->envia($nf); ao invés de $this->enviadorEmail->envia($nf); no trecho abaixo?

class GeradorNotaFiscal {

        private $enviadorEmail;
        ...

        public function __construct(EnviadorDeEmail $enviador,notaFiscalDao $nfDao) {
            $this->enviadorEmail = $enviador;
            ...
        }

        public function gera(Fatura $fatura) {

            $valor = $fatura->getValorMensal();

            $nf = new NotaFiscal($valor,$this->impostoSobreValor($valor));

            $this->enviadorEmail->envia($nf);
            ...
        }

        ...
    }
4 respostas

Também não vale colocar um $enviadorEmail = $this-> enviadorEmail; logo no começo do gera(); nem $enviadorEmail = new EnviadorDeEmail();.

Oi Ricardo, tudo bem? No geral, você pode fazer as duas coisas que sugere, depende muito do cenário. Neste caso, o cenário explora o problema de "Gerar a nota fiscal e envia-la" no mesmo contexto.

A questão de estar no construtor é para deixar explicito que, para realizar a tarefa por completo, o mínimo precisa ser fornecido. O cenário poderia ser outro, por exemplo, o gerador poderia não enviar por email e ai, neste caso, nem precisaria do enviador.

Porém, não vejo por que não usar o $this->. Você vê algum problema? Pode deixar mais claro o por que dá pergunta?

solução!

Olá, Ricardo.

Nessa situação, eu aplicaria o padrão Observer.

interface AcaoAoGerarNota
{
    public function processa(NotaFiscal $nf);
}

class EnviadorDeEmail implements AcaoAoGerarNota
{
    public function processa(NotaFiscal $nf)
    {
        $this->envia($nf);
    }

    // resto do código da classe aqui ...
}

class GeradorNotaFiscal
{
    private $acoes = [];

    public function addAcao(AcaoAoGerarNota $acao)
    {
        $this->acoes[] = $acao;
    }

    public function gera(Fatura $fatura)
    {
        $valor = $fatura->getValorMensal();
        $nf = new NotaFiscal($valor, $this->impostoSobreValor($valor));

        foreach ($this->acoes as $acao) {
            $acao->processa($nf);
        }
    }

    // Resto da classe aqui...
}

Desta forma você poderia não só enviar a nota fiscal como salvar num bd, salvar arquivos de log, gerar relatórios ou qualquer outra coisa, desacoplado do gerador de nota fiscal.

Não sei se responde exatamente à sua questão, mas é uma outra forma de resolver o problema.

Escrevi o código na hora e não testei. Deve precisar de ajustes...

Abraços e bons estudos!

Acredito que ele está falando sobre não usar o $this->enviadorEmail->envia($nf); e sim usar o $enviadorEmail->envia($nf); pq ficaria mais facil de identificar o que tá enviando o email. Mas a partir do momento que vc associa um atributo da classe a um outro objeto, vc tem de referenciar o atributo daquela classe antes de identificar qual o metodo daquele objeto, vc não estaria trabalhando com um objeto, e sim com um atributo que contem um objeto, por isso usar o $this