Extract Method

Một chương trình được hình thành bởi rất nhiều các phương thức (method) và đối tượng đầu tiên chúng ta cần tập trung là các phương thức chứa nhiều lệnh. Refactoring các phương thức chứa nhiều lệnh nghĩa là cân nhắc xem  khối lệnh bên trong chúng có thể được phân rã thành những phương thức khác giúp cho các phương thức này (phương thức chứa nhiều lệnh) trở nên gọn gàng, dễ dàng quản lý hơn hay không. Kỹ thuật Refactoring này được gọi là Extract Method và bản chất của kỹ thuật này là:

Refactoring changes the programs in small steps. If you make a mistake, it is easy to find the bug.

Một ví dụ trong C#:


private string ten;

private int tuoi;

public  void Hien_thi_thong_tin()

{

  Console.Write("Vui long nhap ten: ");

  ten = Console.ReadLine();

  Console.Write("Vui long nhap tuoi: ");

  tuoi = int.Parse(Console.ReadLine());

  Console.Write("My name is {0} and my age is {1}", ten, tuoi);

}

Rõ ràng rằng, 4 lệnh đầu tiên trong phương thức Hien_thi_thong_tin có thể được chuyển đến một phương thức khác gọi là Nhap_thong_tin:


private string ten;

private int tuoi;

public  void Hien_thi_thong_tin()

{

  Nhap_thong_tin();

  Console.Write("My name is {0} and my age is {1}", ten, tuoi);

}

private void Nhap_thong_tin()

{

  Console.Write("Vui long nhap ten: ");

  ten = Console.ReadLine();

  Console.Write("Vui long nhap tuoi: ");

  tuoi = int.Parse(Console.ReadLine());

}

Trong Visual Studio 2017 chúng ta có thể thực hiện Extract Method bằng cách bôi đen 4 dòng lệnh trong phương thức Hien_thi_thong_tin và chọn Edit > Refactor > Extract Method

Một phương thức tên NewMethod được tạo:

Gõ tên mới cho phương thức NewMethodNhap_thong_tin:

Nhấn nút Apply từ hộp thoại và kết quả:

Trong môi trường Eclipse (tôi đang dùng Eclipse Oxygen 2 phiên bản 2017)

Chúng ta có thể dùng Extract Method bằng cách bôi đen các lệnh và chọn Refactor > Extract Method

Inline Method

Đối với các phương thức có số lượng các lệnh là lớn, việc cân nhắc sử dụng Extract Method để làm gọn các phương thức này là cần thiết. Tuy nhiên, trong một số trường hợp, chúng ta cần gộp một vài phương thức thành một ít các phương thức để thuận tiện cho việc quản lý. Kỹ thuật Refactoring này gọi là Inline Method.

Ngược với Extract Method, Inline Method là kỹ thuật xoá một phương thức và sao chép phần thân của nó đến phương thức gọi. Cân nhắc một ví dụ bằng ngôn ngữ Java như sau:


public String Ketqua() {

  return Diem_TB() >= 5.0f ? "Dau" : "Rot";

}

private float Diem_TB() {

  return (diem_toan + diem_van)/2;

}

Phương thức Diem_TB() có thể không cần thiết trong trường hợp này. Xóa phương thức Diem_TB() và phương thức Ketqua() được viết lại như sau:


public String Ketqua() {

  return (diem_toan + diem_van)/2 >= 5.0f ? "Dau":"Rot";

}

Trong Eclipse có hỗ trợ kỹ thuật Inline Method bằng cách bôi đen toàn bộ phương thức Diem_TB và chọn Refactor > Inline:

Xuất hiện hộp thoại Inline Method, nhấn OK:

Kết quả sẽ không còn phương thức Diem_TB.

Visual Studio 2017 không hỗ trợ kỹ thuật Inline Method.

Kết luận

Phân rã hay sáp nhập các phương thức đóng vai trò quan trọng như nhau trong việc xây dựng chương trình. Cả hai đều nhằm mục đích giúp chương trình trở nên gọn gàng, dễ quản lý và bảo trì hơn. Chúng ta cần cân nhắc thận trọng trong việc sử dụng Extract Method hay Inline Method khi Refactoring.

Xem thêm Phần 1Phần 2.