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 Person
objeto. 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, id
mas sim os dados que eles representam, por exemplo SSN
. Às vezes, até contém o objeto composto completo, como um DriversLicense
que 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 id
nã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.