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

método no repositório Aluno

Uma dúvida aqui.

Seguindo a mesma base do curso, supondo que teremos mais uma entidade: Responsável. Logo, um responsável (pai, mãe, etc.) pode ser o responsável por um ou vários alunos.

A dúvida é saber se é correto ter um método no repositório Aluno para pegar o nome do responsável. Tipo:

function responsavel(Responsavel $responsavel)
{
    $this->responsavel = $responsavel;
}
6 respostas

Flávio, sua dúvida não fez muito sentido.

Você quis dizer na Entidade de Aluno?

Se sim, depende. Se seu projeto precisa acessar o nome do responsável do aluno, sim, pode criar esse método. Mas o método está incompleto. Além de você não ter definido que ele é público (que é o padrão, mas é uma péssima prática omitir isso), você está retornando a referência para um responsável, e não seu nome.

Perdão. Isso mesmo. Eu quis dizer métodos na Entidade Aluno.

E realmente faltou um método.

public function definirResponsavel(Responsavel $responsavel)
{
    $this->responsavel = $responsavel;
}

public function responsavel()
{
    return $this->responsavel;
}

Então, Flávio, se você quer retornar o nome do reponsável, o metódo seria algo como:

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

Ha, é verdade. Obrigado.

Aproveitando, queria saber justamente sobre o responsável.

No método definirResponsavel(), passamos uma instância do responsável. Até aí, blz.

Se entendi bem, vc já tinha me dito que um objeto não pode estar em um estado inválido quado for instanciado. Então, para efeito do exemplo, vamos supor que um responsável deva ter obrigatoriamente um nome e um email. Logo, quando instanciamos um responsável, ele deverá ter estes dois atributos passados no construtor.

A dúvida é a seguinte.

Supondo uma consulta de alunos que retorne o nome do aluno, telefone do aluno e email do responsável (talvez não seja um exemplo real, mas só para vc entender minha dúvida).

Veja que não vou usar o nome do responsável. Mas como o construtor pede nome e email, por serem obrigatórios para que o objeto seja válido, como fica?

Lá no repositório devo incluir na SQL o nome do responsável para satisfazer a obrigatoriedade (mesmo o atributo nome não sendo usado neste caso)?

Se entendi bem, se eu alter o construtor passando somente o email, em algum outro caso quando eu instanciar um responsável, somente o email seria exigido no instanciamento, fazendo o objeto ficar em um estado inválido (um responsável sem nome)

Resumindo: Considerando em entidades que possuem mais de um atributo obrigatório no construtor para que esteja em um estado válido ao ser instanciada. Em uma consulta SQL qualquer que envolva esta entidade onde eu vá efetivamente usar somente um atributo dela, como fica?

solução!

Então, Flávio.

Depende muito do nível de abstração em que você quer chegar. Existem milhares de soluções. Pra esse caso. Desde simplesmente passar um nome fake quando você não precisa do dado até criar uma classe como ResponsavelSemNome ou algo do tipo.

Não existe solução melhor ou pior, então cabe a você que conhece o caso real, decidir como resolver da melhor forma.

:-)

PS.: Se você utilizasse um ORM, o nome viria do banco para montar corretamente o responsável. ;-)

Entendido. Muito bom!

Obrigado!