iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0
Software Development

程式淨化計畫:痛苦是重構的起源!系列 第 7

Replace Method with Method Object 的重構

  • 分享至 

  • xImage
  •  

Replace Method with Method Object

簡介

假如有個很長的函數, 有很多的區域變數且交織在一起, 難以用Extract Method.
這是一種Long Method smell.

重構前範例

假設有個員工類別, 要計算年終獎金, 開發Bonus()函數.
年終獎金依據多種條件, 比如職稱、年資、自我績效、團體績效...等

class Employee
{
    // ...
    public double Bonus()
    {
        double jobTitleBonus;
        double seniorityBonus;
        double selfPerformanceBonus;
        double supervisorPerformanceBonus;
        // Perform long computation.
    }
}

重構後範例

想像Bonus函數很長, 且計算年終邏輯交錯, 使維護成本高.
因此, 可建立一個BonusCalculator類別, 將那些區域變數變成BonusCalculator的field,
再分出其他的函數來計算結果.


class Employee
{
    // ...
    public double Bonus()
    {
        return new BonusCalculator(this).Compute();
    }
}

class BonusCalculator
{
    private double jobTitleBonus;
    private double seniorityBonus;
    private double selfPerformanceBonus;
    private double supervisorPerformanceBonus;
    // ... other fields from local variables
    public BonusCalculator(Employee employee)
    {
        // Copy relevant information from the employee object.
    }

    public double Compute()
    {
        // Perform long computation.
    }
}

重構的好處

經過這種重構, 讓EmployeeBonus()的計算委託給BonusCalculator,
避免Employee的功能(職責)越來越龐大.
二來可分開測試兩類別的邏輯. 只是對Employee來說, 會需要另外的Factory與BonusCalculator 介面做mock.

重構的壞處

因為多了新類別, 增加程式的複雜度.


上一篇
Breaking Yo-Yo Hierarchies 的重構
下一篇
Replace Constructor with Creation Method 的重構
系列文
程式淨化計畫:痛苦是重構的起源!31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言