Существует ли название этого запаха антишаблона/кода?

19
задан Bhargav Rao 30 April 2019 в 04:08
поделиться

13 ответов

Я согласился бы, что это не конкретно антишаблон. Это мог бы быть запах в зависимости от использования. Существуют причины, почему нельзя было бы на самом деле хотеть использовать исключения (например, ошибки, будучи возвращенным не являются 'исключительными' для начинающих).

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

Этот код не может обязательно быть ошибкой также: рассмотрите ответ HTTP, который состоит из большого количества различных данных, включая код состояния, наряду с органом по ответу.

17
ответ дан 30 November 2019 в 02:12
поделиться
11
ответ дан 30 November 2019 в 02:12
поделиться

Ну, это не антишаблон. Библиотека стандарта C++ использует эту функцию, и.NET даже предлагает специальное предложение FunctionResult класс в платформе.NET. Это звонило Nullable. Да, это не ограничивается функциональными результатами, но это может использоваться для таких случаев и на самом деле очень полезно здесь. Если бы.NET 1.0 уже имела Nullable класс, то она, конечно, использовалась бы для эти NumberType.TryParse методы, вместо out параметр.

10
ответ дан 30 November 2019 в 02:12
поделиться

Я обычно передаю полезную нагрузку как (не константа) ссылка и код ошибки как возвращаемое значение.

я - разработчик игр, мы высылаем исключения

6
ответ дан 30 November 2019 в 02:12
поделиться

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

4
ответ дан 30 November 2019 в 02:12
поделиться

Konrad прав, C# использует двойные возвращаемые значения все время. Но мне отчасти нравится TryParse, Словарь. TryGetValue, и т.д. методы в C#.

int value;
if (int.TryParse("123", out value)) {
    // use value
}

вместо

int? value = int.TryParse("123");
if (value != null) {
    // use value
}

... главным образом, потому что шаблон Nullable не масштабируется для неоценивания типов возврата (т.е. экземпляры класса). Это не работало бы со Словарем. TryGetValue (). И TryGetValue оба более хорош, чем KeyNotFoundException (никакие "первые случайные исключения" постоянно в отладчике, возможно более эффективен), более хорош, чем практика Java получает () возвращающий пустой указатель (что, если нулевые значения ожидаются), и более эффективный, чем необходимость назвать ContainsKey () сначала.

, Но это все еще немного странно - так как это похоже на C#, затем он должен использовать параметр. Все увеличение эффективности, вероятно, потеряно путем инстанцирования класса.

(Мог быть Java за исключением "строкового" типа, находящегося в нижнем регистре. В Java, конечно, необходимо использовать класс для эмуляции двойных возвращаемых значений.)

5
ответ дан 30 November 2019 в 02:12
поделиться

Я соглашаюсь с теми, которые говорят, что это не антишаблон. Это - совершенно допустимый шаблон в определенных контекстах. Исключения для исключительные ситуации, возвращаемые значения (как в Вашем примере) должны использоваться в ожидаемых ситуациях. Некоторые домены ожидают допустимые и недопустимые результаты классов, и ни один из тех не должен быть смоделирован как исключения.

, Например, учитывая X количеств газа, автомобиль может добраться от до B, и раз так сколько газа перенесено? Такой вопрос идеален для структуры данных, которую Вы обеспечили. Быть неспособностью для совершения поездки от до B ожидается, следовательно исключение не должно использоваться.

3
ответ дан 30 November 2019 в 02:12
поделиться

Этот подход на самом деле намного лучше, чем некоторые другие, которых я видел. Некоторые функции в C, например, когда они встречаются с ошибкой, они возвращают и, кажется, успешно выполняются. Единственный способ сказать, что они перестали работать, состоит в том, чтобы вызвать функцию, которая получит последнюю ошибку.

я провел часы, пытаясь отладить семафорный код моего MacBook, прежде чем я наконец узнал, что sem_init не работает над OSX! Это скомпилировало без ошибки и работало, не вызывая ошибок - все же, семафор не работал, и я не мог выяснить почему. Я жалею людей, которые портируют приложение, которое использует семафоры POSIX к OSX и должно заниматься проблемами конкуренции ресурса, которые были уже отлажены.

2
ответ дан 30 November 2019 в 02:12
поделиться

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

1
ответ дан 30 November 2019 в 02:12
поделиться

Если Вы ожидаете, что Ваш метод иногда перестанет работать, но не считаете это исключительным, я предпочитаю этот шаблон, как используется в Платформе.NET:

bool TryMyFunction(out FunctionResult result){    

     //...    
     result = new FunctionResult();
}
1
ответ дан 30 November 2019 в 02:12
поделиться

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

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

1
ответ дан 30 November 2019 в 02:12
поделиться

Дебаты о запахах и антишаблонах напоминают мне сериалы "Оставшегося в живых", где у Вас есть различные конструкции программирования, пытающиеся проголосовать друг за друга от острова. Я предпочел бы видеть, что "конструкция X имеет such-so за и против", а не постоянно развивающийся список указов того, что должно и не должно быть сделано.

1
ответ дан 30 November 2019 в 02:12
поделиться

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

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

, Если необходимо использовать коды возврата, это прекрасно. Но затем используйте коды возврата. Не пытайтесь упаковать дополнительную полезную нагрузку в ним. Это - то, для чего касательно и параметры (C#). Типы Nullable могли бы быть исключением, но только потому, что существует дополнительный сахар, испеченный на языке для поддержки его.

, Если Вы все еще не соглашаетесь с этой оценкой, DOWNVOTE этот ответ (не целый вопрос). Если Вы действительно думаете, что это - антишаблон, то UPVOTE это. Мы будем использовать этот ответ для наблюдения то, что думает сообщество.

0
ответ дан 30 November 2019 в 02:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: