2017-01-21 11 views
-1

Имеет ли следующий шаблон (анти?) Имя?Как вы называете этот шаблон (анти?), Где каждая операция возвращает экземпляр класса результатов?

  • каждая функция возвращает экземпляр result класса (или структуры, или ассоциативный массив), который имеет по крайней мере, эти два общих переменных:
    • success: истина/ложь значение, чтобы держать, если действие завершено успешно
    • result: переменная, которая содержит результат функции или ничего, если функция недействительна.
  • если success является falseerror переменных может содержать информацию (исключение/трассировки стека/отладку) об ошибке
  • message переменные держит дружественное к пользователю сообщение может быть определены, если error не пусто
  • только результат операции инкапсулирован. Входы передаются в обычном режиме.

Я видел, что это использовалось как в .Net, так и в PHP (на сервере и в скрипте, вызванном запросами JavaScript/Ajax). Это лучшая практика? Это анти-шаблон?

+1

это называется шаблонами 'beppe9000' ... о, это вы! : p Серьезно, хотя название гласит что-то о «классе статуса», и я не думаю, что вы использовали слово status в самом вопросе, что немного запутывает - и почему вы теперь говорите, что это анти-шаблон - выглядит как дизайн API –

+0

фиксированный заголовок. Я не знаю, является ли это анти-шаблоном – beppe9000

+1

Не совсем шаблон, простое представление вашего ответа на ваш вопрос в форме массива/объекта, поскольку большинство разработчиков не имеют понятия о том, как использовать коды statuse http –

ответ

1

Это обычный способ обработки вызова процедуры, который может возвращать как неудачу, так и успех и значение. Как отмечается в комментариях, это довольно часто при вызове 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, и если вам нужно вернуть больше, чем значение, вы в конечном итоге добавите больше параметров или создадите объект для возврата в любом случае. Он также не может сказать вам, почему это не удалось. Что возвращает нас к вам к теме вашего вопроса ...

Использование объекта Результат

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

+0

Обычно ли люди называют это «использованием объекта результата»? – beppe9000

+0

Я думаю, что он ясно передает свою функцию. – dbugger

+0

Ну, я думаю, что это все. – beppe9000