Общее программирование - вызов не пустого метода, но без использования значения - PullRequest
1 голос
/ 05 августа 2009

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

Ответы [ 6 ]

4 голосов
/ 05 августа 2009

Типичным примером этого является printf, который возвращает int ... но вы редко видите это:

int val = printf("Hello World");
3 голосов
/ 05 августа 2009

Да, просто вызовите метод, как если бы он был пустым. Вы, вероятно, делаете это все время, не замечая этого. Оператор присваивания '=' на самом деле возвращает значение, но оно используется очень редко.

2 голосов
/ 05 августа 2009

Это зависит от среды (язык, инструменты, стандарт кодирования, ...).

Например, в C вполне возможно вызвать функцию без использования ее значения. С некоторыми функциями, такими как printf, которая возвращает int, это делается постоянно.

Иногда не использование значения вызывает предупреждение, что нежелательно. Присвоение значения переменной и последующее ее использование просто вызовет другое предупреждение о неиспользованной переменной. Для этого случая решение состоит в том, чтобы преобразовать результат в void, добавив префикс вызова к (void), например,

(void) my_function_returning_a_value_i_want_to_ignore().
1 голос
/ 05 августа 2009

Здесь есть две отдельные проблемы:

  1. Если вы заботитесь о возвращаемом значении?
  2. Должны ли вы присвоить его переменной, которую вы не собираетесь использовать?

Ответом на # 2 является громкое «НЕТ» - если, конечно, вы не работаете с языком, где это было бы незаконно (на ум приходит ранний Турбо Паскаль). Абсолютно бессмысленно определять переменную только для того, чтобы ее выбросить.

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

0 голосов
/ 05 августа 2009

В Си это очень распространено, но есть места, где это нормально, и другие места, где это не так. Более поздние версии GCC имеют атрибут функции , так что вы можете получить предупреждение при использовании функции без проверки возвращаемого значения:

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

     int fn () __attribute__ ((warn_unused_result));
     int foo ()
     {
       if (fn () < 0) return -1;
       fn ();
       return 0;
     }

выводит предупреждение в строке 5.

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

0 голосов
/ 05 августа 2009

Если это распространено в .Net (например), возможно, есть проблема с взломом кода CQS .

Когда я вызываю функцию, которая возвращает значение, которое я игнорирую, обычно это происходит потому, что я делаю это в тесте для проверки поведения. Вот пример в C #:

    [Fact]
    public void StatService_should_call_StatValueRepository_for_GetPercentageValues()
    {
        var statValueRepository = new Mock<IStatValueRepository>();

        new StatService(null, statValueRepository.Object).GetValuesOf<PercentageStatValue>();

        statValueRepository.Verify(x => x.GetStatValues());
    }

Меня не волнует тип возвращаемого значения, я просто хочу убедиться, что метод был вызван для поддельного объекта.

...