Также известен как Remove Assignments to Parameters

Рефакторинг Удаление присваиваний параметрам

Проблема

Параметру метода присваивается какое-то значение.

Решение

Вместо параметра воспользуйтесь новой локальной переменной.

До
int discount(int inputVal, int quantity) {
  if (inputVal > 50) {
    inputVal -= 2;
  }
  //...
}
После
int discount(int inputVal, int quantity) {
  int result = inputVal;
  if (inputVal > 50) {
    result -= 2;
  }
  //...
}
До
int Discount(int inputVal, int quantity) 
{
  if (inputVal > 50) 
  {
    inputVal -= 2;
  }
  //...
}
После
int Discount(int inputVal, int quantity) 
{
  int result = inputVal;
  
  if (inputVal > 50) 
  {
    result -= 2;
  }
  //...
}
До
function discount($inputVal, $quantity) {
  if ($inputVal > 50)
    $inputVal -= 2;
  ...
После
function discount($inputVal, $quantity) {
  $result = $inputVal;
  if ($inputVal > 50)
    $result -= 2;
  ...
До
def discount(inputVal, quantity):
    if inputVal > 50:
        inputVal -= 2
    #...
После
def discount(inputVal, quantity):
    result = inputVal
    if inputVal > 50:
        result -= 2
    #...

Причины рефакторинга

Причины проведения этого рефакторинга такие же, как и при расщеплении переменной, но в данном случае речь идёт о параметре, а не о локальной переменной.

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

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

Достоинства

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

  • Этот рефакторинг помогает в дальнейшем выделить повторяющиеся участки кода в отдельные методы.

Порядок рефакторинга

  1. Создайте локальную переменную и присвойте ей начальное значение вашего параметра.

  2. Во всем коде метода после этой строки замените использование параметра вашей локальной переменной.

Устали читать?

Сбегайте за подушкой, у нас тут контента на 7 часов чтения.

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

Узнать больше...