Також відомий як 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 годин читання.

Або спробуйте наш новий інтерактивний курс з рефакторингу. Він більш інформативний та набагато цікавіший за банальний тест.

Дізнатися більше...

Живий приклад

Перший раз у нас? Нічого страшного!

У нас тут все просто – цей інтерактивний приклад дуже схожий на відео (хоча й виглядає набагато крутіше).

  1. Натискаєте велику кнопку "Почати", а далі слідуєте усім підказкам.
  2. Ви можете перемотувати програвання, використовуючи стрілки зліва.
  3. Окрім того, ви можете подивитися різницю між стартовим та отриманим кодом, натиснувши кнопку ока ().
  4. Кнопка компіляції та тестування () дає змогу перевірити код на наявність помилок.