O perigo do relacionamento bidirecional com JPA e Hibernate

Eu já bati muito a cabeça com JPA e Hibernate para aprender que relacionamento bidirecional no geral atrapalha mais do que ajuda. A verdade é que deveríamos evitar relacionamento bidirecional (o tal do mappedBy) sempre que possível. Ele só deveria ser utilizado em último caso, quando realmente não tiver para onde correr…

Por exemplo, será que o código abaixo funcionaria em um relacionamento bidirecional?

Item curso = new Item("Curso de Java e Orientação a Objetos", 1);

Carrinho carrinho = dao.buscaPor(id);

carrinho.getItens().add(curso);

dao.atualiza(carrinho);

E se eu te dissesse que NÃO? Esse código não funcionaria!

Quando trabalhamos com bidirecional somos obrigados a escrever um código mais complicado para manter a consistência entre as entidades, o que nem sempre é fácil. Para entender do que estou falando dá uma lida no novo post do blog da TriadWorks:

>> JPA: por que você deveria evitar relacionamento bidirecional

Se você ainda insistir em usá-lo nos post acima eu te dou algumas dicas de orientação a objetos (ENCAPSULAMENTO, tan dãn!!) para manter a consistência do relacionamento. Dessa forma você diminui as chances de ter dor de cabeça.

E aí, o que achou do post?

Enums são objetos com estado e comportamentos

Eu não sei você, mas por muito tempo eu subestimei e encarei as enums no meu código apenas como simples constantes…

public enum TipoDeDocumento {

    RG,
    CPF,
    CNPJ;
}

Isto foi um grande erro, pois enums são tão poderosas quanto objetos Java… na verdade, enums são objetos e você deveria encará-las dessa forma! Tratá-las apenas como substitutos para uma lista de constantes do tipo int ou String é ignorar todo o potencial das enums e da orientação a objetos no seu código!

Uma enum pode ser tão completa quanto um objeto Java qualquer, isto é, uma enum pode ter dados (estado) e comportamentos. O código a seguir com uma enum possuindo estas características pode te dar uma idéia sobre o que estou falando:

public enum TipoDeDocumento {

    RG("RG", new ValidadorDeRg()),
    CPF("CPF", new ValidadorDeCpf()),
    CNPJ("CNPJ", new ValidadorDeCnpj());

    private String descricao;
    private Validador validador;

    private TipoDeDocumento(String descricao, Validador validador) {
        this.descricao = descricao;
        this.validador = validador;
    }

    /**
     * Valida número do documento
     */
    public boolean valida(String numero) {
        return this.validador.isValido(numero)
    }
}

Talvez só olhando o código não seja fácil compreender o poder das enums, então para você entender o que eu estou falando realmente eu te convoco a dar uma olhada nesse novo post no blog da Triadworks:

>> Enums são mais que constantes

O post também aborda algumas práticas sobre orientação a objetos que deixamos de usar por não compreender que enums são objetos com dados e comportamentos.

E aí, o que achou do post?

O excesso de ifs no seu código JavaScript

O excesso de ifs no código é comum quando trabalhamos com JavaScript e parece normal e imprescindível em muitos casos, mas na verdade é um problema que pode trazer maus cheiros, como repetição de código, falta de legibilidade e prejudicar diretamente na manutenção do software.

Para resolver isso sem muito esforço, podemos usar práticas e princípios de orientação a objetos, como polimorfismo e herança. Em linguagens dinâmicas (como JavaScript, Ruby e Python) nós podemos tirar vantagens da linguagem e utilizar uma técnica mais simples porém tão poderosa quanto polimorfismo, neste caso, Duck Typing.

Para entender o uso da técnica de duck typing e remover o aglomerado de ifs do seu código, você pode ler o artigo no blog dos desenvolvedores da TriadWorks. Através de um exemplo prático e didático fica fácil enxergar a problemática e a solução com o uso de duck typing.

Este problema não só ocorre com JavaScript, mas com várias outras linguagens e paradigmas, inclusive com Java. Por esse motivo, é importante entender como podemos melhorar a qualidade do nosso código com práticas de orientação a objetos!