Skip to main content

Definição do Modelo de Domínio

O modelo de domínio é uma representação abstrata dos objetos do negócio e suas interações, formando a espinha dorsal da lógica da aplicação. Ele encapsula as regras de negócio e garante a integridade dos dados.

package com.webpublico.ead.domain.model.academico;

import br.com.archbase.ddd.domain.contracts.Identifier;
import br.com.archbase.ddd.domain.contracts.ValidationResult;
import br.com.archbase.validation.fluentvalidator.context.ArchbaseValidationResult;
import com.webpublico.ead.domain.model.BaseDomain;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.Objects;

@NoArgsConstructor
@Getter
@Setter
public class Topico extends BaseDomain<Topico> {

private String titulo;
private String descricao;
private String nivelAnteriorTopicoId;

public Topico(String id) {
super(id);
}

@Override
public ValidationResult validate() {
return ArchbaseValidationResult.ok();
}

}

Explicação

BaseDomain: A classe Topico herda de BaseDomain, que inclui funcionalidades comuns como identificação e validação. Isso facilita a manutenção e a consistência em todo o modelo de domínio.

Relacionamentos e Listas

Em um cenário onde Topico pode ter várias Disciplinas associadas, a modelagem no domínio pode incluir uma lista para gerenciar este relacionamento.

package com.webpublico.ead.domain.model.academico;

import br.com.archbase.ddd.domain.contracts.Identifier;
import br.com.archbase.ddd.domain.contracts.ValidationResult;
import br.com.archbase.validation.fluentvalidator.context.ArchbaseValidationResult;
import com.webpublico.ead.domain.model.BaseDomain;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.Objects;

@NoArgsConstructor
@Getter
@Setter
public class Topico extends BaseDomain<Topico> {

private String titulo;
private String descricao;
private String nivelAnteriorTopicoId;
private final List<Disciplina> disciplinas = new ArrayList<>();

public Topico(String id) {
super(id);
}

public void adicionarDisciplina(Disciplina disciplina) {
if (disciplina != null) {
this.disciplinas.add(disciplina);
}
}

public void adicionarDisciplinas(List<Disciplina> disciplinas) {
if (disciplinas != null && !disciplinas.isEmpty()) {
this.disciplinas.addAll(disciplinas);
}
}

@Override
public ValidationResult validate() {
return ArchbaseValidationResult.ok();
}

}

Observação Importante: Listas para gerenciar relacionamentos são utilizadas exclusivamente e apenas no modelo de domínio para facilitar o gerenciamento e a manipulação das relações entre objetos. No entanto, elas não são transferidas diretamente para as entidades JPA. Isso evita carregamento desnecessário e problemas de performance que podem ocorrer com o mapeamento @OneToMany automático. As relações são gerenciadas manualmente na camada de persistência para maior controle e eficiência.