Nos recentes anos começámos a ouvir falar mais em Entidades no mundo orientado a objetos. O crédito disso vai para a popularidade do Domain Driven Development que introduziu a Entidade como um dos pilares dos sistemas orientados a domínio. Contudo entidades sempre existiram porque no fundo a maior parte do desenvolvimento é orientado por esse conceito. Em EJB temos o conceito de entidade. Mais simples ou mais complexo de descrever em código ela sempre está lá. E mesmo antes da Orientação a Objetos tinhamos entidades. Afinal os modelo de Entidade-Relacionamento partem desse mesmo conceito. Mas qual é esse conceito?
Entidade é um conceito fortemente acoplado ao conceito de identidade de tal forma que o conceito de entidade é definido como : Aquilo que tem identidade.
Entender o que é uma Entidade ou se algo é entidade ou não, passar por reconhecer se esse algo possui uma identidade. Mas o que seria a identidade?
A identidade é uma característica meta-fisica que diferencia um individuo do outro. Por exemplo, todo o ser humano tem uma identidade. É isso que nos permite distinguir um individuo do outro. Contudo a identidade não é uma propriedade do individuo. Numa conversa frente a frente os traços da fisionomia podem permitir reconhecer o individuo. Mas existem pessoas muito parecidas (sósias). A voz da pessoa ajuda a completar o senso de identidade para quem a tenta diferenciar. Isso é especialmente util na ausência de poder ver a pessoa, como ao telefone ou na rádio. Mas existem pessoas que sabem imitar vozes. Nenhuma das propriedades fisicas da pessoas servem completamente para estabelecer a sua identidade e por isso dizemos que a identidade é uma propriedade meta-física, além do que podermos pegar.
Muitas propriedades tem sido usadas para identificar a pessoa. Procuram-se propriedades que sejam tão intrinsecamente únicas que podemos dizer – com grande margem de confiança – que se duas pessoas têm essa propriedade igual; são a mesma pessoa. Não certeza , mas confiança.
Exemplos clássicos destas propriedades são a impressa digital, o mapa de veias na retina e até o próprio DNA. Estas propriedades biológicas de todo o ser humano são utilizadas para identificar as pessoas e até certo ponto traduzir nelas a identidade da pessoa. Mas isto só funciona porque todos os seres humanos são pessoas , e até hoje todas as pessoas são seres humanos. No dia que isso mudar e outro tipo de ser for considerado uma pessoa – um robot, por exemplo, essa identificação biológica poderá não ser suficiente.
A conclusão aqui é que podemos utilizar propriedades da entidade para servir como comparação de identidade. Mas a identidade ela mesma, não é capturável por nenhuma propriedade ou conjunto de propriedades.
Identificadores são propriedades que: se diferentes nos conferem a certeza que os indivíduos não são o mesmo, mas que se iguais apenas nos dão uma margem de confiança de que os indivíduos são o mesmo. Essa margem de confiança é muito elevada para coisas como as impressões digitais e baixa para coisas como a cor dos olhos. Curiosamente a confiança é proporcional à dificuldade em determinar o valor dessas propriedades e está intimamente ligada à confiança em os obter. Na prática esta confiança é considerada 100%. Se dois indivíduos têm as mesmas impressões digitais eles são o mesmo.
Os identificadores são também utilizados para encontrar os indivíduos no meio de muitos. Isto se deve à assunção que eles são únicos para cada indíviduo o que não é sempre verdade. Por exemplo, o nome é um identificador. Se dois indivíduos têm nomes diferentes são indivíduos diferentes. Sabemos que existem homónimos – pessoas com o mesmo nome- e que isso nem é tão incomum assim. Mas utilizar o nome para procurar uma pessoa numa multidão, mesmo com homônimos é eficiente. No pior caso teremos que decidir usando outras propriedades (como o nome da mãe) mas ai, estaremos fazendo isso num universo de opções muito menor.
Em bancos de dados, identificadores são ótimos candidatos à indexação para acelerar as pesquisas e constrangimentos podem ser incluídos para diminuir a possibilidade de repetição. Por exemplo, não permitindo o cadastro de pessoas com o mesmo nome cujo nome da mãe e pai seja o mesmo. O que nos leva ao conceito de identificador composto.
Um identificador composto é um identificador montado a partir de várias propriedades da entidade ou até de entidades relacionadas a ela. Considerando esta definição , todos os identificadores são realmente compostos mesmo quando são formados por uma única propriedade.
O conceito de identificador e o conceito de identidade se distinguem pela sua natureza. A identidade é um conceito meta-fisico irrepresentável no seu todo enquanto o identificador é uma característica real que permite distinguir instâncias de uma mesma entidade. Além disso, a entidade tem apenas uma entidade, enquanto têm vários identificadores.
Antigamente – na era do banco de dados – era comum basear todo o sistema de dados em chaves naturais que funcionam como identificadores. Em particular números de identificação nacionais ou internacionais como CPF ou numero do passaporte. O problema com estes identificadores é que eles são definidos com base em protocolos e os protocolos tendem a ser modificados ao longo do tempo. O que significa que alongo prazo esse numero de identificação vai mudar. Isto é um pesadelo para a integridade referencial do banco de dados.
Se todos os campos identificadores estão sujeitos – em maior ou menor grau – a alterações, isso significa que não podemos confiar neles para vincular as entidades. O exemplo é simples, se eu tenho um pai e ele muda de nome eu ainda continuo sendo filho dele. O que na realidade precisamos é vincular as identidades. Isso nos indica que precisamos de uma característica que possamos armazenar e relacionar que não seja modificada pela modificação das propriedades da entidade e que esteja intimamente ligada à identidade. A solução é usar um identificador que é garantido único para cada individuo de uma entidade, mas não tem nenhum significado. Esta propriedades “artificial” da entidade atua agora como representação física da identidade da entidade e como tal é imutável uma vez atribuída. Entenda-se que isto só é possível porque teremos controle sobre o dado que servirá de aproximação para ser a identidade da entidade. Normalmente um numero sequencial, não repetível,é suficiente.
Igualdade é uma caracteristica matemática que significa que a identidade de dois ou mais objetos é a mesma. 2=2 significa que 2 é 2. Embora seja lido como “igual” o sinal matemático de igual está relacionado ao conceito de identidade; se os dois objetos são o mesmo.
Equivalência pretender determinar se para um certo contexto dois indivíduos podem representar o mesmo estado e/ou executar as mesmas tarefas. O método equals() de java.lang.Object pretende determinar se o objeto é equivalente ao objeto que foi passado. Claro que se o objeto passado for o mesmo a equivalência está garantida, mas caso contrário o método equals() é consultado.
A equivalência é portanto determinada pela comparação de um ou mais identificadores – o que for mais de acordo com o contexto – enquanto que a igualdade é comparada através da característica utilizada como determinante da identidade.
Entidades são especialmente uteis como temos diferentes tipos delas que se relacionam num modelo de domínio. Além da identidade, das propriedades, dos identificadores a entidade não está completa sem as suas relações. As relações entre as entidades permitem navegar entre indivíduos de diferentes tipos de entidade.
Na prática estas relações são mantidas criando propriedades nas entidades que se relacionam aos determinantes de identidade das outras entidades.
Entidades são abstrações dotadas de identidade. Identidade é uma característica meta-física intangível e irrepresentável. Entidades têm também um conjunto de identificadores que são compostos por subconjuntos de uma ou mais de suas propriedades . Identificadores são utilizados também para encontrar um individuo da entidade no meio de muitos.