Что корректный путь состоит в том, чтобы проверить аргументы конструктора

Я сделал это в Python 3.4:

'''To write to screen in real-time'''
message = lambda x: print(x, flush=True, end="")
message('I am flushing out now...')
5
задан Eric Anastas 21 July 2009 в 03:20
поделиться

5 ответов

  1. Создать ArgumentNullException
  2. Документ, который генерирует ctor ArgumentNullException , если имя равно null
  3. Если вы используя Контракты кода , добавьте строку Contract.EndContractBlock () после проверки параметров.

Изменить: Вместо этого:

if (name == null || name == "")

Используйте это:

if (string.IsNullOrEmpty(name))
7
ответ дан 18 December 2019 в 14:49
поделиться

Предпочтительным решением здесь является создание исключения. Неудачи рано, неудачи часто. Задокументируйте, какие параметры являются допустимыми для вашего конструктора и что он вызывает исключение ArgumentNullException или ArgumentOutOfRangeException при недопустимых параметрах.

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

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

"

3
ответ дан 18 December 2019 в 14:49
поделиться

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

1
ответ дан 18 December 2019 в 14:49
поделиться

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

Если не передача имени является допустимым способом создания объекта, предложите конструктор без параметров.

1
ответ дан 18 December 2019 в 14:49
поделиться

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

Класс доступен здесь используя Систему; используя System.Globalization;

    namespace Microsoft.Practices.Mobile.CompositeUI.Utility
    {
        /// <summary>
        /// Common guard clauses.
        /// </summary>
        public static class Guard
        {


    /// <summary>
        /// Checks a string argument to ensure it isn't null or empty.
        /// </summary>
        /// <param name="argumentValue">The argument value to check.</param>
        /// <param name="argumentName">The name of the argument.</param>
        public static void ArgumentNotNullOrEmptyString(string argumentValue, string argumentName)
        {
            ArgumentNotNull(argumentValue, argumentName);

            if (argumentValue.Trim().Length == 0)
                throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Properties.Resources.StringCannotBeEmpty, argumentName));
        }

        /// <summary>
        /// Checks an argument to ensure it isn't null.
        /// </summary>
        /// <param name="argumentValue">The argument value to check.</param>
        /// <param name="argumentName">The name of the argument.</param>
        public static void ArgumentNotNull(object argumentValue, string argumentName)
        {
            if (argumentValue == null)
                throw new ArgumentNullException(argumentName);
        }

        /// <summary>
        /// Checks an Enum argument to ensure that its value is defined by the specified Enum type.
        /// </summary>
        /// <param name="enumType">The Enum type the value should correspond to.</param>
        /// <param name="value">The value to check for.</param>
        /// <param name="argumentName">The name of the argument holding the value.</param>
        public static void EnumValueIsDefined(Type enumType, object value, string argumentName)
        {
            if (Enum.IsDefined(enumType, value) == false)
                throw new ArgumentException(String.Format(CultureInfo.CurrentCulture,
                    Properties.Resources.InvalidEnumValue,
                    argumentName, enumType.ToString()));
        }

        /// <summary>
        /// Verifies that an argument type is assignable from the provided type (meaning
        /// interfaces are implemented, or classes exist in the base class hierarchy).
        /// </summary>
        /// <param name="assignee">The argument type.</param>
        /// <param name="providedType">The type it must be assignable from.</param>
        /// <param name="argumentName">The argument name.</param>
        public static void TypeIsAssignableFromType(Type assignee, Type providedType, string argumentName)
        {
            if (!providedType.IsAssignableFrom(assignee))
                throw new ArgumentException(string.Format(CultureInfo.CurrentCulture,
                    Properties.Resources.TypeNotCompatible, assignee, providedType), argumentName);
        }
    }
}
1
ответ дан 18 December 2019 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: