Как сохранить предупреждение с TreatWarningsAsErrors включенным?

Вопрос или проблема

Наши проекты имеют <TreatWarningsAsErrors> включённым, и мы в целом можем справляться с ними, не подавляя. Однако недавно мы столкнулись с ситуацией, когда предупреждение нельзя исправить из-за обстоятельств, находящихся вне нашего контроля:

if (CheckForHigherVersion())
{
    // Исправления пока нет, ждем будущего обновления
    CallObsoleteFunction(); // Предупреждение здесь
}
else
{
    CallObsoleteFunction(); // Это нормально
}

Я знаю, что мы можем использовать WarningsNotAsErrors, NoWarn или #pragma warning disable. Проблема с ними в том, что мы действительно хотим вернуться к ним позже, чтобы исправить их, поэтому лучше, чтобы мы всё ещё видели предупреждение при компиляции на данный момент.

Использование чего-то вроде #warning fix this later тоже не работает, потому что это всё равно трактуется как ошибка.

На данный момент // TODO: fix this later кажется единственным, что работает для нас, но это не так уж “в лицо”, как предупреждение. Есть ли лучшее решение для этого сценария?

Ответ или решение

Ситуация, с которой вы столкнулись, когда использование <TreatWarningsAsErrors> вызывает затруднения из-за определённого предупреждения, которое вы не можете устранить, действительно может вызывать беспокойство. Ваша цель — сохранять предупреждения видимыми, чтобы у вас была возможность вернуться к ним позже. Давайте рассмотрим несколько возможных решений данной проблемы.

1. Использование #pragma warning disable с пометкой TODO

Хотя вы упомянули #pragma warning disable, это решением может стать временное отключение конкретного предупреждения, при этом с добавлением комментария, например:

#pragma warning disable CS0618 // Отключаем предупреждение об устаревшей функции
CallObsoleteFunction(); // TODO: исправить это позже
#pragma warning restore CS0618 // Восстанавливаем предупреждение

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

2. Использование кастомного класса для логирования

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

public static void CallSafeObsoleteFunction()
{
    CallObsoleteFunction();
    LogWarning("Используется устаревшая функция, исправить позже");
}

Здесь можно будет логировать предупреждения в файл или систему мониторинга, что позволяет отслеживать их без возникновения ошибок компиляции.

3. Применение комментариев TODO

Вы оказались правы в использовании комментариев // TODO: fix this later. Хотя эти комментарии могут показаться менее заметными, вы можете применять специальные инструменты для отслеживания таких комментариев. Многие IDE выделяют TODO комментарии и позволяют вам формировать списки задач, что даёт возможность эффективно управлять будущими изменениями.

4. Ведение списка предупреждений

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

5. Рассмотрите использование внешних инструментов

Если ваша команда активно использует системы CI/CD, возможно, стоит интегрировать инструмент статического анализа кода, который сможет отслеживать предупреждения и ошибки, а также выстраивать отчёты об их наличии в проекте.

Заключение

Хотя использование опции <TreatWarningsAsErrors> является хорошей практикой, порой возникают обстоятельства, когда нужны дополнительные подходы для управления предупреждениями. Необходимо учитывать, что, хотя выражение и фиксирование объектов кода является важным, ведение четкого учета нерешённых проблем также критично. Подходите к этой задаче комплексно и используйте инструменты, на которые можете полагаться для сохранения фиксации задач.

Оцените материал
Добавить комментарий

Капча загружается...