1
resposta

Dúvida sobre responsabilidade do método remove autor.

Olá! Tenho uma dúvida...

O Nico no minuto 3:24 desse vídeo resolve remover o autor do livro, porém o mesmo avisa que não é uma boa prática adicionar o método remover pela classe LivroBean, e sim colocar o mesmo na classe Livro.

Acontece que tive duas dúvidas, a primeira o por que o mesmo não removeu no minuto 2:44 na classe LivroBean com o código:

this.livro.getAutores().remove(autor);

Eu entendi que ele falou que por boas práticas mesmo assim não entendi exatamento o porque...

O segundo é a própria correção que ele corrigiu na classe Livro com o código:

public void removeAutor(Autor autor) {
        this.autores.remove(autor);
    }
1 resposta

Olá brazlucca,

A ideia do Nico está relacionada com as seguintes boas práticas de design de código:

  • separação de responsabilidades
  • modelo de domínio rico
  • tell, don't ask / lei de demeter

Separação de Responsabilidades

É uma boa prática de OO a separação das responsabilidades para facilitar a manutenção e evolução do código.

Robert Martin documenta isso no Single Responsibility Principle (Princípio da Responsabilidade Única):

uma classe deve ter apenas um motivo para ser modificada.

O Managed Bean do JSF deveria ser responsável por fazer a ponte entre as entidades de domínio (Livro, Autor, etc) e as telas (.xhtml).

Modelo de domínio rico

As responsabilidades de negócio (cálculos, validações, restrições), devem ser colocadas mais perto das entidades de negócio (Autor, Livro, etc), que fazem parte do modelo de domínio.

Não devemos colocar as regras de negócios no código relacionado a telas ou banco de dados.

Martin Fowler documenta o perigo de um modulo de domínio sem regras de negócio no que ele chama de Modelo Anêmico: https://www.martinfowler.com/bliki/AnemicDomainModel.html

Tell Don't Ask / Lei de Demeter

No artigo The Art of Enbugging (HUNT; THOMAS, 2003), Andy Hunt e Dave Thomas indicam que um lema de OO deveria ser Tell, don't Ask.

Em português, algo como "Diga, não pergunte":

Envie comandos para objetos dizendo o que você quer fazer. Explicitamente, não queremos consultar um objeto sobre seu estado, tomar uma decisão e, então, dizer ao objeto o que fazer.

Ian Holland na Northeastern University que, por volta de 1987, cunhou a Lei de Deméter.

Essa "lei" afirma que todo método de um objeto deve chamar apenas métodos pertencentes a:

  • si mesmo
  • quaisquer parâmetros que foram passados para o método
  • quaisquer objetos criados
  • qualquer composição

É uma maneira mais detalhada de declarar que um bom objeto apenas interage com seus "vizinhos" imediatos.