Những Phương Pháp Tốt Nhất Cho Việc Tái Cấu Trúc Mã
Tái cấu trúc mã (Refactoring) là quá trình cải thiện mã nguồn mà không làm thay đổi chức năng của nó. Đây là công việc cần thiết để giữ mã nguồn dễ đọc, dễ hiểu, và dễ bảo trì. Dưới đây là một số nguyên tắc và ví dụ về việc tái cấu trúc mã.
1. Mã nguồn phải giữ đơn giản và sạch sẽ
Tránh viết mã quá phức tạp hoặc chồng chất.
Ví dụ: Sử dụng các phương thức nhỏ và rõ ràng thay vì một phương thức lớn và phức tạp.
Trước khi tái cấu trúc (Refactoring):
Sau khi tái cấu trúc (Refactoring):
Như bạn có thể thấy, sau khi tái cấu trúc, mã trở nên dễ đọc và dễ hiểu hơn. Mỗi phương thức thực hiện một chức năng cụ thể, giúp cho việc bảo trì và mở rộng mã nguồn dễ dàng hơn.
2. Tránh lặp lại mã (DRY - Don't Repeat Yourself)
Nếu có đoạn mã tương tự nhau ở nhiều nơi, hãy tạo ra một hàm hoặc lớp riêng để tái sử dụng.
Ví dụ: Thay vì viết cùng một đoạn mã xử lý chuỗi ở nhiều nơi, hãy tạo ra một hàm xuLyChuoi và gọi nó khi cần.
Trước khi tái cấu trúc (Refactoring):
Sau khi tái cấu trúc (Refactoring):
Trong ví dụ trên, hai hàm luu_sinh_vien và luu_giang_vien đều mở một tệp và ghi dữ liệu vào tệp. Mã này lặp lại hai lần, dẫn đến việc không tuân theo nguyên tắc DRY.
Sau khi tái cấu trúc, ta tạo ra một hàm luu_du_lieu để tái sử dụng mã. Hàm này nhận vào một tệp và một số thông tin, sau đó ghi thông tin vào tệp. Với cách này, chúng ta đã loại bỏ sự lặp lại của mã và giữ mã nguồn gọn gàng hơn.
3. Phân tách chức năng
Mỗi hàm hoặc phương thức chỉ nên thực hiện một chức năng cụ thể.
Ví dụ: Thay vì có một hàm thực hiện cả việc đọc và xử lý dữ liệu từ file, hãy tách thành hai hàm riêng biệt - một hàm đọc dữ liệu và một hàm xử lý dữ liệu.
Trước khi tái cấu trúc (Refactoring):
Chúng ta có một hàm tao_khach_hang thực hiện cả việc xác nhận email và thêm khách hàng vào cơ sở dữ liệu. Tuy nhiên, việc này làm cho hàm trở nên dài và khó đọc.
Sau khi tái cấu trúc (Refactoring):
Chúng ta tách hàm tao_khach_hang thành hai hàm riêng biệt: xac_nhan_email và taokhachhang. Mỗi hàm giờ đây chỉ thực hiện một nhiệm vụ cụ thể.
4. Sử dụng tên biến và tên hàm mô tả
Tên biến và tên hàm nên phản ánh mục đích của nó, không nên quá ngắn hoặc không rõ nghĩa.
Ví dụ: Thay vì sử dụng tD cho tên biến chứa tổng doanh thu, hãy sử dụng tongDoanhThu.
Trước khi tái cấu trúc (Refactoring):
Chúng ta có một hàm tt với các đối số không rõ ràng, khiến cho việc đọc và hiểu mã trở nên khó khăn.
Sau khi tái cấu trúc (Refactoring):
Chúng ta đổi tên hàm thành tinh_tong và đổi tên các đối số để rõ ràng hơn, giúp mã trở nên dễ đọc và hiểu hơn.
5. Tránh viết mã chồng chéo (coupling)
Các lớp và hàm nên độc lập với nhau, không nên phụ thuộc quá nhiều vào nhau.
Ví dụ: Thay vì truyền cả một đối tượng Database vào hàm layDuLieu, hãy truyền chỉ thông tin cần thiết như id.
Trước khi tái cấu trúc (Refactoring):
Chúng ta có một lớp SinhVien mà trong đó hàm khởi tạo cần truyền vào một đối tượng database. Điều này tạo ra sự chồng chéo giữa lớp SinhVien và database.
Sau khi tái cấu trúc (Refactoring):
Chúng ta loại bỏ sự chồng chéo bằng cách tách phần thao tác với database ra khỏi lớp SinhVien, và tạo một hàm riêng biệt luu_sinh_vien.
6. Đảm bảo kiểm tra tự động
Sử dụng các công cụ kiểm tra tự động để đảm bảo chức năng không thay đổi sau khi tái cấu trúc mã.
Ví dụ: Sử dụng các framework kiểm tra như JUnit cho Java hoặc pytest cho Python.
Trước khi tái cấu trúc (Refactoring):
Chúng ta không có bất kỳ kiểm tra tự động nào.
Sau khi tái cấu trúc (Refactoring):
Chúng ta thêm các kiểm tra tự động sử dụng pytest, giúp đảm bảo mã của chúng ta hoạt động đúng mong đợi sau khi tái cấu trúc.
7. Thực hiện thay đổi từ từ và kiểm tra thường xuyên
Không nên thực hiện nhiều thay đổi cùng một lúc. Tái cấu trúc mã từ từ và kiểm tra thường xuyên.
Ví dụ: Thay vì thực hiện tái cấu trúc toàn bộ ứng dụng trong một lần, hãy chia thành từng bước nhỏ và kiểm tra sau mỗi bước.
Trước khi tái cấu trúc (Refactoring):
Chúng ta thường thực hiện nhiều thay đổi cùng một lúc mà không kiểm tra thường xuyên, dẫn đến khả năng cao gặp lỗi.
Sau khi tái cấu trúc (Refactoring):
Chúng ta thực hiện từng bước thay đổi một cách cẩn trọng, và sử dụng kiểm tra tự động sau mỗi bước thay đổi. Chúng ta cũng kiểm tra chức năng của ứng dụng sau mỗi bước để đảm bảo nó vẫn hoạt động như mong muốn.
Nhớ rằng, tái cấu trúc mã là một quá trình liên tục và cần được thực hiện định kỳ để đảm bảo mã nguồn luôn ổn định và dễ bảo trì. Chúc các bạn may mắn và thành công trong việc tái cấu trúc mã!
All rights reserved