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

Dica de Design: usando máquinas de estado para lidar com a complexidade no VB

Há situações em que as coisas se tornam especialmente complexas e não conseguimos enxergar com clareza como lidar com os diversos relacionamentos entre os objetos. Neste caso o que se pode fazer é levantar todos os estados possíveis do conjunto e os eventos que podem ser disparados em cada um destes estados. Construímos então uma matriz em que as linhas representam os estados e as colunas os eventos. No cruzamento de cada linha com coluna, teremos uma rotina a ser chamada para tratar aquele evento quando o sistema estiver naquele estado. Você pode usar este esquema apenas para construir um mapa que o oriente na codificação ou ir mais além e embutir o  próprio esquema no programa. Para isto a técnica consistiria em criar a matriz e construir uma enumeração para conter identificadores para os estados e outra enumeração para conter identificadores para os eventos. A matriz seria do tipo String, pois no cruzamento de cada linha com coluna seria armazenado o nome da rotina que trata aquele evento naquele estado. Haveria uma variável para conter o estado atual do sistema (ou subsistema) e um rotina central chamada MaquinaDeEstados, que seria chamada a cada evento para buscar na matriz estados-eventos o nome da rotina a ser chamada para tratar aquela situação. A rotina seria chamada pelo nome usando o comando CallByName do VB6. A rotina chamada retornaria o estado seguinte do sistema após a sua conclusão ou um erro que faria a MaquinaDeEstados restaurar o valor do estado ao que era antes da rotina ser chamada. A rotina que acusasse o erro teria que ter um tratamento de erros apropriado para restaurar o sistema ao estado prévio à sua chamada.

Como você vê, embutir uma máquina de estados é muito trabalhoso para se usar a qualquer hora,  mas em situações muito particulares pode ser a melhor solução para lidar com a complexidade. Vale porém ter o conceito em mente para construir ao menos um mapa que o oriente na codificação em situações complexas.