Pergunta

Eu estou usando o padrão mapeador de dados em um aplicativo PHP que estou desenvolvendo e tem uma dúvida. No momento, você solicitar um objeto de site com um ID específico e o mapeador irá procurar a linha, criar um objeto e devolvê-lo. No entanto, se você fizer isso novamente para o mesmo site que você acabar com dois objetos diferentes com dados idênticos. por exemplo:.

$mapper = new Site_Mapper();
$a = $mapper->get(1);
$b = $mapper->get(1);

$a == $b // true
$a === $b // false

Então, minha pergunta deve é, I:

  1. loja instanciado objetos de site em o mapeador para que eu possa, em seguida, verificar se eles já existem antes de criar um novo (poderia ser um problema se há vários mapeadores do mesmo digite)
  2. Faça o mesmo que # 1, mas garantir há sempre apenas uma instâncias de cada mapeador
  3. Faça o mesmo que # 1, mas o uso de um propriedade estática de modo múltiplo casos não é um problema
  4. Não se preocupar com isso porque é provavelmente não é um problema
Foi útil?

Solução

Eu iria com cache de alguma forma - aulas mapeador estáticos seria minha primeira escolha, e é o que eu vi a maior parte. Caso contrário, sua opção 2 (que é o padrão Singleton) é provavelmente a melhor opção.

Lembre-se que você precisa para limpar esta cache quando uma atualização é feita para evitar o retorno de dados obsoletos.

Dito isto, a menos que você está fazendo algo para obter um lote de uso ou que faz um monte de perguntas, ele pode não importa. (O 4)

Também vale a pena olhar para orientação (eu tenho certeza que existem muitos exemplos, eu só sei que este melhor), Propel ( http://propel.phpdb.org/ ) tem o recurso de cache - pode valer a pena olhar como ele faz isso? Ou apenas usá-lo, talvez?

Outras dicas

O que você está procurando é o Identidade Map padrão. Tenha cuidado com os chamados "inconsistências de leitura", no entanto. Enquanto você usar uma "instância de idade", o DB pode já ter sido alterado. E enquanto você editar o seu objeto, outro usuário pode obter uma instância do mesmo, alterá-lo mais rápido e guardá-lo mais rápido. Em seguida, o outro objeto substitui todas essas mudanças novamente. Na web embora talvez não um problema tão grande desde uma "página" é executado rapidamente através e não sobrevive objeto por mais de alguns segundos fracionários.

Eu sei que a pergunta foi feita há bastante tempo ainda queria responder apenas no caso, se alguém é executado em um dilema semelhante. Na verdade, o acima sugestões # 1,2,3 que o autor fez são todos relacionados e deve-se considerar todos eles, a fim de resolver o problema.

1) Armazene cada recuperado do DB objeto em um mapeador de modo que você não tem que fazê-lo novamente quando o objeto com o mesmo ID é solicitado. Em todas as chamadas subsequentes o mapeador deve retornar o objeto armazenado. Isso é chamado IdentityMap padrão. Para alcançar este objectivo fazer uma propriedade privada em sua mapeador de manter uma instância de um IdentityMap para um determinado tipo de objeto. O método Site_Mapper-> get () deve sempre verificar o IdentityMap para um determinado ID se o objeto não é recuperado ainda o mapeador irá para o banco de dados, mas se ele já está armazenado no mapa que retorna a instância em cache que salva a viagem para o base de dados. Assim então $ a === $ b deve ser verdade porque eles seriam referências para a mesma instância do objeto.

2) Sim idealmente deve haver sempre uma instância do dado mapeador de dados (Site_Mapper) a fim de manter uma única instância do IdentityMap em um determinado momento. Isso pode ser feito usando Singleton padrão. Isso é possível com algum método getter como Site_Mapper :: getInstance () que será sempre retornar a mesma instância de uma determinada mapeador. Você também teria que declarar a __ construct () como um método particular para evitar instanciação indesejado usando new e certifique-se getInstance () é a única maneira de instanciar um mapeador.

3) O que o autor mencionado acima sobre propriedades estáticas também é verdadeiro. Para implementar um Singleton em PHP tem de se usar uma propriedade estática de segurar e instância de um Mapper.

Eu recomendo o livro de Martin Fowler "Patterns of Enterprise Application Architecture", que fala sobre o acima padrões mencionados e muitos mais. É uma boa leitura, especialmente se você está trabalhando em sua própria solução ORM personalizada. Espero que ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top