3
respostas

DTO vs VO

Bom dia Pessoal,

Alguém sabe a diferença entre os dois ou não há nenhuma diferença ?

Att

3 respostas

Olá Alan, tudo bem?

O DTO é utilizado para a transferência de dados entre camadas. Por exemplo, podemos ter um DTO que pega os dados de um formulário de cadastro (Camada de interface do usuário) e transporta os dados para um Controller (camada de aplicação).

Já o VO é um objeto que tem um valor na aplicação. Ele pertence a camada de domínio. Ele é um dado importante para o domínio, porém que não precisa de um identificador, sua identidade está no seu valor.

Um exemplo de VO é a String. Ela é um valor imutável que é identificado pelo seu valor. Porém podemos pensar em outros tipos de VO, como Endereco, Nome, Documento, Cartao, entre outros.

Por exemplo um DTO pode deve ter get e set ?

Consegue algum outro exemplo de VO ? Não consegui compreender

Opa Alan,

Sim, sim, um DTO pode ter getters e setters. Da mesma forma que um VO.

A função de um VO é ser um objeto de valor para a sua aplicação. Por exemplo, uma String. Ela tem um valor, o valor do texto que ela guarda. Quando queremos saber se uma String é igual a outra, comparamos o seu texto.

Vamos supor que temos a classe Cliente, que possui nome, sobrenome, e endereço, além de um id:

public class Cliente {

    private Integer id;
    private String nome;
    private String sobrenome; 
    private String endereco;

    public Cliente(String nome, String sobrenome, String endereco) {
        this.nome = nome;
        this.sobrenome = sobrenome;
        this.endereco = endereco;
    }
}

O endereço é uma informação importante para a aplicação. Mas da maneira que definimos ele na classe passamos a ter alguns problemas.

Qual o jeito correto de salvar um endereço? Como saber se um endereço é igual a outro? Esse endereço vai só o nome da rua? Ou podemos colocar também o número, o CEP e assim por diante?

O que podemos fazer então é pegar esse atributo e criar uma classe para representar esse objeto.

public class Endereco {

    private String rua;
    private Integer numero;
    private String cep;


    public Endereco(String rua, Integer numero, String cep) {
        this.rua = rua;
        this.numero = numero;
        this.cep = cep;
    }
}

Dessa forma, na nossa classe Cliente usamos a classe Endereco:

public class Cliente {

    private Integer id;
    private String nome;
    private String sobrenome; 
    private Endereco endereco;

    public Cliente(String nome, String sobrenome, Endereco endereco) {
        this.nome = nome;
        this.sobrenome = sobrenome;
        this.endereco = endereco;
    }
}

O VO pode ter getters e setters, mas também pode ter outros métodos:

public class Endereco {

    private String rua;
    private Integer numero;
    private String cep;


    public Endereco(String rua, Integer numero, String cep) {
        this.rua = rua;
        this.numero = numero;
        this.cep = cep;
    }

    public String getRua() {
        return rua;
    }

    public Integer getNumero() {
        return numero;
    }

    public String getCep() {
        return cep;
    }

    public Stirng enderecoCompleto() {
        return rua + ", " + numero + " - " + cep;
    }
}

O VO pode ser imutável, muitas pessoas até dizem que ele deve ser imutável. Contudo, podemos sim ter métodos que alteram os atributos de um VO.