Di chuyển phương thức

Tóm tắt
Một phương thức được sử dụng bởi một lớp khác nhiều hơn là lớp mà nó được định nghĩa.

''Tạo một phương thức mới với thân tương tự trong lớp sử dụng nó nhiều nhất. Hoặc chuyển phương thức cũ thành những sự uỷ quyền hoặc xoá hẳn nó đi.''

Động cơ
Di chuyển phương thức là phần không thể tách rời của refactoring. Thường khi lớp có quá nhiều hành vi hay các lớp tương tác quá nhiều, chúng bị gắn với nhau (coupled). Bằng cách di chuyển vài phương thức, bạn có thể làm cho các lớp đơn giản hơn và hợp lý hơn.

Sau khi bạn di chuyển một trường nào đó, hãy nhìn qua các phương thức trong lớp để tìm ra những phương thức truy cập đối tượng khác nhiều hơn chính đối tượng mà nó được đặt. Khi bạn tìm thấy một phương thức cần di chuyển, bạn hãy nhìn vào các phương thức gọi nó, các phương thức nó gọi đến và các phương thức nạp chồng trong cây thừa kế. Đánh giá có nên tiếp tục dựa trên đối tượng mà phương thức có nhiều tương tác hơn.

Ví dụ
Một lớp biểu diễn tài khoản minh hoạ cho kỹ thuật này:

class Account...

double overdraftCharge {

if (_type.isPremium) {

double result = 10;

if (_daysOverdrawn > 7) result += (_daysOverdrawn - 7) * 0.85;

return result;

}

else return _daysOverdrawn * 1.75;

}

double bankCharge {

double result = 4.5;

if (_daysOverdrawn > 0) result += overdraftCharge;

return result;

}

private AccountType _type;

private int _daysOverdrawn;

Giả sử bạn có một vài loại tài khoản, mỗi loại có quy tắc riêng để tính tiền thấu chi (overdraft charge). Nên di chuyển hàm overdraftCharge đến các loại tài khoản đó.