23 нояб. 2011 г.

Рефакторинг кода и Warning: The method can be declared as static

Есть у компилятора Java интересное предупреждение "The method foo() from the type Bar can be declared as static" - в среде разработки Eclipse включается в настройках ошибок/предупреждений компилятора Java (Window - Preferences - Java - Compiler - Errors/Warnings). Иногда оно помогает в анализе и улучшении качества кода, особенно это касается JUnit-тестов.

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


Приведу наиболее часто встречающиеся мне причины появления такого предупреждения и направления рефакторинга кода:
  1. В метод передаётся как аргумент экземпляр этого же класса - это fail, вместо аргумента надо использовать this.
  2. Метод производит какие-то действия над своим аргументом - он может быть вынесен в класс этого аргумента или в утилитный класс (если класс объекта изменять нельзя). Возможно обнаружение похожих методов в других местах проекта.
  3. Метод создаёт и возвращает экземпляр объекта, возможно, заполняя его начальными данными из своих аргументов - это creation-метод, он может быть перенесён в класс создаваемого объекта. Возможно обнаружение похожих creation-методов в других местах проекта.
  4. Метод находится в JUnit-тесте и производит проверки утверждений относительно тестируемого объекта - он может быть переименован в public static void assertXXX(...). Возможно обнаружение аналогичных проверок в нескольких классах JUnit-тестов - тогда можно выделить их в общий класс-предок, от которого наследовать тесты.
  5. Метод находится в JUnit-тесте и создаёт объекты для последующего тестирования - объекты становятся полями класса, код их создания выделяется в creation-методы (см. пункт 2) и методы @Before / @BeforeClass (выделяется фикстура теста). Данный вариант надо внимательно реализовывать при многопоточном запуске теста, если каждому потоку нужен свой экземпляр фикстуры.

Комментариев нет:

Отправить комментарий