Clean Code là gì và tại sao cần thiết?

Clean code là mã nguồn đơn giản, dễ đọc, dễ hiểu và dễ bảo trì. Đây là một kỹ năng quan trọng mà mọi lập trình viên nên có. Viết mã sạch không chỉ giúp bạn làm việc hiệu quả hơn mà còn mang lại nhiều lợi ích quan trọng khác cho dự án phần mềm.

Clean Code là gì và tại sao cần thiết?

Lợi ích của việc viết Clean Code:

  • Tăng hiệu suất làm việc: Mã sạch giúp bạn và đồng đội dễ dàng hiểu, tiếp cận và thao tác với mã nguồn, giảm thời gian đọc hiểu và sửa lỗi.
  • Dễ dàng bảo trì và mở rộng: Khi hệ thống phát triển hoặc cần thêm tính năng mới, clean code giúp việc thực hiện dễ dàng hơn mà không gây ra lỗi cho các tính năng cũ.
  • Tăng khả năng tái sử dụng: Mã sạch thường được viết dưới dạng các thành phần nhỏ gọn, độc lập, dễ dàng tái sử dụng trong nhiều phần của dự án hoặc ở các dự án khác.
  • Tăng tính cộng tác: Khi làm việc nhóm, clean code giúp các thành viên dễ dàng đọc và hiểu mã của bạn, từ đó nâng cao hiệu quả làm việc nhóm.
  • Giảm rủi ro và chi phí: Mã rõ ràng, được tổ chức tốt thường ít lỗi hơn và dễ phát hiện lỗi nếu có, giúp giảm chi phí bảo dưỡng và sửa chữa trong tương lai.

Các tiêu chuẩn viết Clean Code cơ bản:

  1. Phạm vi và chức năng của hàm (Function):

    • Mỗi hàm chỉ nên thực hiện một công việc duy nhất và thực hiện thật tốt công việc đó. Nếu một hàm làm nhiều hơn một nhiệm vụ, hãy tách nó thành nhiều hàm nhỏ hơn.
    • Cố gắng giữ số lượng dòng mã trong một hàm ngắn gọn nhất có thể, lý tưởng là tối đa từ 4-5 dòng. Dù vậy, hãy đảm bảo một hàm không quá 20 dòng, và không quá 100 dòng là giới hạn tối đa.
    • Mỗi dòng code cũng không nên dài quá 150 ký tự. Khối lệnh trong if, else, hoặc while chỉ nên có một dòng, thường là một lời gọi đến một hàm khác.
  2. Đặt tên (Naming):

    • Rõ nghĩa và mô tả cao: Tên của hàm, biến, lớp, file, folder phải mô tả rõ ràng ý nghĩa và mục đích sử dụng của chúng. Ví dụ, đặt tên numberOfDays thay vì chỉ d.
    • Không ngại tên dài: Một tên dài nhưng mô tả đúng vẫn tốt hơn là những dòng comment dài để giải thích.
    • Tránh viết tắt và tên mơ hồ: Hạn chế sử dụng các từ viết tắt hoặc những tên chung chung như value, handle, process, hay các tên vô nghĩa như a, gsagst. Tránh các tên khó phát âm hoặc chỉ gồm 1-2 chữ cái (như i, j, k) khi chúng được sử dụng trong phạm vi rộng.
    • Tuân thủ quy ước: Mỗi ngôn ngữ lập trình có quy ước đặt tên riêng (ví dụ: camelCase cho biến/phương thức trong Java, PascalCase cho lớp).
    • Thống nhất thuật ngữ: Sử dụng thống nhất một thuật ngữ trong toàn bộ dự án cho các từ đồng nghĩa (ví dụ: chỉ dùng get thay vì get, fetch, retrieve).
  3. Sử dụng chú thích (Comment) có ý nghĩa:

    • Không lặp lại code: Comment không nên chỉ lặp lại những gì code đã thể hiện rõ ràng. Nếu code đủ rõ nghĩa, không cần comment.
    • Bổ sung thông tin: Comment hữu ích khi giải thích lý do phía sau một quyết định thiết kế, cảnh báo về tác động không mong muốn của một hàm, hoặc mô tả những việc cần xử lý trong tương lai.
    • Loại bỏ comment thừa: Xóa bỏ code đã comment out (sử dụng hệ thống quản lý phiên bản như Git để khôi phục nếu cần) và các comment ghi lại lịch sử thay đổi file.
  4. Các nguyên tắc chung khác:

    • Tính nhất quán: Đảm bảo tính nhất quán trong quy tắc đặt tên, định dạng code, và cấu trúc thư mục trong toàn bộ dự án để mọi người trong nhóm dễ dàng tiếp cận và làm việc.
    • DRY (Don't Repeat Yourself - Đừng lặp lại chính bạn): Tránh lặp lại cùng một đoạn mã hoặc logic nghiệp vụ ở nhiều nơi khác nhau. Khi thấy code trùng lặp, hãy tạo một hàm hoặc lớp để tái sử dụng.
    • KISS (Keep It Simple, Stupid! - Giữ nó đơn giản, ngốc nghếch!): Cố gắng sử dụng các giải pháp đơn giản, dễ hiểu để giải quyết vấn đề, thay vì áp dụng các kỹ thuật phức tạp một cách cứng nhắc.

Ví dụ

/**

 * Quản lý các thao tác liên quan đến Page.

 * Minh họa nguyên tắc Clean Code trong Java.

 */

public class PageService {


    private final PageRegistry registry;

    private final ConfigKeyStore configKeys;

    private final Logger logger;


    public PageService(PageRegistry registry, ConfigKeyStore configKeys, Logger logger) {

        this.registry = registry;

        this.configKeys = configKeys;

        this.logger = logger;

    }


    /**

     * Xóa một trang và tất cả dữ liệu liên quan.

     * @param page đối tượng Page cần xóa

     */

    public void delete(Page page) {

        try {

            deletePageAndAllReferences(page);

        } catch (Exception e) {

            logError(e);

        }

    }


    /**

     * Thực hiện xóa trang và xóa các dữ liệu liên kết.

     */

    private void deletePageAndAllReferences(Page page) throws Exception {

        deletePage(page);

        registry.deleteReference(page.getName());

        configKeys.deleteKey(page.getName().makeKey());

    }


    /**

     * Xóa nội dung trang khỏi hệ thống lưu trữ.

     */

    private void deletePage(Page page) throws Exception {

        // Thực hiện thao tác xóa trong DB hoặc file system

        // (Giả sử gọi repository hoặc file manager)

    }


    /**

     * Ghi log thông tin lỗi để hỗ trợ kiểm tra.

     */

    private void logError(Exception e) {

        logger.log(e.getMessage());

    }

}


Viết Clean Code là một hành trình đòi hỏi sự kiên nhẫn, kỹ năng và thực hành liên tục. Bằng cách tuân thủ những nguyên tắc này từ sớm, bạn sẽ phát triển được thói quen tốt và xây dựng nền tảng vững chắc cho sự nghiệp lập trình của mình.

Xem thêm: 

- Tự học lập trình Java va qua các ví dụ tại đây

- Kiếm tiền tự động, hoàn toàn miễn phí và đơn giản tại đây