Um objeto deve saber seu próprio ID?

22

obj.idparece bastante comum e também parece estar dentro do alcance de algo que um objeto poderia saber sobre si mesmo. Eu me pergunto por que meu objeto deve saber seu próprio ID?

Não parece ter um motivo para tê-lo? Um dos principais motivos de sua existência é recuperá-lo e, portanto, meus repositórios precisam conhecê-lo e, portanto, usá-lo para interação com o banco de dados.

Uma vez, também encontrei um problema em que queria serializar um objeto para JSON para uma API RESTful em que o ID não parecia caber na carga, mas apenas o URI e a inclusão no objeto tornaram isso mais difícil.

Um objeto deve saber sua própria identificação? por que ou por que não?

update : Termos

  1. id: atributo identificador em um objeto. em termos de banco de dados, uma chave substituta não é uma chave natural.
  2. Objeto: uma entidade ou outro objeto identificável de forma única no sistema.
xenoterracida
fonte
1
Para permanecer abstrato, se não houver motivo para armazenar informações, não as armazene. Apenas cria dores de cabeça.
3
Se você não conhece a chave exclusiva de um objeto, como atualizaria os dados em um banco de dados ou permitiria ao usuário selecionar uma ocorrência em uma lista?
NoChance
@ EmmadKareem, o que estou dizendo é que a coleção (repositório) conhece o ID, então por que o próprio objeto precisa. Se eu estivesse renderizando uma lista, provavelmente renderizaria a coleção, que conhece os IDs.
Xenoterracide
Se você não usar o ID armazenado no objeto e nunca pretender ou quiser usá-lo, isso claramente não é necessário.
GrandmasterB
@GrandmasterB bem, é claro que você usa o ID, a questão é se você armazena o ID na memória com o objeto e por quê.
xenoterracide

Respostas:

8

Resposta curta: Incluir um identificador de objeto dentro do objeto é obrigatório se for encaminhado.

Para um cenário em que você planeja usar uma coleção de objetos e tem planos para indicar um objeto / entidade individual, o identificador deve ser incluído. No entanto, pode haver casos em que chave / identificador natural como DateTimepossa atender artificialmente a essa necessidade.

Além disso, você pode ter seus DTOs como um contêiner leve do seu objeto, que pode pular / incluir o identificador de objeto em si. Realmente, todas essas opções dependem realmente dos casos e necessidades de uso de negócios .

Editar: se você deseja identificar seu objeto, precisa de um identificador. Esse identificador pode ser um ID substituto, data e hora, guia, etc ... basicamente, qualquer coisa que identifique seu objeto de outras pessoas de uma maneira única.

EL Yusubov
fonte
2
por que eles deveriam ser incluídos no objeto, e não apenas na coleção (assumindo que a coleção seja algum tipo de dicionário)?
Xenoterracide
o que quero dizer é que, se você deseja identificar seu objeto, precisa de um identificador. pode ser Id, data e hora, etc ... qualquer coisa que identifique seu objeto de outras pessoas.
EL Yusubov 29/09/12
1
bem, é claro, minha pergunta é mais sobre por que o próprio objeto precisa estar ciente desse identificador.
Xenoterracide
para esclarecer um pouco quero dizer um id substituto, geralmente coisas como data e hora do ou números de vin, são naturais e, portanto, parte dos dados, e não com o nome id(ou pelo menos eu não faria)
xenoterracide
6

Na tentativa de deixar minha resposta tão abstrata quanto sua pergunta, acho que você realmente respondeu sua própria pergunta.

Um objeto deve saber seu próprio ID, se necessário.

Um objeto não deve saber seu ID (ou mesmo o possui) se não precisar.

Como você apontou, há casos em que é inconveniente ou desnecessário para o objeto reter ou saber se seu ID. Mas há outros casos em que é mais conveniente que o objeto esteja ciente de seu ID. Codifique seus objetos conforme apropriado para o uso deles.


fonte
Em que casos é conveniente que ele esteja ciente de sua identificação? Estive pensando e pensando que a maioria deles poderia basear-se na maneira como foi codificada, talvez um loop for usado para renderizar, obj.idem vez de renderizar a própria coleção.
Xenoterracide
1
@xenoterracide - a visualização assíncrona e a atualização dos registros do banco de dados é um exemplo. Em alguns casos, não terei informações suficientes para identificar exclusivamente um registro, exceto seu ID, portanto, faz sentido manter o ID com o objeto de registro.
mas isso é uma causa ou um efeito? é um requisito? se o seu repositório / coleção / datamapper (ou alguma cadeia dele) for responsável por persistir as atualizações, e souber o ID e puder transmiti-lo ... Estou tentando entender se há um motivo para seguir ou se está lá porque muitas pessoas usam e padrão de registro ativo.
Xenoterracide
@xenoterracide - nos casos em que estou pensando, definitivamente era uma necessidade causal. Em alguns casos em que estive, era muito mais conveniente manter o ID associado ao objeto. Sua pergunta foi boa porque desafiou uma suposição básica que muita gente faz. Tendemos a aprender quando analisamos suposições como essa. Por outro lado, não analise demais e siga na direção oposta. Caso contrário, você acabará fazendo as mesmas declarações sacrossantas que estava quebrando em primeiro lugar.
4

