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

Coleções de primeira classe em entidades

Olá mestre,

No treinamento foi utilizado um array simples para armazenar os telefones. Caso eu utilize uma collection chamada Telefones e essa collection dependa de uma implementação externa de um mapa eu terei que passar essa collection para o Aluno via injeção de dependencia ou é muito capricho? Exemplos:

//No dominio
class Aluno
{
        private Telefones $telefones;
        public function __construct(Telefones $telefones)
        { //código...
        }
}

interface Telefefones
{
    public function adiciona(Telefone $telefone): void;
    public function remove(Telefone $telefone): void;
    //etc
}

//Camada de Infra

// Penso que deva estar na camada de infra por depender de uma lib externa
// Injetei o ArrayCollection diretamente por que talvez seja um capricho exagerado ter isso no construtor
class TelefonesCollection implements Telefones
{
    public function __construct()
    {
        $this->telefones = new ArrayCollection();
    }
    //metodos...
}

Essa abordagem apresentada acima é a mais próxima da ideal? Eu Ou devo seguir algo mais simples com menos capricho? Como por exemplo tudo isso pertencer a camada de domínio e não precisar dessa interface Telefones e ter a implementação diretamente lá?

6 respostas
solução!

Eu não teria a interface não, Diego. Porque uma coleção de telefones é sempre uma coleção de telefones. Você não vai precisar de 2 ao mesmo tempo. Se por algum motivo um dia você mudar de lista pra conjunto, por exemplo, muda direto na implementação da classe de coleção. :-)

Então posso ter uma coleção de telefones na camada de domínio, mesmo que a implementação dependa de uma lib externa?

Aí deixaria de ser uma coleção pra ser um parser ou algo do tipo. Aí são coisas diferentes.

Eu preciso ter uma collection de telefones na entidade de alunos. A implementação dessa colection pode ser feita na própria camada de domínio mesmo que ela dependa de terceiros? Por que para implementar essa collection vou querer usar a DS/Map ou o ArrayCollection do Doctrine, então fiquei na dúvida se devo por no domínio ou na infra. Não entendi por que deixaria de ser uma collection...

Li uma parada 100% diferente, Diego. rsrsrs Erro meu.

Então, aí entra uma discussão mega filosófica, na verdade. Especificamente no PHP, pela falta de coleções decentes na linguagem (fora a extensão DS), eu ainda assim deixaria essas classes no Domínio, fazendo uso da lib externa.

Não acredito que exista ganho em levar isso pra infra, visto que numa mudança de pacote de coleção, por exemplo, ambas as abordagens te fariam alterar um código semelhante. =/

Se quiser ser super pragmático, você pode criar uma interface de Collection, e ter adapters pra ArrayCollection, Ds\Map, etc, mas eu honestamente não vejo motivo real pra fazer isso.

Acho que eu também não havia sido 100% claro hehe.

No fundo essa pergunta tinha uma questão que envolve os testes e o design da classe de alunos. Por que nessa abordagem mais pragmática eu teria que passar a coleção de estudantes via injeção de dependência para a classe aluno, como mostrei no início da dúvida, em vez de ter a coleção já acoplada dentro da classe. Irei seguir a solução mais prática como você falou.

De maneira mais pragmática com uma interface para coleção de estudantes:

class Aluno
{
        private Telefones $telefones;
        public function __construct(Telefones $telefones)
        { //código...
        $this->telefones = $telefones;
        }
}

de modo mais prático, sem interface, e com uma única implementação da coleção de estudantes:

class Aluno
{
        private Telefones $telefones;
        public function __construct()
        { //código...
            $this->telefones = new Telefones();
        }
}