Uso Adequado de uma instância de classe
-
13-09-2019 - |
Pergunta
Eu estou usando Access 2003 VBA para processar dados recursiva para a fabricação de BOMs. Eu construí um módulo de classe para deixar minhas principais mesas têm escopo estático. Este parece simplificar recursão - ele define me libertar níveis contagem regressiva e de novo como eu percorrer uma lista de materiais. Não estou abrindo o mesmo conjunto de registros de forma redundante; Eu estou filtrando muita vez.
Depois de obter isso eu andamento ler sobre relação de objeto Modelagem e decidiu não instância um conjunto de registros, mas um registro. Em seguida, os campos desse registro poderia ser propriedades. Depois de muito trabalho e muitas emoções da vitória que eram em sua maioria enganado, eu percebi essa abordagem não tem benefícios porque o acesso é baseada em tabela.
As minhas módulos de classe ainda ajuda como antes. Minha pergunta é sobre duas versões alternativas abaixo. O primeiro usa duas instâncias (pais, filhos). A segunda usa um e depois a reutiliza. Obviamente, o primeiro é influenciado-ORM.
Existe alguma razão para escolher um deles sobre o outro? Além disso, observe o itálico linha no final: Se eu não preciso disso (porque eu não preciso de mais informações sobre o Pai), isso muda a resposta? Alguém pode me ajudar com o meu pensamento em geral?
(Note que eu registos perto, mas não instâncias de classe. O meu entendimento é que as instâncias VBA fechar-se e deixá-los fazer isso é prática aceita. Parece que tenho pseudo-código levado a novos níveis de pseudo ... o objetivo é clareza, espero que funcione.)
VERSION 1 Property Sub ReviewPart ( Parent_Part_ID ) Get Parent_Part_ID Create instance of Class --> Get recordset Filter Class recordset ( Parent_Part_ID ) Exploit Class recordset See if Parent_Part_ID has Childs If it does: Open recordset of Childs For each Child Get Child_Part_ID Create instance of Class --> Get recordset Filter Class recordset ( Child_Part_ID ) Exploit Class recordset See if Child_Part_ID has Childs If it does: Instance New ReviewPart ( Child_Part_ID ) Otherwise: Nothing; Move On Next Child Close recordset of Childs Otherwise: Move On Exploit Class recordset ( still points to parent )
VERSION 2 Property Sub ReviewPart ( Parent_Part_ID ) Get Parent_Part_ID Create instance of Class --> Get recordset Filter Class recordset ( Parent_Part_ID ) Exploit Class recordset See if Parent_Part_ID has Childs If it does: Open recordset of Childs For each Child Get Child_Part_IDCreate instance of Class --> Get recordsetFilter Class recordset ( Child_Part_ID ) Exploit Class recordset See if Child_Part_ID has Childs If it does: Instance New ReviewPart ( Child_Part_ID ) Otherwise: Nothing; Move On Next Child Close recordset of Childs Otherwise: Move On Filter Class recordset ( Parent_Part_ID ) Exploit Class recordset ( still points to parent )
Solução
Parece que o ex-dá-lhe uma melhor facilidade de utilização do ponto de vista do programador, como se pode simplesmente começar com o registro que você está interessado e facilmente raiz em registros associados apenas ao acessar propriedades do registro que você começou com.
Por outro lado, este último parece ser mais eficiente, como não é pessimista carregar cada registro que pode estar relacionado com a atual.
Um par de potenciais otimizações para a primeira abordagem que pode ajudá-lo a aproximar-se a eficiência do segundo, mantendo a facilidade de uso:
- Coloque apenas os registros filho como eles são necessários. Usando get / set assessores lhe permitirá carregar os até just-in-time, em vez de tudo de uma vez, quando o registro pai é puxado do DB.
- Como alternativa, use um JOIN para recuperar todos os dados da criança ao mesmo tempo como parte de uma única consulta. Isto ainda iria dar-lhe todos os dados pré-carregado, mas iria reduzir o número de consultas que você tem que correr para obtê-lo substancialmente.
Hope isso é alguma ajuda.
Outras dicas
Você já pensou em usar o provedor MSDataShape e a sintaxe SHAPE para produzir hierárquica ADO conjuntos de registros ?