Mình quyết định đọc cuốn Refactoring: Improving the Design of Existing Code sau khi đọc xong cuốn Design Pattern.
Sơ lược
Mặc dù đã được nghe đến khái niệm này rất nhiều lần, tuy nhiên sau khi đọc xong cuốn sách, đối chiếu với những trải nghiệm của bản thân về các project trước đây. Mình hiểu:
Refactor là quá trình thao tác trên mã nguồn có sẵn nhằm gia tăng chất lượng mã nguồn nhưng vẫn giữ lại được các ràng buộc của hệ thống.
Như vậy, refactor không phải quá trình tạo mới hoàn toàn một dự án hay một hệ thống nào cả, mà nhằm làm tăng chất lượng của mã nguồn đó. Chất lượng ở đây được đánh giá trên các độ đo khác nhau:
- Khả năng mở rộng của mã nguồn.
- Khả năng dễ đọc và tìm lỗi.
- Khả năng thích ứng với lỗi (tính robustness)
- Hiệu suất của hệ thống.
Ngoài việc làm gia tăng chất lượng của hệ thống, bên cạnh đó refactor phải đảm bảo giữ lại được các ràng buộc mà trước đó hệ thống đã có. Ví dụ như:
- Những APIs đã được phát hành của hệ thống, ta không nên refactor và thay đổi luôn các APIs đó.
- Những class, functions liên hệ trực tiếp đến các modules khác trong hệ thống lớn hơn.
Những kĩ thuật trong refactor
Một phần quan trọng của cuốn sách không chỉ nói về định nghĩa của refactor mà còn đề cập đến lí do vì sao cần refactor, khi nào nên refactor, những tác động nào ảnh hưởng đến quá trình refactor, và đặc biệt là xây dựng bộ test cho hệ thống. Trước giờ mình chủ yếu làm các hệ thống trong academic, việc xây dựng các bộ test không được chú trọng quá nhiều. Nhưng thực sự đọc xong cuốn sách mình nghĩ mình nên tập các viết các bộ test trước khi viết một function nào đó. Việc tự tay viết các bộ test mang lại khá nhiều thuận lợi:
- Giúp người thiết kế biết được giao diện tương tác API mà function mình đảm nhiệm.
- Hiểu được các ràng buộc về Input/Output và tham số.
- Thuận lợi cho việc refactor, các bộ test sẽ giúp ta kiểm tra xem việc vừa refactor xong có ảnh hưởng gì đến hệ thống hiện có không.
- Hình thành được outline của hệ thống trong quá trình xây dựng bộ test.
Cuốn sách được bố cục phần nào giống với bên Design Pattern, cung cấp một lượng lớn từ vựng về các kĩ thuật refactor. Với mỗi kĩ thuật được đề cập, tác giả nêu lên: động lực sử dụng, ví dụ minh họa, các lưu ý. Các kĩ thuật refactor được chia thành các category
- Thao tác trên các method trong 1 class.
- Thao tác trên các method giữa các class với nhau.
- Tổ chức dữ liệu.
- Đơn giản hóa các câu lệnh điều kiện.
- Đơn giản hóa các hàm.
- Tái tổ chức hệ thống class.
Cuối cùng là những thao tác refactor ảnh hưởng đến các ràng buộc của hệ thống, đây là những thao tác sẽ ảnh hưởng lên đến việc tương tác giữa các hệ thống với nhau nên cần suy nghĩ cẩn trọng trước khi thực hiện.
Phần cuối cùng là các công cụ refactor, mình nghĩ phần nào không cần nói nhiều vì trên các IDE nổi tiếng như Visual Studio, Eclipse, IntelIJ thì các kĩ thuật refactor đã trở thành những tính năng khá quen thuộc. Việc refactor tự động giúp tránh xảy ra lỗi và giảm thời gian cho công việc này khá nhiều.
Nếu có hành động nào đó lặp đi lặp lại trên 5 lần. Tốt hơn là ta nên làm cách khiến nó thành tự động.
Bình luận
Đây là cuốn sách cuối cùng mình đọc liên quan đến công nghệ phần mềm trước khi đến với phần thử thách với mình nhiều hơn: Machine Learning và Computer Vision.
Cuốn sách đặc biệt phù hợp với các bạn sinh viên năm 3, 4 sau khi đã học về lập trình hướng đối tượng cũng như đã trải qua một thời gian tiếp xúc với những mã nguồn, dự án có sẵn. Thời gian đọc có lẽ mất từ 5-7 ngày.
Điều thú vị khi mình đọc đó là cảm giác:
wtf?? đổi tên biến cũng được gọi là refactor wtf?? đổi tên hàm cũng vậy …
Mình nghiệm ra, refactor không phải là cái gì đó quá cao siêu, có lẽ bạn nào lập trình cũng đã từng thực hiện một lần. Nhưng refactor như thế nào hiệu quả, tốn ít thời gian và công sức và hơn hết là biết cách refactor là một chuyện khác.
Refactoring là cuốn sách sẽ giải đáp những điều đó.
Future Works
Mình đã đọc xong cuốn Design Patterns nhưng chưa biết review thế nào. Có lẽ cần nhiều thời gian hơn để có thể viết về các mẫu. Nhưng có lẽ mình không tập trung nhiều thời gian.
Kế hoạch sắp đến: Pattern Recognition and Machine Learning.