Existe um padrão comum para lidar com dados ausentes encontrados em um aplicativo?

5

Eu tenho um aplicativo de gerenciamento de produção que estou no meio do reprojeto para torná-lo mais universal (adquirimos uma pequena empresa e eles também usarão a ferramenta). Onde antes eu tinha muitos valores codificados porque o aplicativo tinha um único cliente, agora é mais configuração baseada em vários elementos de dados vindos de arquivos de opções ou tabelas de banco de dados. Isso é recompensador, pois é um projeto melhor e o aplicativo está evoluindo, mas apresentou um novo desafio: serviços e componentes de baixo nível enfrentando situações em que faltam dados.

Por exemplo, posso ter um componente de geração de número de série que costumava ter uma string codificada que usaria como parte do número de série, agora que "base serial number" é gerado dinamicamente e proveniente de uma string de formato armazenada em a tabela de produtos. Existem várias camadas e classes entre os dados da tabela de produtos e o componente que gera o número de série. Eu quero lidar com a exceção de dados perdidos e permitir que o usuário corrija o problema na sessão atual do aplicativo em vez de explodir e travar.

Eu vejo duas abordagens possíveis:

  1. Adicione validação de dados profunda no ponto de solicitação para garantir que tudo esteja lá para evitar encontrar exceções no código de baixo nível. Eu não gosto disso porque significa que minha camada de apresentação precisaria ter conhecimento sobre os objetos e dados envolvidos downstream ou eu precisaria polvilhar todos os meus objetos com os métodos "HasRequiredData ()".

  2. Crie um novo tipo de exceção que represente o problema geral de dados ausentes. Quando um componente de baixo nível encontra uma situação em que os dados de que necessita não estão disponíveis, isso gera essa exceção. A camada de apresentação, em seguida, lida com essa exceção bem.

Então, minha pergunta é: a opção 2 parece ser uma boa abordagem e design para todos vocês? Existe outra abordagem comum para questões como essa?

    
por Steve K 03.12.2016 / 01:15
fonte

3 respostas

1

O tratamento comum (como eu vejo) é levantar uma exceção e registrar o erro. Você sempre terá casos em que a lógica de negócios chega a lugares onde ninguém esteve antes. Isso significa que você precisa lidar com a exceção normalmente:

  • informa o usuário sobre a exceção,
  • limpe a pilha,
  • registre o erro e
  • mais tarde, verifique regularmente se as mensagens são limpas e fornecem correções.
por 03.12.2016 / 09:39
fonte
0

Se o seu processo for de longa duração ou de missão crítica, a pré-validação é um requisito.

A validação profunda não requer a quebra da separação de interesses. Uma solução seria fazer com que cada componente que consome configuração exponha o método de pré-validação (como os componentes são aninhados, esses métodos podem ser aninhados também). Em seguida, em um estágio de alteração de configuração, esses métodos seriam capazes de fornecer uma descrição compreensível do defeito de configuração ao usuário que está executando a reconfiguração.

Tal verificação de pré-condição é freqüentemente usada com um padrão de comando - um comando composto executa verificações de pré-condição para todos os filhos antes que ele permita a execução do self.

    
por 03.12.2016 / 12:43
fonte
0

Quando seu programa tropeça em alguns dados ausentes, ele precisa funcionar corretamente, o que não pode ser substituído de forma confiável por algum valor padrão significativo, ele deve lançar uma exceção. Caso contrário, isso poderia mascarar erros graves, levar a resultados incorretos ou inesperados ou simplesmente travar o aplicativo, o que provavelmente não é o que você deseja.

No entanto, tenha cuidado com a solução proposta de "manipular a exceção de dados perdidos e permitir que o usuário corrija o problema na sessão atual do aplicativo" . Se o seu programa começar a pedir ao usuário para inserir dados perdidos no momento em que o programa percebe o problema, ele pode estar no meio de uma transação ou simplesmente não se encaixará no processo de trabalho do usuário. Por exemplo, o usuário que está lidando com o caso de uso atual pode não ter os valores ausentes disponíveis naquele momento, ou pode não ser a pessoa que pode preparar os dados ou os dados precisam de uma verificação de qualidade especial por um segundo pessoa e assim por diante.

Então - dependendo do caso de uso real - ter uma etapa adicional "validação profunda de dados" antes do início do caso de uso principal pode ser a coisa correta a ser feita, com a opção de resolver o problema antes o caso de uso é iniciado. Isso deve ser independente do fato de seu programa lançar exceções adequadas.

Você não encontrará um "padrão comum" de como lidar com isso, porque essa não é uma situação "tamanho único". Sempre que você introduzir dados de configuração em um processo de negócios em que anteriormente foram usados valores codificados, será preciso analisar detalhadamente quem será responsável por gerenciar esses dados . Anteriormente, foi o desenvolvedor do aplicativo. Agora, pode se tornar outra pessoa. Alguns desses tipos de dados podem ser fornecidos melhor por um administrador, alguns pelo próprio usuário, alguns por usuários especiais de "poder", talvez em uma etapa de preparação de caso de uso. Às vezes, os desenvolvedores podem fornecer bons valores padrão para esses dados, mas fornecem aos usuários a disponibilidade para alterá-los posteriormente. E alguns desses dados ainda podem ser gerenciados exclusivamente pelos desenvolvedores.

Você terá que decidir isso para todos os atributos dos dados em questão. Não há uma maneira fácil de contornar isso.

    
por 03.12.2016 / 11:12
fonte