É bastante comum incluir o ID, mas também é comum usar dicionários, ou seja, as estruturas de dados em que cada objeto está associado ao seu ID, de maneira que você possa recuperar facilmente esse objeto sabendo o ID correspondente, mas o objeto não sabe isto.

Por exemplo, se você estiver criando uma API com dois métodos:

Então você não precisa reenviar o ID 452 na resposta JSON da segunda solicitação. O usuário da API já conhece o ID.

Arseni Mourzenko
fonte
4

Eu acho que isso é subjetivo e depende do seu design.

Principalmente, embora pareça ser um design que vem de um registro ativo . Em um registro ativo, sua entidade possui métodos para executar operações de banco de dados e, portanto, também deve saber seu identificador de banco de dados.

Ao usar outros padrões, como um repositório com um mapeador de dados que armazena esses dados no objeto, torna-se desnecessário e talvez inapropriado.

Tomemos, por exemplo, um Personobjeto. Recebo um nome que pode ou não ser único em uma família. À medida que a população cresce, nomes maiores não são mais exclusivos e, por isso, criamos identificadores substitutos para sistemas cada vez maiores. Exemplos disso incluem: minha carteira de motorista e número de segurança social. Não nasci atribuído um ID, todos esses IDs devem ser solicitados.

A maioria deles não fornece boas chaves / IDs primárias para software, pois não são universais. Pelo menos não fora de seu sistema específico, obviamente um SSN é único e consistente para a Administração de Seguridade Social. Como geralmente não somos os fornecedores dessas informações, você não os chamaria, idmas sim os dados que eles representam, por exemplo SSN. Às vezes, até contém o objeto composto completo, como um DriversLicenseque pode conter todas as informações da carteira de motorista.

Todos os IDs gerais são, portanto, chaves substitutas no sistema e podem ser substituídos por referências na memória, contendo apenas IDs para facilitar a procura e a persistência de registros.

Como um idnão é um dado conceitual, duvido que ele (geralmente) pertença ao objeto, pois não vem do domínio. Em vez disso, ele deve ser mantido com o objetivo de identificar um objeto que não tem outra maneira de representar uma identidade única. Isso pode ser feito em um repositório / coleção com facilidade.

No software, se você precisar representar o objeto como uma lista ou persistir, basta fazê-lo no objeto de repositório / coleção ou em algum outro objeto associado a ele. Ao passar para o Data Mapper (se estiver separado), você pode simplesmente passar .update( id, obj ).

Isenção de responsabilidade : ainda não tentei criar um sistema que não contenha o ID na entidade e, portanto, possa me provar errado.

xenoterracida
fonte
2

Como GlenH7 observou em um comentário, é uma boa pergunta, porque desafia o que muitas pessoas dão como certo. Minha opinião, no entanto, é que, mesmo que deixar o id de fora possa parecer conceitualmente puro, a coisa pragmática a fazer seria manter o id com o objeto em tantas camadas do sistema quanto possível. Custa pouco, mas pode ser útil quando as coisas começam a quebrar.

Uma entidade pode não precisar saber seu ID, assim como uma pessoa não precisa saber seu número de identificação pessoal, número da carteira de motorista nem qualquer outro identificador que possa estar em uso no seu local. Você certamente poderia ficar sem ele na maioria das vezes. É sábio, no entanto, levar algum tipo de identificação em você, apenas por precaução.

O mesmo pode ser dito de um objeto. Independentemente das complexidades da camada de acesso a dados, o objeto é mapeado para uma determinada entrada do banco de dados. Esta entrada pode ser identificável exclusivamente pelo ID do objeto. Nesse caso, eu preferiria ter essas informações disponíveis a qualquer momento, independentemente de eu estar depurando algum código da interface do usuário, processamento de números na camada de negócios, o próprio repositório ou um sistema dependente em um serviço da web. Ou se eu estou navegando nos logs de erro para esse assunto.

No seu caso, se você está apenas buscando dados do banco de dados e enviando-os pelo serviço da web, deixar o ID de fora pode ser a coisa certa a fazer. Só não acredito que faça mais sentido do que mantê-lo no caso geral.

scrwtp
fonte
2

Você está certo, não precisa armazenar o ID no objeto, contanto que você só precise conhecê-lo no seu contexto de repositório.

A situação muda quando você passa o objeto para codificar fora desse contexto, código que não solicitou o objeto pelo ID (e, portanto, ainda não o conhece), mas precisa do ID para qualquer finalidade (por exemplo, colocá-lo em uma lista de IDs que serão solicitados posteriormente ao repositório por outro código).

Nessa situação, você tem duas opções:

  • introduzir um novo argumento de função 'id' em toda a cadeia de funções entre o contexto do repositório e a função em que o id é necessário

  • inclua o ID no objeto

Na maioria desses casos, armazenar a identificação dentro do objeto será a melhor solução. Também reduzirá as alterações de código quando o ID for necessário em locais imprevistos, além de poder ser útil na depuração às vezes.

É por isso que faço quando faço.

Paul Thomann
fonte