Refactoring trong C#
November 11, 2024Refactoring là quá trình tái cấu trúc và cải thiện cấu trúc bên trong của mã nguồn mà không thay đổi hành vi bên ngoài của nó.
Mục tiêu chính của refactoring là để cải thiện:
• Hiệu suất và hiệu năng
• Khả năng đọc hiểu code
• Khả năng bảo trì dễ dàng
Khi nào cần thực hiện refactoring?
1. Khi code trở nên khó đọc hoặc khó hiểu:
Khi code của bạn dần trở nên rối rắm, phức tạp và khó hiểu, đó là lúc bạn nên refactor. Việc này giúp code trở nên sạch hơn và dễ bảo trì hơn.
2. Khi phát hiện “code smell”:
“Code smell” là những dấu hiệu cho thấy code của bạn có vấn đề, chẳng hạn như sự trùng lặp, sự phụ thuộc quá mức giữa các lớp, hoặc logic phức tạp. Khi gặp những trường hợp này, cần refactor để đảm bảo mã nguồn tốt hơn.
3. Khi sửa lỗi:
Trong quá trình sửa lỗi, nếu bạn nhận thấy rằng code cần được tổ chức lại để dễ hiểu và dễ bảo trì hơn trong tương lai, hãy tiến hành refactor.
4. Khi hiệu suất là mối quan tâm:
Nếu bạn phát hiện code đang làm giảm hiệu suất của hệ thống, refactor để tối ưu hóa hiệu suất. Tuy nhiên, việc này nên được xem xét ngay từ giai đoạn phát triển ban đầu.
5. Khi làm việc với code cũ (legacy code):
Khi tiếp xúc với code cũ không theo kịp các tiêu chuẩn lập trình hiện tại, cần tiến hành refactor để cập nhật code với các verrsion mới, đảm bảo mã nguồn dễ hiểu và dễ bảo trì.
Các kỹ thuật refactoring phổ biến trong C#:
1. Tạo phương thức mới để bao đóng một phần code hiện có:
Khi một đoạn code quá dài hoặc phức tạp, bạn có thể tách nó ra thành các phương thức nhỏ hơn, dễ đọc và dễ bảo trì.
2. Đặt tên biến có ý nghĩa hơn:
Đặt tên biến một cách rõ ràng và mô tả hơn giúp mã nguồn dễ hiểu và giảm sự nhầm lẫn khi bảo trì hoặc phát triển thêm.
3. Thay thế các giá trị hard-coded bằng các hằng số có tên:
Việc sử dụng các giá trị được hard code gây khó khăn trong bảo trì. Thay thế chúng bằng các hằng số có tên giúp mã dễ đọc và thay đổi hơn khi cần thiết.
4. Nhóm các tham số liên quan thành một đối tượng:
Nếu một phương thức có quá nhiều tham số, bạn có thể nhóm chúng vào một đối tượng để làm đơn giản hóa phương thức, giúp mã trở nên dễ quản lý hơn.
5. Thay thế các câu lệnh điều kiện bằng phương thức đa hình:
Thay vì sử dụng nhiều câu lệnh điều kiện, bạn có thể tận dụng kế thừa và giao diện (interfaces) để áp dụng tinhs đa hình, làm cho code ngắn gọn và dễ hiểu hơn.
6. Thay thế hệ thống phân cấp class composition:
Khi một hệ thống mà có tính năng phân cấp bạn có thể chuyển sang sử dụng composition để đạt được sự linh hoạt và khả năng bảo trì tốt hơn.
7. Định nghĩa interface dựa trên phương thức public của class. Điều này giúp code ít bị ràng buộc (loose coupling) hơn, linh hoạt hơn khi thay đổi các lớp, và dễ dàng mở rộng.
8. Đặt tên biến rõ ràng trong các biểu thức dài và khi gặp các biểu thức hoặc đoạn code dài, bạn nên sử dụng các biến tạm có tên rõ ràng hoặc chia tách function để làm cho code dễ hiểu hơn và giảm độ phức tạp.