Какова наилучшая практика для возврата логического и строкового значения

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

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

Сначала я решил изменить тип возврата с bool на некоторый тип Generic Collection, имеющий ключ String и логическое значение. Я не знаю, подходит ли это лучший подход.

Какова наилучшая практика в этом случае?

Ответы

Ответ 1

Сделайте класс вроде

public class ValidationResponse
{
    public bool Successful { get; set; }
    public string Information { get; set; }
}

и вернуть объект ValidationResponse

Ответ 2

Один шаблон, который используется в методах TryParse типов данных .NET(например, Int32.TryParse) и очень распространен в мир C, должен возвращать логическое значение для обозначения успеха или неудачи. Пользователь также должен передать значение по ссылке на метод, чтобы получить обработанное значение обратно.

В ваших обстоятельствах ваша подпись метода может выглядеть так:

bool DoSomething (out string anInformativeMessage)

ОДНАКО Я лично считаю, что лучший подход - вернуть класс Result, который Дайнес описал в своем ответе, поскольку он более гибкий и OO в природе. Я добавляю этот подход для полноты;)

Ответ 3

  • Создайте свой собственный класс результатов, который возвращает ваш метод, и который содержит всю необходимую информацию. С этим вы можете более легко расширить его в будущем (как в ответе dhinesh.)

  • Другой вариант - использовать объект Tuple для хранения как string, так и bool: Tuple<string, bool> будет вашим типом возврата. (Доступно только в .NET 4.0)

Ответ 4

Создание класса Result в качестве нового типа возврата, как предлагается в других ответах, имеет проблему с разбиением существующего кода.

Если вам нужно/нужно избегать этого, вы можете ввести новое свойство string LastError, содержащее сообщения об ошибках последнего вызова вашего метода, и сохранить подпись метода неповрежденной. Вы бы использовали его как

bool success = myObject.MyMethod();
if(!success)
    Console.Error.WriteLine(myObject.LastError);

Этот подход не подходит для многопотоковых сред.

Ответ 5

Если ожидается, что Иерархия XML будет проверяться - Тогда я бы сказал, что это типичный пример того, где вы должны использовать исключение. Затем метод просто возвращает void и бросает на отказ, например:

void validateXMLHierarchy();

и использовать

try
{
  validateXMLHierarchy();
}
catch (XmlValidationException ex)
{
  Console.Error.WriteLine(ex.Message);
}

Ответ 6

Я не знаю о лучшей практике, но если у вас есть только два следующих случая:

  • Возвращает true, без дополнительной информации
  • Возвращает false, с дополнительной информацией

Затем вы можете упростить его, просто вернув строку. Если ошибки нет, вы возвращаете пустую строку, эквивалентную нулевому коду ошибки.

string errorMsg = myObject.MyMethod();
if (errorMsg != String.Empty) {
    Console.Error.WriteLine(errorMsg);
}