Move Method

Giả sử chúng ta có lớp Phanso chứa các thành phần của một phân số như sau (C#):


class Phanso {

   //fields

   private int tuso;

   private int mauso;

   //constructor

   public Phanso(int tu, int mau) {

       this.tuso = tu;

       this.mauso = mau;

   }

   //accessors

   public int TuSo {

       get { return tuso; }

   }

   public int MauSo {

      get { return mauso; }

   }

}

Để hiển thị một phân số, chúng ta có thể viết mã như sau trong phương thức Main:


static void Main(string[] args)

{

   Phanso ps = new Phanso(3,2);

   string phan_so = ps.TuSo + "/" + ps.MauSo;

   Console.Write(phan_so);

   Console.ReadKey();

}

Ở đây, chúng ta có thể dùng kỹ thuật Extract Method (xem Phần 3) để di chuyển biểu thức được gán đến biến phan_so đến một phương thức mới gọi là Hien_thi:


static void Main(string[] args)

{

   Phanso ps = new Phanso(3,2);

   string phan_so = Hien_thi(ps);

   Console.Write(phan_so);

   Console.ReadKey();

}

static string Hien_thi(Phanso ps) {

   return ps.TuSo + "/" + ps.MauSo;

}

Chương trình lúc này vẫn chạy ổn nhưng không đúng chuẩn hướng đối tượng. Một giải pháp phù hợp với chuẩn hướng đối tượng là biến phương thức Hien_thi trở thành một thành viên của lớp Phanso. Muốn vậy, chúng ta sẽ di chuyển phương thức Hien_thi ở trên (lúc này cùng lớp chứa phương thức Main) đến lớp Phanso. Kỹ thuật này trong Refactoring gọi là Move Method (hay Move Function). Lớp Phanso có thể thay đổi như sau:


class Phanso {

   //fields

   private int tuso;

   private int mauso;

   //constructor

   public Phanso(int tu, int mau) {

       this.tuso = tu;

       this.mauso = mau;

   }

   // Hien_thi method

   public string Hien_thi() {

      return this.tuso + "/" + this.mauso;

    }

}

Chú ý rằng các accessors như TuSo hay MauSo đã bị xóa vì chúng không cần thiết trong ngữ cảnh của chúng ta. Phương thức Main cũng có sự thay đổi tương ứng:


static void Main(string[] args)

{

  Phanso ps = new Phanso(3,2);

  string phan_so = ps.Hien_thi();

  Console.Write(phan_so);

  Console.ReadKey();

}

Replace Temp with Query

Đến lúc này là OK, tuy nhiên, biến cục bộ phan_so có thể là thừa và chúng ta có thể xóa nó và sử dụng trực tiếp phương thức Hien_thi. Phương thức Main trở thành:


static void Main(string[] args)

{

   Phanso ps = new Phanso(3,2);

   Console.Write(ps.Hien_thi());

   Console.ReadKey();

}

Kỹ thuật thay thế một biến cục bộ như trên được gọi là Replace Temp with Query.

Visual Studio và Eclipse

Visual Studio 2017 (Community) và Eclipse không hỗ trợ Move Method (Move Function) và Replace Temp with Query.Trong Eclipse có chức năng Move trong mục Refactor nhưng chức năng này dùng để di chuyển một lớp (class) từ một gói (package) sang gói khác.