Cách Viết Clean Code

Trong bài viết này, chúng ta sẽ khám phá khái niệm “clean code” – một thuật ngữ chỉ phong cách viết code rõ ràng, dễ đọc và dễ bảo trì. Bài viết cung cấp 20 ví dụ về các nguyên tắc clean code, cùng hướng dẫn chi tiết về ý nghĩa, tầm quan trọng, các nguyên tắc, và các lưu ý quan trọng.

Phần 1: Hướng dẫn viết Clean Code và các lưu ý

1. Ý nghĩa cơ bản của “clean code”

“Clean code” là code:

  • Dễ đọc: Người khác có thể hiểu nhanh chóng.
  • Dễ hiểu: Logic rõ ràng, dễ nắm bắt.
  • Dễ bảo trì: Dễ sửa đổi và mở rộng.
  • Ít lỗi: Thiết kế tốt, giảm thiểu bug.

Ví dụ:

  • Clean code: `function calculateArea(width, height) { return width * height; }`
  • Not clean code: `function area(w, h) { return w * h; }`

2. Cách viết clean code

a. Đặt tên biến và hàm rõ ràng

  1. Tên biến mô tả mục đích:
    Ví dụ: `numberOfStudents` thay vì `num`.
  2. Tên hàm thể hiện chức năng:
    Ví dụ: `calculateTotalPrice` thay vì `calc`.

b. Hàm nhỏ và đơn chức năng

  1. Hàm chỉ nên làm một việc:
    Ví dụ: Tách việc tính toán và hiển thị kết quả thành hai hàm riêng biệt.
  2. Hàm ngắn gọn: Tránh hàm quá dài, khó theo dõi.

c. Sử dụng comments hợp lý

Loại Comments Mục đích Ví dụ
Javadoc/Docstrings Giải thích chức năng của hàm/class `/** Calculates the area of a rectangle */`
TODO comments Đánh dấu những việc cần làm sau `// TODO: Implement input validation`

3. Một số nguyên tắc quan trọng

  • DRY (Don’t Repeat Yourself): Tránh lặp lại code.
    Ví dụ: Tạo hàm chung cho các logic tương tự.
  • KISS (Keep It Simple, Stupid): Giữ code đơn giản nhất có thể.
    Ví dụ: Tránh các cấu trúc phức tạp không cần thiết.
  • YAGNI (You Ain’t Gonna Need It): Không viết code cho những tính năng chưa cần thiết.
    Ví dụ: Chỉ implement những gì hiện tại yêu cầu.

4. Lưu ý khi viết clean code

a. Tuân thủ coding conventions

  • Consistency is key: Thống nhất cách đặt tên, định dạng code trong toàn bộ dự án.
  • Use a linter: Sử dụng công cụ kiểm tra code để phát hiện lỗi và tuân thủ conventions.

b. Refactoring thường xuyên

  • Improve as you go: Dành thời gian refactor code để cải thiện cấu trúc và tính dễ đọc.
  • Small changes: Thực hiện refactoring từng bước nhỏ để tránh tạo ra lỗi lớn.

c. Viết Unit Tests

  • Test driven Development: Đảm bảo chức năng hoạt động đúng và không bị lỗi khi refactor.
  • Test all edge cases: Kiểm tra các trường hợp đặc biệt để code hoạt động chính xác.

5. Những lỗi cần tránh

  1. Tên biến và hàm không rõ ràng:
    – Sai: `x, y, z` thay vì `width, height, depth`.
  2. Hàm quá dài:
    – Sai: Hàm chứa hàng trăm dòng code.
  3. Thiếu comments:
    – Sai: Code không có chú thích, khó hiểu.

6. Mẹo để ghi nhớ và sử dụng hiệu quả

  • Đọc sách về clean code: “Clean Code” của Robert C. Martin là một tài liệu tham khảo tuyệt vời.
  • Review code của người khác: Học hỏi kinh nghiệm từ các lập trình viên khác.
  • Thực hành thường xuyên: Viết code hàng ngày và áp dụng các nguyên tắc clean code.

Phần 2: Ví dụ sử dụng clean code và các dạng liên quan

Ví dụ minh họa

  1. Instead of `const d = new Date();`, use `const currentDate = new Date();`. (Thay vì `const d = new Date();`, hãy sử dụng `const currentDate = new Date();`.)
  2. Instead of `function process(data) { … }`, use `function processUserData(userData) { … }`. (Thay vì `function process(data) { … }`, hãy sử dụng `function processUserData(userData) { … }`.)
  3. Instead of `if (x > 0 && x 0 && x 0 && x 0 && x < 10; if (isValidRange) { … }`.)
  4. Instead of repeating the same code block multiple times, create a reusable function. (Thay vì lặp lại cùng một khối code nhiều lần, hãy tạo một hàm có thể tái sử dụng.)
  5. Use comments to explain complex logic or non-obvious code. (Sử dụng comments để giải thích logic phức tạp hoặc code không rõ ràng.)
  6. Always format your code consistently using a code formatter like Prettier. (Luôn định dạng code của bạn một cách nhất quán bằng cách sử dụng một công cụ định dạng code như Prettier.)
  7. Break down large functions into smaller, more manageable functions. (Chia các hàm lớn thành các hàm nhỏ hơn, dễ quản lý hơn.)
  8. Avoid deeply nested conditional statements. (Tránh các câu lệnh điều kiện lồng nhau sâu.)
  9. Use meaningful variable and function names that clearly indicate their purpose. (Sử dụng các tên biến và hàm có ý nghĩa, chỉ ra rõ ràng mục đích của chúng.)
  10. Write unit tests to ensure that your code works as expected. (Viết unit tests để đảm bảo rằng code của bạn hoạt động như mong đợi.)
  11. Consider using design patterns to solve common problems in a structured way. (Cân nhắc sử dụng các design patterns để giải quyết các vấn đề phổ biến một cách có cấu trúc.)
  12. Use constants for values that don’t change. (Sử dụng các hằng số cho các giá trị không thay đổi.)
  13. Make sure your code is easy to read and understand, even for someone who is not familiar with the codebase. (Đảm bảo rằng code của bạn dễ đọc và dễ hiểu, ngay cả đối với những người không quen thuộc với codebase.)
  14. Avoid magic numbers and strings by using named constants instead. (Tránh các magic numbers và strings bằng cách sử dụng các hằng số có tên thay thế.)
  15. Always handle errors gracefully and provide informative error messages. (Luôn xử lý lỗi một cách uyển chuyển và cung cấp thông báo lỗi đầy đủ thông tin.)
  16. Write code that is easy to test, maintain, and extend. (Viết code dễ test, bảo trì và mở rộng.)
  17. Avoid global variables and use dependency injection instead. (Tránh các biến toàn cục và sử dụng dependency injection thay thế.)
  18. Use a version control system like Git to track changes to your code. (Sử dụng một hệ thống kiểm soát phiên bản như Git để theo dõi các thay đổi đối với code của bạn.)
  19. Always review your code before committing it to the repository. (Luôn review code của bạn trước khi commit nó vào repository.)
  20. Follow the principles of SOLID design. (Tuân theo các nguyên tắc thiết kế SOLID.)