Visual Basic, VB .NET, ASP, Active X, Access, SQL Server

OOP no Visual Basic: sinalizando alterações em composições de objetos

Objetos podem existir em separado ou como parte de composições. Quando temos uma composição que deve ter as alterações nos seus objetos componentes gravadas no banco de dados, podemos criar um método comum a todos os objetos que é chamado em cada um deles para que se grave no banco de dados. Se a composição for uma hierarquia, ao chamar o método no objeto de mais alto nível, este se encarregará de propagá-lo pelos níveis mais baixos. Isto é feito dentro de uma transação para que qualquer erro que ocorra na gravação de uma das partes aborte toda a transação evitando incoerências no banco de dados.

O que foi dito acima, contudo, requer que tenhamos sinalizadores para saber quando um objeto sofreu alguma alteração e precisa atualizar a base de dados e quando deve simplesmente ignorar as chamadas ao seu método de persistência  (gravação no bd). Mais do que isto, se o objeto for composto por objetos filhos, pode ocorrer de ele não ter sido alterado, mas um dos seus componentes sim. Isto significa que, enquanto composição, ele foi alterado, mas seus dados básicos podem não ter mudado. Se o objeto pai não sofreu alteração, não é preciso que ele se grave no banco de dados, mas apenas que chame o método de persistência dos seus filhos para que se atualizem no bd. Há, portanto, duas situações:

- estado do objeto pai foi alterado

- estado de objeto componente alterado

Dependendo da situação, uma ação diferente deverá ser tomada. Portanto, devemos ter dois sinalizadores diferentes: um para a composição e outro para o objeto em si. Chamemos de ComposicaoAlterada uma propriedade para sinalizar as alterações na composição, e ObjetoAlterado uma propriedade para sinalizar as alterações no objeto. Todos os objetos que sejam compostos devem ter estas duas propriedades e os objetos simples devem ter apenas a propriedade ObjetoAlterado. Sempre que a propriedade ComposicaoAlterada ou ObjetoAlterado de um objeto for posta em TRUE, ela deve transmitir este valor para a propriedade ComposicaoAlterada do seu objeto pai. Desta forma, qualquer alteração em um objeto da composição será transmitida para todos os seus objetos de mais alto nível. Na chamada ao método de persistência de qualquer objeto, estas propriedades são testadas. Se apenas a propriedade ComposicaoAlterada estiver em True, o objeto apenas chama os métodos de persistência dos seu filhos. Caso a sua propriedade ObjetoAlterado esteja em TRUE, o objeto também persiste suas alterações no bd. Em caso de erro de persistência em algum nível da hierarquia, o objeto em que o erro ocorreu deve propagar este erro para os níveis superiores para que, ao chegar ao nível mais alto, a hierarquia como um todo seja restaurada e a transação abortada. Como nem sempre os objetos que fazem parte de uma hierarquia existem apenas dentro dela, sugiro que o método de persistência tenha um argumento sinalizando se o objeto deve se auto-recuperar em caso de erro ou deixar que outro de nível mais alto o faça por ele.

Observações:

- para uma técnica de relacionar objetos pais com objetos filhos de forma a não gerar referências circulares, veja a dica Lidando com referências circulares.

- para técnicas de armazenamento do estado de um objeto ou de toda uma composição, veja o artigo sobre serialização.