Ответ 1
Сделайте класс вроде
public class ValidationResponse
{
public bool Successful { get; set; }
public string Information { get; set; }
}
и вернуть объект ValidationResponse
Я создал метод, который выполняет некоторые проверки против иерархии XML, которая динамически генерируется другим классом в тексте Javascript во время выполнения.
Мой метод в настоящее время возвращает True или False, что полезно для всех, кто использует мой класс, но я также хотел бы вернуть более информативную информацию, так как может быть несколько причин, которые могут вызвать ложное сообщение.
Сначала я решил изменить тип возврата с bool на некоторый тип Generic Collection, имеющий ключ String и логическое значение. Я не знаю, подходит ли это лучший подход.
Какова наилучшая практика в этом случае?
Сделайте класс вроде
public class ValidationResponse
{
public bool Successful { get; set; }
public string Information { get; set; }
}
и вернуть объект ValidationResponse
Один шаблон, который используется в методах TryParse
типов данных .NET(например, Int32.TryParse) и очень распространен в мир C, должен возвращать логическое значение для обозначения успеха или неудачи. Пользователь также должен передать значение по ссылке на метод, чтобы получить обработанное значение обратно.
В ваших обстоятельствах ваша подпись метода может выглядеть так:
bool DoSomething (out string anInformativeMessage)
ОДНАКО Я лично считаю, что лучший подход - вернуть класс Result
, который Дайнес описал в своем ответе, поскольку он более гибкий и OO в природе. Я добавляю этот подход для полноты;)
Создайте свой собственный класс результатов, который возвращает ваш метод, и который содержит всю необходимую информацию. С этим вы можете более легко расширить его в будущем (как в ответе dhinesh.)
Другой вариант - использовать объект Tuple
для хранения как string
, так и bool
: Tuple<string, bool>
будет вашим типом возврата. (Доступно только в .NET 4.0)
Создание класса Result в качестве нового типа возврата, как предлагается в других ответах, имеет проблему с разбиением существующего кода.
Если вам нужно/нужно избегать этого, вы можете ввести новое свойство string LastError
, содержащее сообщения об ошибках последнего вызова вашего метода, и сохранить подпись метода неповрежденной. Вы бы использовали его как
bool success = myObject.MyMethod();
if(!success)
Console.Error.WriteLine(myObject.LastError);
Этот подход не подходит для многопотоковых сред.
Если ожидается, что Иерархия XML будет проверяться - Тогда я бы сказал, что это типичный пример того, где вы должны использовать исключение. Затем метод просто возвращает void и бросает на отказ, например:
void validateXMLHierarchy();
и использовать
try
{
validateXMLHierarchy();
}
catch (XmlValidationException ex)
{
Console.Error.WriteLine(ex.Message);
}
Я не знаю о лучшей практике, но если у вас есть только два следующих случая:
Затем вы можете упростить его, просто вернув строку. Если ошибки нет, вы возвращаете пустую строку, эквивалентную нулевому коду ошибки.
string errorMsg = myObject.MyMethod();
if (errorMsg != String.Empty) {
Console.Error.WriteLine(errorMsg);
}