A melhor maneira de afirmar a pré-condição e pós-condição de argumentos e valores no .NET?

StackOverflow https://stackoverflow.com/questions/155422

  •  03-07-2019
  •  | 
  •  

Pergunta

Ultimamente, tenho pensado em design por contrato e queria saber o que as pessoas pensam que é a melhor maneira de afirmar a pré-condição e pós-condição de valores no .NET? ou seja, valores de argumento validando para um método.

Algumas pessoas recomendam o debug.assert, enquanto outras falam sobre o uso de uma declaração IF Plus lançando uma exceção. Quais são os prós e contras de cada um?

Quais estruturas estão disponíveis que você recomenda?

Foi útil?

Solução

Eventualmente, usaremos os contratos de código quando o .NET 4.0 formar. No entanto, em nosso código de produção no momento, tivemos grande sucesso com uma classe de "guarda", juntamente com uma maneira comum de gerar exceções.

Para mais detalhes, veja Meu post sobre isso.

Outras dicas

Outra opção é Spec#.

Spec# é uma extensão da linguagem orientada a objetos C#. Ele estende o sistema de tipos para incluir tipos não nulos e exceções verificadas. Ele fornece contratos de método na forma de pré e pós-condicionas, bem como invariantes de objetos.

Eu prefiro exceções a serem afirmadas porque, se deveria ser assim e não for, quero saber sobre isso para que eu possa corrigi-lo, e a cobertura que obtemos no modo de depuração não está nem perto do uso ou cobertura da vida real, então apenas Usar Debug.assert não faz o suficiente.

Usar afirma significa que você não adicionará inchaço ao seu código de liberação, mas isso significa que você só pode ver quando e por que esses contratos serão quebrados se você os pegar em uma construção de depuração.

Usar exceções significa que você pode ver a quebra do contrato sempre que acontecer, depuração ou liberação, mas também significa que sua construção de lançamento contém mais verificações e código.

Você pode seguir uma abordagem entre os rastreamentos e usar o rastreamento para rastrear suas condições pré e postagens a algum tipo de registro de aplicativos, que você poderia usar para depurar problemas. No entanto, você precisaria de uma maneira de colher esses logs para aprender quais problemas seus usuários estão encontrando. Existe também a possibilidade de vasculhar isso com exceções, para que você obtenha exceções para os problemas mais graves.

A maneira como vejo, porém, é que, se vale a pena aplicar o contrato, vale a pena jogar uma exceção quando ele quebra. Eu acho que isso é um pouco para a opinião e a aplicação de destino. Se você lançar exceções, provavelmente deseja algum tipo de sistema de relatórios de incidentes que forneça relatórios de falha quando exceções elevadas são deixadas não enfrentadas.

Você pode dar uma olhada na estrutura fluente em http://conditios.codeplex.com/Seu código aberto e grátis.

Spec# é a maneira de fazê -lo, que é um superconjunto de C#. Agora você tem "Contratos de código", que é a versão em idioma-agnóstico da Spec#, então agora você pode ter contratos de código no VB.NET, por exemplo.

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