Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Tentei fazer o desafio, mas me pareceu estranho

Olá.

Afim de ver se consigo "refatorar" o código em PdoStudentRepository.php:

foreach($result as $row){
    if(!array_key_exists($row['id'], $studentList)){
        $studentList[$row['id']] = new Student(
            $row['id'],
            $row['name'],
            new \DateTimeImmutable($row['birth_date'])
        );
    }
    $phone = new Phone(
        $row['phone_id'],
        $row['area_code'],
        $row['number']
    );
$studentList[$row['id']]->addPhone($phone);
}
return $studentList;

Eu fiz dessa forma:

private function fillStudentsIfTheyHasPhones($row):array{
    $studentList = [];
    if(!array_key_exists($row['id'], $studentList)){
        $studentList[$row['id']] = new Student(
            $row['id'],
            $row['name'],
            new \DateTimeImmutable($row['birth_date'])
        );
    }
    $phone = new Phone(
        $row['phone_id'],
        $row['area_code'],
        $row['number']
    );
    $studentList[$row['id']]->addPhone($phone);
    return $studentList;
}

E entao substitui o conteudo do foreach pela função fillStudentsIfTheyHasPhones. assim:

 foreach($result as $row){
    $studentList[]= $this->fillStudentsIfTheyHasPhones($row);
}

E ele me retornou o esperado, mas fiquei com a sensação de que troquei "seis por meia dúzia", o que fiz é uma refatoração válida? Tem algum curso por aqui ou materiais que eu possa estudar pra melhor entender o que de fato seja uma "boa" refatoração?

1 resposta
solução!

Nicolas, nesse caso o que você fez foi mudar o comportamento. Sua $studentList final não vai ser a mesma coisa. Vai ser uma lista, onde cada item é um outro array.

Uma refatoração válida nesse caso seria ter uma classe de coleção de Student e fazer a verificação se o item já existe ou não lá.

Melhor ainda seria usar um Set da extensão https://php.net/ds

:-)

Uma refatoração válida é qualquer alteração no código que não altere seu comportamento (o que não foi seu caso) mas o deixe mais legível, desacoplado, mais fácil de testar, etc.