Pergunta

Eu estou procurando uma biblioteca ou código fonte que fornece métodos de guarda, como a verificação de argumentos nulos. Obviamente, isso é bastante simples de construir, mas eu estou querendo saber se há algum para fora lá para .NET já. A pesquisa básica Google não revelou muito.

Foi útil?

Solução

CuttingEdge.Conditions . Exemplo de uso da página:

public ICollection GetData(Nullable<int> id, string xml, ICollection col)
{
    // Check all preconditions:
    id.Requires("id")
        .IsNotNull()          // throws ArgumentNullException on failure
        .IsInRange(1, 999)    // ArgumentOutOfRangeException on failure
        .IsNotEqualTo(128);   // throws ArgumentException on failure

    xml.Requires("xml")
        .StartsWith("<data>") // throws ArgumentException on failure
        .EndsWith("</data>"); // throws ArgumentException on failure

    col.Requires("col")
        .IsNotNull()          // throws ArgumentNullException on failure
        .IsEmpty();           // throws ArgumentException on failure

    // Do some work

    // Example: Call a method that should not return null
    object result = BuildResults(xml, col);

    // Check all postconditions:
    result.Ensures("result")
        .IsOfType(typeof(ICollection)); // throws PostconditionException on failure

    return (ICollection)result;
}

Outra abordagem agradável, o que não é embalado em uma biblioteca, mas poderia facilmente ser, em Paint.Net blogue :

public static void Copy<T>(T[] dst, long dstOffset, T[] src, long srcOffset, long length)
{
    Validate.Begin()
            .IsNotNull(dst, "dst")
            .IsNotNull(src, "src")
            .Check()
            .IsPositive(length)
            .IsIndexInRange(dst, dstOffset, "dstOffset")
            .IsIndexInRange(dst, dstOffset + length, "dstOffset + length")
            .IsIndexInRange(src, srcOffset, "srcOffset")
            .IsIndexInRange(src, srcOffset + length, "srcOffset + length")
            .Check();

    for (int di = dstOffset; di < dstOffset + length; ++di)
        dst[di] = src[di - dstOffset + srcOffset];
}

Eu usá-lo em meu projeto e você poderia pedir o código de lá.

Outras dicas

Diante da Microsoft contratos de código saindo com .NET 4.0 eu tentaria encontrar um que é na maior parte compatível, se possível - e se não, escreva você mesmo. Dessa forma, quando você atualizar para .NET 4.0 (eventualmente) a migração será mais fácil.

Existem vários métodos que você pode usar.

O meu favorito é usar Aspect Oriented Programming. Confira PostSharp.

Você também pode dar uma olhada em Spec #, uma extensão para C #

No 4.0, você terá uma biblioteca contrato full-featured.

Finalmente, um colega meu veio com uma biblioteca guarda bastante útil: http://blueonionsoftware.com/blog.aspx?p= ca49cb62-7ea2-43c5-96aa-91d11774fb48

Eu não sei de nenhum que estão disponíveis comercialmente. Há algum suporte para este tipo de código nos padrões e práticas Enterprise Library. Há também um monte de projetos de código aberto que parecem fazer isso também (em diferentes graus) no CodePlex: http://www.codeplex.com/Project/ProjectDirectory.aspx?ProjectSearchText=validation .

Na maioria das vezes, estes tipos de bibliotecas acabar sendo personalizado escrito e ficar interno à empresa que usa-los.

Há um apoio vindo em .NET 4.0 para fornecer mecanismos para fazer isso usando Contratos Código , que são baseados em Spec #.

Eu escrevi recentemente um post sobre classes de guarda (não tendo encontrado qualquer informação quer): http://ajdotnet.wordpress.com/2009/08/01/posting-guards-guard-classes-explained/

Eu também publicada uma implementação respectiva classe de Guarda (sinta-se livre para usar este código como está, ou para ajustá-lo às suas necessidades): ajdotnet.wordpress.com/guard-class /

No que diz respeito à relação entre as classes Guarda e Contrato Código em .NET 4.0 (sucessor Spec #), ter um olhar para o seguinte post: www.leading-edge-dev.de/?p=438

(desculpem as ligações fragmentados, o site só é permitido um link ...)

HIH, AJ.NET

Instale o pacote NuGet netfx-guarda. Você começa também trechos de código NOTNULL e NotEmpty, e ele executa tão rápido quanto suas verificações manuais

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