Недоступный код: ошибка или предупреждение? - PullRequest
21 голосов
/ 17 февраля 2010

Это вопрос дизайна языка:

Как вы думаете, недоступный код (на языках программирования в целом) должен вызывать предупреждение (т.е. "сообщить о проблеме и все равно скомпилировать") или ошибка («Отказаться от компиляции»)?

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

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

Вот несколько примеров фрагментов кода, в которых некоторые операторы явно недоступны:

return;
foo();

-

throw new Exception();
foo();

-

if (...) {
  return;
} else {
  throw new Exception();
}
foo();

Ответы [ 12 ]

28 голосов
/ 17 февраля 2010

Ошибка означает, что компилятор физически не может обработать ваш код.

Предупреждение означает, что компилятор способен работать с вашим кодом, но считает, что написанное вами в некотором роде неверно.

Мне кажется, это довольно ясно - это должно быть предупреждение.

Кроме того, как насчет случая, когда я решил сократить метод для целей отладки:

public bool ShowMenu()
{
    return true;
    /* The standard implementation goes here */
}

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

25 голосов
/ 17 февраля 2010

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

12 голосов
/ 17 февраля 2010

Вообще говоря, это должна быть ошибка.

Однако мне приходит в голову одно исключение:

if (false) {
  doStuffThatITemporarilyDisabled();
}

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

8 голосов
/ 17 февраля 2010

Я думаю, это должно быть предупреждение.

Вообще говоря, общее правило таково: 'вы должны воспринимать предупреждения как ошибки' . Если я непреднамеренно напишу недоступный код, я увижу его в предупреждениях и все равно исправлю.

Однако иногда, как говорит Нил, вы намеренно создаете мертвый код для отладки или по любой другой причине. Я бы очень, очень ненавидел бы это, если бы компилятор не позволил мне сделать это.

8 голосов
/ 17 февраля 2010

Я думаю, что предупреждение уместно. Затем пользователь может решить использовать свой ДРУГОЙ переключатель, который говорит «обрабатывать все предупреждения как ошибки», когда он выполняет сборку Release. Расширение прав и возможностей разработчика всегда лучше, чем навязывание ему вашего случайного выбора.

4 голосов
/ 17 февраля 2010

Если вы указали язык:

  • Считает мертвый код ошибкой
  • Не поддерживает предварительную обработку на уровне текста в стиле C
  • Отсутствует комментарий в стиле блока, который может быть вложен в комментарии в стиле линии

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

3 голосов
/ 17 февраля 2010

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

2 голосов
/ 15 марта 2014

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

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

В случае кода отладки / тестирования баланс предпочитает быть предупреждением. Чрезвычайно удобно иметь возможность отключать части кода для отладки или тестирования.

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

2 голосов
/ 10 февраля 2013

Мне до сих пор не ясно, почему Java реализует мертвый код как ошибку. Я использую C и Objective-C, которые имеют препроцессоры, поэтому я могу легко использовать директивы препроцессора для включения (или маскировки) функции / метода, например:

// C code
#define ENABLE_FOO //Comment off this to turn off foo(void);
int foo(void)
{
#ifdef ENABLE_FOO
    // Do actual stuff.
    int returnVaue = 2;
    // ...
    return returnValue;
#else
    return 0; // Turned off
#endif
}
// Compiling using clang, enforcing dead code detection:
// clang main.c -Wall -Werror

или, как в Objective-C, с доступным отражением:

// Class
#define MYCLASS_ENABLE_FOO // Comment off to enable -[MyClass foo]
@interface MyClass : NSObject
#ifdef MYCLASS_ENABLE_FOO
- (int)foo;
#endif
@end
// The like is done in implementation.
// Invoking:
int main(int argc, char **argv)
{
    MyClass *object = [[MyClass alloc] init];
    int value = ([object respondsToSelector:@selector(foo)]) ? // Introspection.
                [object foo] : 0;
    printf("Value: %d", value);
    return 0;
}
2 голосов
/ 17 февраля 2010

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

...