Есть ли название для этого запаха / шаблона? - PullRequest
19 голосов
/ 16 сентября 2008

Позвольте мне начать с того, что я не защищаю этот подход, но недавно я его увидел, и мне было интересно, есть ли для него название, на которое я мог бы указать виновной стороне. Так что вот так.

Теперь у вас есть метод, и вы хотите вернуть значение. Вы также хотите вернуть код ошибки. Конечно, исключения являются гораздо лучшим выбором, но по какой-то причине вам нужен код ошибки. Помни, я играю адвоката дьявола здесь. Итак, вы создаете универсальный класс, например так:

class FunctionResult<T>
{
    public T payload;
    public int result;
}

А затем объявите ваши функции следующим образом:

FunctionResult<string> MyFunction()
{
    FunctionResult<string> result;
    //...

    return result;
}

Одним из вариантов этого шаблона является использование перечисления для кода ошибки вместо строки. Теперь вернемся к моему вопросу: есть ли название для этого, и если да, то каково это?

Ответы [ 13 ]

1 голос
/ 16 сентября 2008

Если вы не хотите использовать исключения, самый чистый способ сделать это - заставить функцию возвращать код ошибки / успеха и принимать либо ссылку, либо указатель, который заполняется результатом.

Я бы не назвал это анти-паттерном. Это очень хорошо зарекомендовавший себя работающий метод, который часто предпочтительнее использования исключений.

1 голос
/ 16 сентября 2008

Как насчет шаблона "Не могу решить, является ли это ошибкой или нет". Похоже, если у вас действительно есть исключение, но вы хотите вернуть частичный результат, вы бы обернули результат в исключение.

0 голосов
/ 16 сентября 2008

В защиту обозначения анти-паттерна этот код может использоваться несколькими способами:

  1. Объект x = MyFunction (). Полезная нагрузка; (игнорируя возвращаемый результат - очень плохо)
  2. int code = MyFunction (). Result; (выбрасывая полезную нагрузку - может быть в порядке, если это используется по назначению.)
  3. FunctionResult x = MyFunction (); // ... (куча дополнительных объектов FunctionResult и дополнительный код для их повсеместной проверки)

Если вам нужно использовать коды возврата, это нормально. Но тогда используйте коды возврата. Не пытайтесь собрать с ним дополнительную полезную нагрузку. Вот для чего нужны параметры ref и out (C #). Обнуляемые типы могут быть исключением, но только потому, что для поддержки этого языка на языке выпекается дополнительный сахар.

Если вы все еще не согласны с этой оценкой, СКАЧАТЬ этот ответ (не весь вопрос). Если вы думаете, что это анти-паттерн, тогда ПОДТВЕРДИТЕ это. Мы используем этот ответ, чтобы увидеть, что думает сообщество.

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