Это обычный способ обработки вызова процедуры, который может возвращать как неудачу, так и успех и значение. Как отмечается в комментариях, это довольно часто при вызове API. Альтернативы включают в себя: a) объединение возвращаемого значения с успехом/сбоем, поэтому его необходимо знать и проверять внешне в вызывающем коде; b) использовать параметр out для возврата желаемого значения при успешном выполнении или c) бросать исключения, указывающие на сбой , что дорого и глупо, поэтому я не буду обсуждать дальше.
а) Сочетание возвращаемого значения с/Failure успеха
Это требует код вызова, чтобы узнать, что представляет собой отказ в возвращаемом значении вместо того, чтобы явно сказали, что это не удалось.
public string GetSomeString(int id)
{
//return a value on success or null on failure
}
Так что вызывающий код должен знать, что нулевая или пустая строка сбой и проверьте соответственно ...
var result = obj.GetSomeString(2);
if(string.IsNullOrEmpty(result))
{
//ooops, failed
}
И это, конечно, не вариант, если нуль является законное возвращаемое значение.
Аналогично для ИНТ вызова ...
public int GetSomeInt(string someArg, bool someOtherArg)
{
//return a value or a -1 for failure
}
Так что вызывающий код должен снова знать, что плохо, и предположим, все остальное это нормально ...
var result = obj.GetSomeInt("blah", true);
if(result == -1)
{
//ooops, failed
}
И снова, Безразлично работайте, если ваше значение «ошибка» является законным в некоторых случаях (или хуже становится законным в более позднее время).
б) Использование выходной параметр, чтобы передать обратно значение на успех
Другим вариантом является возвращение успех или неудачу из метода и использовать выходной параметр, чтобы возвращать значение в случае успеха.
public bool GetSomeString(int id, out string someString)
{
//if fail return false
//otherwise set someString = value and return true
}
Так что вызывающий код выглядит следующим образом ...
string goodString = null;
if(!obj.GetSomeString(2, out goodString))
{
//ooops, something bad happened
}
Это дает преимущество разделения успех/провал вызова от значения, которое он возвращается. Он работает, но это синтаксис klutzy, и если вам нужно вернуть больше, чем значение, вы в конечном итоге добавите больше параметров или создадите объект для возврата в любом случае. Он также не может сказать вам, почему это не удалось. Что возвращает нас к вам к теме вашего вопроса ...
Использование объекта Результат
Это дает вам преимущество б) в том, что успех/неудача однозначно очевидна и не требует вызывающий код, чтобы иметь какое-либо представление о том, какое возвращаемое значение может означать отказ. Он чувствует себя чище, потому что не требует использования синтаксиса. Это также дает дополнительное преимущество, позволяющее указать причину сбоя, передав его обратно в свойстве сообщения объекта результата.
это называется шаблонами 'beppe9000' ... о, это вы! : p Серьезно, хотя название гласит что-то о «классе статуса», и я не думаю, что вы использовали слово status в самом вопросе, что немного запутывает - и почему вы теперь говорите, что это анти-шаблон - выглядит как дизайн API –
фиксированный заголовок. Я не знаю, является ли это анти-шаблоном – beppe9000
Не совсем шаблон, простое представление вашего ответа на ваш вопрос в форме массива/объекта, поскольку большинство разработчиков не имеют понятия о том, как использовать коды statuse http –