Thế nào là refactoring?
"Refactoring is the process of changing a software system in such a way that it does not alter the external behavior of the code yet improves its internal structure." -- MartinFowler
"Tái cấu trúc là quá trình thay đổi hệ thống phần mềm theo một cách mà không làm thay đổi hành vi bên ngoài của mã nguồn nhưng vẫn cải thiện cấu trúc bên trong của nó".
Từ "factor" bắt nguồn từ tiếng Latin có nghĩa là "maker", nghĩa là mọi vật đều được tạo từ các thành phần riêng của nó, do factor/factoring
nghĩa là tìm kiếm xem vật đó được tạo nên từ các thành phần gì và refactoring
chính là quá trình sắp xếp lại cách thành phần đó theo một cách khác mà không thay đổi bản chất của vật đó.
Trong quá trình viết code nói chung, có những nguyên tắc khá phổ biến như là If It Is Working Dont Change
, If It Aint Broke Dont Fix It
... nghĩa là nếu code đã chạy rồi mà không có yêu cầu thay đổi logic thì đừng động vào nữa, bạn sẽ mất thời gian kiểm thử cho một giải pháp chưa hẳn đã tốt hơn thay vì thay vì dành effort cho những task khác ở trong một Agile Sprint
. Nhưng với Refactoring
, chúng ta sẽ được tiếp cận bằng một cách khác, tuy nhiên việc đầu tiên thì chúng ta nên nắm rõ/tuân thủ những điều sau:
- Refactoring không phải là viết lại code (
Reworking
), mà là sắp xếp lại bằng một mã nguồn tương đương. - Refactoring từng bước nhỏ (Small Step).
- Không refactoring cùng lúc với việc thay đổi functionality của code (Đảm bảo về Unit Testing).
- Không refactoring quá mức cần thiết (refactoring mercilessly).
- Refactoring là một quá trình cải tiến liên tục chứ không chỉ đơn thuần là việc đọc ở đâu đó một vài refactoring pattern rồi ốp thẳng vào code. Mỗi lần chúng ta gặp lại những đoạn code mà mình từng viết, chúng ta nhận ra một vài nhược điểm mà có thể tái cấu trúc lại tốt hơn. Rồi chúng ta tái cấu trúc nó và cứ tiếp tục như vậy. Đến cuối cùng có thể chúng ta sẽ không có được refactoring pattern tốt nhất, nhưng sau nhiều lần cải tiến với việc nắm rõ được ưu và nhược điểm của nhiều loại refactoring pattern, chúng ta có thể thay đổi linh hoạt dựa trên yêu cầu được đặt ra.
Nếu Refactoring
là một AmeliorationPattern
, thì hai nguyên tắc IIIWDC
, IIABDFI
nêu trên đều là những AntiPattern
.
Amelioration Pattern.... là những design pattern giúp bạn cải thiện mã nguồn trở nên tốt hơn, dễ bảo trì, mở rộng.
Anti Pattern... là những design pattern được xem là bad practice, nên tránh khi viết code.
Có thể code sau khi refactor sẽ "tệ hơn" lúc ban đầu, nhưng không sao cả, có lẽ cách nhanh nhất để trở nên thông thạo refactoring đó chính là liên tục mắc sai lầm và học hỏi ngay từ sai lầm trước đó. OK, let's do refactor then push it to master branch. Getting fired or getting better? Go big or go home? 😂😂 (just for fun).
Refactoring madness.