Видалення присвоювань параметрам
Проблема
Параметру методу присвоюється якесь значення.
Рішення
Замість параметра скористайтеся новою локальною змінною.
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; } // ... } Причини рефакторингу
Причини проведення цього рефакторингу такі ж, як і при розщеплюванні змінної, але в даному випадку йдеться про параметр, а не про локальну змінну.
По-перше, якщо параметр передається за посиланням, то після зміни його значення всередині методу, воно передається аргументу, який подавався на виклик цього методу. Дуже часто це відбувається випадково і призводить до сумних наслідків. Навіть якщо у вашій мові програмування параметри зазвичай передаються за значенням, а не за посиланням, сам код може викликати складнощі в тих, хто звик вважати інакше.
По-друге, багаторазові присвоєння різних значень параметру призводять до того, що вам стає складно зрозуміти, які саме дані повинні знаходитися в параметрі в певний момент часу. Проблема посилюється, якщо ваш параметр і те, що він повинен зберігати, описані в документації, але фактично його значення може не співпадати з очікуваним усередині методу.
Переваги
-
Кожен елемент програми повинен відповідати тільки за одну річ. Це значно спрощує підтримку коду в майбутньому, оскільки ви можете спокійно замінити цей елемент, не побоюючись побічних ефектів.
-
Цей рефакторинг допомагає в подальшому виділити ділянки коду, що повторюються, в окремі методи.
Порядок рефакторингу
-
Створіть локальну змінну і присвойте їй початкове значення вашого параметру.
-
В усьому коді методу після цього рядка замініть використання параметра вашою локальною змінною.