+47

Tóm tắt cuốn Clean Code của Uncle Bob

Bài viết được dịch từ Gist của wojteklu.

Code sạch khi nó có thể được hiểu bởi tất cả mọi người trong team. Code sạch có thể được một lập trình viên khác ngoài chính tác giả đọc và cải tiến. Code dễ hiểu sẽ dễ đọc, dễ sửa, dễ cải tiến và dễ bảo trì.


Quy tắc chung

  1. Tuân theo các quy ước chuẩn.
  2. Suy nghĩ đơn giản thôi, viết code cũng đơn giản thôi.
  3. Luôn dọn code sạch sẽ hơn lúc bạn nhận nó, dù là code của mình hay người khác.
  4. Luôn tìm nguyên nhân cốt lõi của vấn đề.

Quy tắc thiết kế

  1. Dữ liệu tùy chỉnh/cấu hình thì nên đặt ở level cao.
  2. Thay vì dùng if/else hoặc switch/case, nên vận dụng tính đa hình.
  3. Tách code đa luồng.
  4. Đừng lạm dụng configurability?
  5. Sử dụng dependency injection.
  6. Tuân theo Định luật Demeter

Mẹo để code dễ hiểu

  1. Thống nhất cách làm. Nếu bạn quen với một cách nào đó thì hãy áp dụng cách đó cho những thứ tương tự.
  2. Đặt tên biến có nghĩa.
  3. Khai báo biến để chứa các giá trị biên. Ví dụ:
    // ❌
    const arr = [1, 2, 3];
    for (let i = 0; i <= arr.length - 1; i++) { }
    
    // ✅
    const arr = [1, 2, 3];
    const lastIndex = arr.length - 1;
    for (let i = 0; i <= lastIndex; i++) { }
    
  4. Nếu có thể, chọn 'value object' thay vì kiểu dữ liệu nguyên thủy.
  5. Tránh sự lệ thuộc về logic. Ví dụ khi xây dựng method, không nên cho method đó lệ thuộc một điều kiện nào đó trong cùng một class.
  6. Tránh dùng điều kiện phủ định.

Quy tắc đặt tên

  1. Đặt tên rõ ràng, mô tả được công dụng.
  2. Dễ phân biệt.
  3. Dễ đọc.
  4. Dễ tìm.
  5. Không nên dùng số trực tiếp trong code mà phải đặt tên cho nó. Ví dụ:
    // ❌
    if (gender === 0) { }
    else if (gender === 1) { }
    else { }
    
    // ✅
    const MALE = 0;
    const FEMALE = 1;
    
    if (gender === MALE) { }
    else if (gender === FEMALE) { }
    else { }
    
  6. Không nên chèn tiền tố hay kiểu dữ liệu vào tên. Ví dụ:
    // ❌
    let sName = "Robert C. Martin";
    let roleList = ["User", "Admin", "Mod"];
    
    // ✅
    let name = "Robert C. Martin";
    let roles = ["User", "Admin", "Mod"];
    

Tham khảo thêm: Naming rules - Các quy tắc vàng trong làng đặt tên

Quy tắc của hàm

  1. Nhỏ.
  2. Chỉ làm một việc.
  3. Tên dễ hiểu.
  4. Chỉ nên có ít đối số.
  5. Không có tác dụng phụ.
  6. Không được dùng đối số dạng flag mà phải tách nhỏ hàm ra thành nhiều hàm độc lập để dễ gọi cũng như test. Ví dụ:
    // ❌
    function setConfig(name, value) {
        if (name === "theme") {
            this._theme = value;
        }
        if (name === "font") {
            this._font = value;
        }
    }
    
    // ✅
    function setTheme(value) { this._theme = value; }
    function setFont(value) { this._font = value; }
    

Quy tắc comment

  1. Code nên dễ hiểu để không lệ thuộc nhiều vào comment.
  2. Không comment dư thừa.
  3. Không comment những điều quá rõ ràng, dễ nhận biết. Ví dụ:
    /**
     * Hàm thêm role vào database.
     */
    function addRole(role) {
        db.roles.add(role);
    }
    
  4. Không comment khi đóng thẻ/ngoặc. Ví dụ:
    <!DOCTYPE html>
    <html lang="en">
    <!-- mở head -->
    <head>
    ...
    </head>
    <!-- kết thúc head -->
    
    <!-- mở body -->
    <body>
    ...
    </body>
    <!-- kết thúc body -->
    </html>
    
  5. Không comment đoạn code không còn sử dụng, xóa nó luôn.
  6. Comment lý do tại sao code được viết như vậy (code lạ, trường hợp bất khả kháng).
  7. Comment để làm rõ ý nghĩa của code (logic phức tạp).
  8. Comment cảnh báo hậu quả.

Cấu trúc code

  1. Phân chia code theo chiều dọc.
  2. Những code liên quan nhau nên viết liền nhau (theo chiều dọc).
  3. Khai báo biến gần chỗ nó được sử dụng.
  4. Các hàm liên quan nhau nên đặt gần nhau.
  5. Các hàm giống nhau nên đặt gần nhau.
  6. Các hàm nên viết từ trên xuống dưới.
  7. Mỗi dòng code nên ngắn.
  8. Không cân chỉnh code theo chiều ngang. Ví dụ:
    // ❌
    const PI:     number = 3.14;
    let   radius: number = 10;
    let   area:   number = 2 * PI * radius;
    
    // ✅
    const PI: number = 3.14;
    let radius: number = 10;
    let area: number = 2 * PI * radius;
    
  9. Dùng khoảng trắng một cách hợp lý để liên kết những thứ liên quan và tách những thứ ít liên quan với nhau.
  10. Đừng ngắt thụt đầu dòng. Ví dụ:
    // ❌
    if (isUser) loadUserPage();
    else redirectHome();
    
    // ✅
    if (isUser)
        loadUserPage();
    else
        redirectHome();
    

Cấu trúc dữ liệu và object

  1. Ẩn cấu trúc nội bộ.
  2. Dùng cấu trúc dữ liệu nếu có thể.
  3. Tránh cấu trúc hỗn hợp, nửa này nữa kia.
  4. Nhỏ.
  5. Chỉ làm một việc.
  6. Chỉ dùng một ít biến instance.
  7. Cha không được nhìn con. (Base class không nên biết các child class trông như thế nào)
  8. Tạo nhiều hàm thay vì truyền đối số vào duy nhất một hàm rồi xử lý theo đối số đó.
  9. Nên dùng non-static thay vì static method.

Kiểm thử (test)

  1. Mỗi test chỉ nên kiểm tra một thứ.
  2. Dễ đọc.
  3. Nhanh.
  4. Độc lập.
  5. Có thể lặp đi lặp lại.

Code thúi

  1. Quá cứng nhắc, khó thay đổi. Một thay đổi nhỏ mà dẫn tới một loạt những thay đổi khác.
  2. Mong manh, dễ vỡ. Chỉ sửa một chỗ mà gây ra lỗi một đống chỗ.
  3. Bất động. Code không thể được tái sử dụng trong những dự án khác, vì quá nhiều rủi ro và tốn effort.
  4. Phức tạp hóa không cần thiết.
  5. Lặp lại không cần thiết.
  6. Code khó hiểu.

@khangnd
Github Linkedin Dev.to Fandom


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí