Autumn SALE

Видалення присвоювань параметрам

Також відомий як: Remove Assignments to Parameters

Проблема

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

Рішення

Замість параметра скористайтеся новою локальною змінною.

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

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

Причини проведення цього рефакторингу такі ж, як і при розщеплюванні змінної, але в даному випадку йдеться про параметр, а не про локальну змінну.

По-перше, якщо параметр передається за посиланням, то після зміни його значення всередині методу, воно передається аргументу, який подавався на виклик цього методу. Дуже часто це відбувається випадково і призводить до сумних наслідків. Навіть якщо у вашій мові програмування параметри зазвичай передаються за значенням, а не за посиланням, сам код може викликати складнощі в тих, хто звик вважати інакше.

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

Переваги

  • Кожен елемент програми повинен відповідати тільки за одну річ. Це значно спрощує підтримку коду в майбутньому, оскільки ви можете спокійно замінити цей елемент, не побоюючись побічних ефектів.

  • Цей рефакторинг допомагає в подальшому виділити ділянки коду, що повторюються, в окремі методи.

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

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

  2. В усьому коді методу після цього рядка замініть використання параметра вашою локальною змінною.