«Дизайн по контракту» в C # - PullRequest
35 голосов
/ 04 ноября 2008

Я хотел попробовать немного дизайна по контракту в моем последнем приложении на C # и хотел иметь синтаксис, похожий на:

public string Foo()
{
    set {
        Assert.IsNotNull(value);
        Assert.IsTrue(value.Contains("bar"));
        _foo = value;
    }
}

Я знаю, что могу получить подобные статические методы из фреймворка для юнит-тестирования, но я хотел знать, было ли что-то подобное уже встроено в язык или уже существовала какая-то фреймворк. Я могу написать свои собственные функции Assert, но не хочу изобретать велосипед.

Ответы [ 11 ]

1 голос
/ 04 ноября 2008

Вы можете проверить nVenttive Umbrella :

using System;
using nVentive.Umbrella.Validation;
using nVentive.Umbrella.Extensions;

namespace Namespace
{
    public static class StringValidationExtensionPoint
    {
        public static string Contains(this ValidationExtensionPoint<string> vep, string value)
        {
            if (vep.ExtendedValue.IndexOf(value, StringComparison.InvariantCultureIgnoreCase) == -1)
                throw new ArgumentException(String.Format("Must contain '{0}'.", value));

            return vep.ExtendedValue;
        }
    }

    class Class
    {
        private string _foo;
        public string Foo
        {
            set
            {
                _foo = value.Validation()
                    .NotNull("Foo")
                    .Validation()
                    .Contains("bar");
            }
        }
    }
}

Хотелось бы, чтобы расширения Validation были компоновщиками, чтобы вы могли делать _foo = value.Validation().NotNull("Foo").Contains("bar").Value;, но это то, чем оно является (к счастью, его открытый исходный код, поэтому сделать его компоновщиком - тривиальное изменение).

И в качестве альтернативного решения вы можете рассмотреть проверку домена .

Наконец, новые языки M , в составе Oslo поддерживают ограничения на их экстенты и поля, которые переводят как в проверку T-SQL, так и в класс CLR с функционирующими проверочными тестами ( хотя до освобождения Осло еще много времени).

...