"Xin chào lần nữa."

"CHÀO!"

"Hôm nay tôi sẽ nói với bạn về tái cấu trúc. Tái cấu trúc là thay đổi mã trong một dự án mà không thay đổi chức năng của nó."

"Nhưng sao điều đó có thể xảy ra?"

"Chà, trong những trường hợp đơn giản nhất, chúng ta có thể đổi tên biến và/hoặc phương thức. Xét cho cùng, việc đổi tên biến sẽ không làm cho chương trình hoạt động khác đi, phải không?"

"Dĩ nhiên là không."

"Bạn cũng có thể chia các phương thức lớn thành nhiều phương thức nhỏ hơn. "

"Bạn có thể kéo các đoạn mã lặp đi lặp lại vào một phương thức riêng. "

"Một số hàm có thể được khai báo tĩnh và sau đó được chuyển vào các lớp tiện ích."

"Nhưng đây là một cách giải thích hẹp về tái cấu trúc."

"Tái cấu trúc đôi khi có nghĩa là viết lại (cải tiến) kiến ​​trúc của dự án mà không cần thêm chức năng mới. Đây là tái cấu trúc theo nghĩa rộng của thuật ngữ."

"IntelliJ IDEA đã trở thành môi trường phát triển tích hợp (IDE) phổ biến nhất bởi vì đây là công cụ đầu tiên giới thiệu các công cụ tái cấu trúc rất mạnh."

"Những công cụ ma thuật này là gì?"

Thủ thuật số 1: Thay đổi tên phương thức.

"Hãy tưởng tượng rằng mã của bạn có một phương thức được gọi từ 100-500 vị trí khác nhau. Bạn đã quyết định đổi tên của nó thành một cái gì đó dễ hiểu hơn. Giả sử nó là run(), và bạn muốn nó được chạyDownloadTaskAsync(). Nhanh như thế nào bạn có thể làm điều đó?"

"Chà, trước tiên bạn cần thay đổi tên của phương thức, sau đó tìm tất cả các vị trí trong chương trình nơi phương thức đó được gọi và thay đổi tên ở đó."

"Và làm thế nào bạn sẽ tìm thấy những nơi đó?"

"Tôi chỉ cần chạy chương trình và IntelliJ IDEA sẽ chỉ cho tôi tất cả những nơi mà một phương thức không tồn tại được gọi."

"Được rồi. Nhưng bây giờ, giả sử rằng mọi phương thức đều có một nhận xét giải thích (JavaDoc) giải thích chức năng của phương thức đó — và tên phương thức cũ được viết ở đó."

"Tôi cũng sẽ thay đổi ý kiến."

"Nhưng cũng có thể có những biến có tên được liên kết với tên của phương thức. Sẽ rất tốt nếu bạn thay đổi chúng:"

Trước Sau đó
Task task = manager.run();
Task asyncTask = manager.runDownloadTaskAsync();

"Ừ, thay đổi tên của những biến đó cũng tốt. Sẽ không hại gì đâu."

"Chà, tất cả những điều này có thể được thực hiện chỉ trong vài giây bằng IntelliJ IDEA!"

"Bạn đặt con trỏ vào tên của phương thức (hoặc nhấp vào nó bằng chuột), sau đó nhấn Shift + F6 và chỉ cần bắt đầu nhập tên phương thức mong muốn."

"Đây là một ví dụ về chỉnh sửa tên phương thức."

"Bắt đầu chỉnh sửa:"

Ý TƯỞNG: tái cấu trúc - 1

"Chỉ định tên mới:"

Ý TƯỞNG: tái cấu trúc - 2

"Chỉ cần nhập tên mới, nhấn enter, thế là xong. Phương thức này sẽ được đổi tên ở mọi nơi nó được gọi trong dự án."

"IntelliJ IDEA cũng thường hỏi bạn có muốn đổi tên biến và tên phương thức trong nhận xét hay không. Chỉ cần nhấp vào 'Có' và nó sẽ thay đổi mọi thứ."

"Hơn nữa, nếu dự án được biên dịch trước hoạt động tái cấu trúc này, thì nó được đảm bảo sẽ biên dịch sau quá trình tái cấu trúc."

"Nghe có vẻ rất hứa hẹn."

"Nhân tiện, bạn có thể thay đổi tên biến theo cùng một cách. Sau khi nhấp vào tên, chỉ cần nhấn Shift+F6 — Sau đó, bạn có thể nhập tên mới và IntelliJ sẽ thay đổi tên biến ở bất cứ nơi nào nó được sử dụng. "

"Nếu biến là một trường trong một lớp và có một getter và setter, thì tên của getter và setter cũng sẽ được thay đổi để khớp với tên mới của biến."

"Tôi đã thử nó bằng cách sử dụng các biến. Mọi thứ hoạt động đúng như bạn nói, Ellie. Tái cấu trúc thật tuyệt vời!"

