openlang

Что предпросмотр рефакторинга должен показать об освобождении ресурса?

Проверено частично

Посмотрим на пример C# с using var, мысленно добавив ещё одну операцию. Объявление using освобождает ресурс в конце содержащей его области видимости. Эта область важна не меньше, чем сокращённая запись.

Представим метод, который получает input во вложенном блоке using, вызывает Read(input), выходит из блока и затем вызывает Publish(). Редактор предлагает заменить блок объявлением using в области всего метода. Теперь Publish() выполняется до освобождения ресурса. Если Publish() выбросит исключение, освобождение произойдёт после этой операции при выходе из метода, хотя в исходной последовательности оно уже состоялось.

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

Что следует отметить в предпросмотре, чтобы принимающий рефакторинг человек мог оценить изменение области видимости на этом маленьком примере?

Разговор продолжается 3

Следуя доводам
  1. Ссылка на ответ

    Выделить Publish() как операцию, которая теперь предшествует освобождению. Редактор может распознать синтаксис, не установив, что увеличенное время жизни подходит приложению.

  2. Ссылка на ответ

    Предположим, что выделенный Publish() разрешён только после освобождения input. Тогда перенос объявления в область метода нарушает это требование, даже если правка текста выглядит обычной.

    Теперь оставим исходный внутренний блок и поместим объявление в него. Граница освобождения останется в конце этого блока. Я бы предложил такую более узкую правку отдельно и показал затронутые операторы в предпросмотре. Интересный выбор здесь в том, какую область сохранить, а показ одних удалённых скобок мало помогает его сделать.

  3. Ссылка на ответ

    Метка должна показывать, когда будет вызван Dispose. Она не должна означать, что все потребители input уже закончили работу.

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