Заміна змінної викликом методу
Проблема
Ви розміщуєте результат якогось виразу в локальній змінній, щоб використати її далі в коді.
Рішення
Виділіть цей вираз в окремий метод і повертайте результат з нього. Замініть використання вашої змінної викликом методу. Новий метод може бути використаний і в інших методах.
double calculateTotal() {
double basePrice = quantity * itemPrice;
if (basePrice > 1000) {
return basePrice * 0.95;
}
else {
return basePrice * 0.98;
}
}
double calculateTotal() {
if (basePrice() > 1000) {
return basePrice() * 0.95;
}
else {
return basePrice() * 0.98;
}
}
double basePrice() {
return quantity * itemPrice;
}
double CalculateTotal()
{
double basePrice = quantity * itemPrice;
if (basePrice > 1000)
{
return basePrice * 0.95;
}
else
{
return basePrice * 0.98;
}
}
double CalculateTotal()
{
if (BasePrice() > 1000)
{
return BasePrice() * 0.95;
}
else
{
return BasePrice() * 0.98;
}
}
double BasePrice()
{
return quantity * itemPrice;
}
$basePrice = $this->quantity * $this->itemPrice;
if ($basePrice > 1000) {
return $basePrice * 0.95;
} else {
return $basePrice * 0.98;
}
if ($this->basePrice() > 1000) {
return $this->basePrice() * 0.95;
} else {
return $this->basePrice() * 0.98;
}
...
function basePrice() {
return $this->quantity * $this->itemPrice;
}
def calculateTotal():
basePrice = quantity * itemPrice
if basePrice > 1000:
return basePrice * 0.95
else:
return basePrice * 0.98
def calculateTotal():
if basePrice() > 1000:
return basePrice() * 0.95
else:
return basePrice() * 0.98
def basePrice():
return quantity * itemPrice
calculateTotal(): number {
let basePrice = quantity * itemPrice;
if (basePrice > 1000) {
return basePrice * 0.95;
}
else {
return basePrice * 0.98;
}
}
calculateTotal(): number {
if (basePrice() > 1000) {
return basePrice() * 0.95;
}
else {
return basePrice() * 0.98;
}
}
basePrice(): number {
return quantity * itemPrice;
}
Причини рефакторингу
Застосування цього рефакторингу може бути підготовчим етапом для застосування виділення методу для якоїсь частини дуже довгого методу.
Крім того, іноді можна знайти цей же вираз і в інших методах, що змушує замислитися над створенням спільного методу для його отримання.
Переваги
-
Покращує читабельність коду. Набагато простіше зрозуміти, що робить метод
getTax()
, ніж рядокorderPrice() * -2
. -
Допомагає прибрати дублювання коду, якщо замінюваний рядок використовується більш ніж в одному методі.
Корисні факти
Питання швидкодії
При використанні цього рефакторингу може виникнути питання, чи не позначиться результат рефакторингу погано на швидкодії програми. Чесна відповідь — так, результуючий код може отримати додаткове навантаження за рахунок виклику нового методу. Проте в наш час швидких процесорів і хороших компіляторів таке навантаження навряд чи буде помітне. Натомість ми отримуємо кращу читабельність коду і можливість використати новий метод в інших місцях програми.
Проте, якщо ваша тимчасова змінна служить для кешування результату дійсно важкого і великого виразу, має сенс зупинити цей рефакторинг після виділення виразу в новий метод.
Порядок рефакторингу
-
Переконайтеся, що змінній в межах методу присвоюється значення тільки один раз. Якщо це не так, використайте розділення змінної для того, щоб гарантувати, що змінна буде використана тільки для зберігання результату вашого виразу.
-
Використайте відокремлення методу для того, щоби перемістити вираз, що цікавить вас, в новий метод. Переконайтеся, що цей метод тільки повертає значення і не міняє стан об’єкта. Якщо він якось впливає на видимий стан об’єкта, використайте розділення запиту і модифікатора.
-
Замініть використання змінної викликом вашого нового методу.