"Bạn có nghĩ rằng đó là tất cả những gì cần làm để tái cấu trúc không? Khúc xạ là một chủ đề quá rộng - chúng tôi thậm chí còn chưa làm xước bề mặt."

"Chà. Còn gì nữa không?"

Thủ thuật số 2: Trích xuất một biến.

"Đôi khi một số biểu thức nhất định được lặp lại thường xuyên trong mã đến mức bạn sẽ muốn chuyển chúng thành một biến riêng biệt. Ví dụ:"

Mã số
public void printInfo(User user)
{
 System.out.println(user.getProfile().getName());
 System.out.println(user.getProfile().getAddress().getState());
 System.out.println(user.getProfile().getAddress().getCity());
 System.out.println(user.getProfile().getAddress().getStreet());
 System.out.println(user.getProfile().getAddress().getHomeNumber());
}
Bạn muốn nó trông như thế nào:
public void printInfo(User user)
{
 Address address = user.getProfile().getAddress();

 System.out.println(user.getProfile().getName());
 System.out.println(address.getState());
 System.out.println(address.getCity());
 System.out.println(address.getStreet());
 System.out.println(address.getHomeNumber());
}

"Ah."

"Và mã có thể phức tạp hơn nhiều, với rất nhiều phần lặp lại."

"Các lập trình viên không cố ý viết nó theo cách đó. Nhưng bạn thường sẽ cần thêm thứ gì đó vào một phương thức, sau đó là thứ khác - và theo thời gian, số lần lặp lại tăng vọt."

"Bằng cách tạo một biến riêng biệt, chúng tôi có thể đặt cho nó một tên phù hợp và cải thiện khả năng đọc mã."

"Ví dụ, trong ví dụ trên, có lẽ chúng ta không nói về địa chỉ nhà. Có lẽ chúng ta đang nói về địa chỉ của một liên hệ khẩn cấp. Sau đó, bạn có thể gọi biến này là EmergencyContactAddress, thay vì chỉ địa chỉ. Sau đó, một lập trình viên lần đầu tiên nhìn thấy mã này sẽ hiểu chuyện gì đang xảy ra ở đây."

"Vâng, tôi đồng ý. Thêm các biến như vậy là hợp lý."

"Vậy bạn sẽ làm sao?"

"Chuyển một biểu thức thành một biến riêng rất đơn giản."

Bước 1: Dùng chuột chọn biểu thức.

Ý TƯỞNG: tái cấu trúc - 3

Bước 2: Nhấn Ctrl+Alt+V

Ý TƯỞNG: tái cấu trúc - 4

"Một cửa sổ mở ra trong đó IntelliJ IDEA hỏi chúng tôi liệu chúng tôi muốn thay thế chỉ biểu thức đã chọn hay tất cả các phiên bản của biểu thức (4 lần xuất hiện)?"

"Chọn tùy chọn thứ hai để thay thế tất cả các lần xuất hiện (Thay thế tất cả 4 lần xuất hiện)"

Bước 3: Nhấn Enter.

Ý TƯỞNG: tái cấu trúc - 5

"IntelliJ IDEA sẽ nhắc bạn nhập một tên biến. Nó cũng sẽ đưa ra gợi ý riêng cho tên đó. Không tệ phải không?"

"Uh-huh. Đúng rồi. Chúng tôi cũng định đặt tên cho biến là 'địa chỉ'. Làm sao nó biết được?"

"Bằng cách sử dụng tên của phương thức cuối cùng trong biểu thức, phương thức này trả về một địa chỉ. Vì vậy, có khả năng biến đó sẽ được sử dụng để lưu trữ một địa chỉ."

"Chuyện đó diễn ra rất tốt. Tuyệt lắm, Ellie."

Thủ thuật số 3: Trích xuất mã thành một phương thức riêng biệt.

"Nhưng lẽ ra chúng ta có thể làm gì đó khác. Lẽ ra chúng ta có thể đã khai báo một phương thức mới, ví dụ như printAddress (), và chuyển toàn bộ đoạn mã này vào đó."

"Hãy thử làm điều đó."

Bước 1: Chọn 4 dòng mã sử dụng biến địa chỉ:

Ý TƯỞNG: tái cấu trúc - 6

Bước 2: nhấn Ctrl+Alt+M

Ý TƯỞNG: tái cấu trúc - 7

"IntelliJ IDEA xác định các biến mà phương thức sẽ cần và đề xuất giao diện của nó. "Điều duy nhất còn lại là nhập tên cho phương thức."

Bước 3: Nhập printAddress làm tên phương thức và nhấn Enter.

Ý TƯỞNG: tái cấu trúc - 8

"Làm thế nào để bạn thích điều đó?"

"Thật tuyệt vời. IntelliJ IDEA không chỉ trích xuất mã thành một phương thức riêng biệt, mà còn bổ sung tất cả các biến cần thiết. Hơn nữa, nó còn đoán đúng tất cả các tên."