Подтвердить что ты не робот

Рефакторинг гвардии

Какие подходы предпринимают люди (если они есть) при управлении взрывом guard clause в ваших классах? Например:

public void SomeMethod<T>(string var1, IEnumerable<T> items, int count)
{
    if (string.IsNullOrEmpty(var1))
    {
        throw new ArgumentNullException("var1");
    }

    if (items == null)
    {
        throw new ArgumentNullException("items");
    }

    if (count < 1)
    {
        throw new ArgumentOutOfRangeException("count");
    }

    ... etc ....
}

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

Мне известны кодовые контракты .NET 4.0, но это не вариант для нашей команды на данный момент.

4b9b3361

Ответ 1

Многие проекты, которые я видел, используют статический класс Guard.

public static class Guard {
    public static void ArgumentIsNotNull(object value, string argument) {
        if (value == null)
            throw new ArgumentNullException(argument);
    }
}

Это делает код намного более чистым, на мой взгляд.

Guard.ArgumentIsNotNull(arg1, "arg1");

Ответ 2

Если вы не хотите идти по пути "Кодовые контракты", одним из способов его упрощения является удаление фигурных скобок:

public void SomeMethod<T>(string var1, IEnumerable<T> items, int count)
{
    if (string.IsNullOrEmpty(var1))
        throw new ArgumentNullException("var1");

    if (items == null)
        throw new ArgumentNullException("items");

    if (count < 1)
        throw new ArgumentOutOfRangeException("count");

    ... etc ....
}

Кроме того, существуют некоторые способы имитации кодовых контрактов, если ваше возражение заключается в том, что .Net 4.0 еще не является прайм-тайм:

http://geekswithblogs.net/Podwysocki/archive/2008/01/22/118770.aspx

Ответ 5

Один из подходов к сокращению (не полностью удалению) числа защитных предложений - это понять причину их существования. Довольно часто оказывается, что мы защищаем от значений, которые действительны для типа аргумента, но не действительны для метода, который их принимает. Другими словами, метод определен в подмножестве домена, определяемом типом аргумента.

Решение этой категории случаев - попытаться определить подтип (например, более ограничительный интерфейс) и принять этот тип в качестве аргумента. Вы можете найти иллюстративный пример в этой статье: Почему нам нужны оговорки о безопасности?

Конечно, этот метод не применяется ко всем случаям. Все ссылочные типы, по крайней мере, допускают нулевые ссылки. Следовательно, большинство наших методов будут определены на части домена, что, в свою очередь, требует предложения guard против null.

Но с положительной стороны, этот метод помогает повысить осведомленность о методах, которые получают более общие, чем хотелось бы аргументы. Сантехника это отверстие помогает улучшить дизайн в целом.