+5

Clean code #2: Đặt tên sao cho phù hợp

1. Đặt tên cho các Class:

Chúng ta thường mắc phải các lỗi sai khi đặt tên Class, như đặt tên quá chung chung, đặt tên không rõ nghĩa, etc....

Dưới đây là một số ví dụ cho việc đặt tên Class:

Dirty Clean
Utils Account
MyModels User
Info UserRepository
etc... etc...

Từ ví dụ trên chúng ta có thể thấy, chúng ta nên đặt tên Class như sau:

  • Noun: Là danh từ
  • Be specific: Tên cụ thể
  • Single Responsibility: Đảm nhiệm một nhiệm vụ duy nhất
  • Avoid generic suffixes: Ngăn chặn đặt tên với các hậu tố chung chung

Và việc đặt tên Class cụ thể dẫn đến dẫn đến các lớp nhỏ gắn kết hơn

2. Đặt tên cho các Method:

Method là các phương thức bên trong 1 Class. Và tại sao việc đặt tên Method lại quan trọng

Lousy Method Names put a very similar burden on your fellow programmers

Bởi vì:

  1. Tên phương thức kém yêu cầu người đọc phải đọc toàn bộ Class trước khi hiểu nó làm gì.
  2. Nếu không đọc mã, người đọc thực sự không biết logic bên trong là gì.

Chúng ta cùng tham khảo các cách đặt tên cho Method sau:

Dirty Clean
Get GetUserInfo
CheckValid IsValidSubmission
Send SendEmail
Process ImportFile
etc... etc...

Tóm lại:

  1. Các Method (phương thức) được đặt tên kém vì tất cả những gì chúng làm là cho bạn biết khi nào chúng được gọi chứ không phải nội dung bên trong. (Ví dụ: Get, Start, ...)
  2. Phương thức được đặt tên tốt là chọn một cái tên mang tính mô tả sao cho người đọc không cần phải đọc bên trong Method cũng biết nó làm gì. Bạn có thể tiết kiệm được nhiều thời gian đọc khi tìm kiếm một bug cụ thể.

Ghi chú: Tên Class và các Method trong Class đó nên có sự liên quan với nhau. Bạn hãy tưởng tượng tên Class như Title của 1 chương sách, và tên các Method trong Class đó là những ý chính để diễn giải rõ nghĩa thêm về tiêu đề của chương sách đó. Một Class viết tốt là một class mà các method bên trong nó đều liên quan chức năng đến tên Class đó.

Ví dụ:

class UserInfoValidation {
    bool isValidPhoneNumber()
    bool isValidAddress()
    bool isValidName()
    bool isValidEmail()
    ....
}

3. Rubber Ducking:

Đây là một kỹ thuật debug. Bạn có thể tham khảo tại đây.

Rubber_Ducking

Rubber Ducking là một cách giúp bạn đặt tên biến, tên method và tên class hiệu quả. Bằng cách giải thích từng dòng mã mà bạn định viết cho chú vịt cao su ấy.

Trong thực tế bạn thường hỏi đồng nghiệp của mình về một cái tên định đặt hoặc một dòng mã bạn định viết, nhưng thường các đồng nghiệp cũng có công việc của họ, nên việc bạn giải thích code của mình cho một chú vịt cao su cũng có thể giúp bạn thoát ra khỏi khuôn suy nghĩ của bạn, và thực sự giải thích những gì đang xảy ra với code của bạn.

Các bước để đặt tên Class, tên Method:

  1. Tuân thủ nguyên tắc Single Responsibility Principle trong SOLID (Nếu Class hoặc Method của bạn chỉ đang thực hiện một việc, đảm nhiệm một chức năng thì việc mô tả mã đang thực hiện việc gì sẽ rất dễ dàng)
  2. Nếu bạn không biết nên đặt tên gì cho Class hoặc Method, hãy hỏi đồng nghiệp. Nhưng nếu bạn không có đồng nghiệp, Rubber Ducking sẽ giúp bạn.
  3. Nếu bạn gặp khó khăn khi đặt tên cho một Class hoặc Method, giải thích to những gì Class hoặc Method thực hiện cho Rubber Ducking nghe.

4. Warning Signs:

Nếu bạn thấy trong Class hoặc Method của mình có các từ And, Or, If, ... đó có thể là dấu hiệu Class hoặc Method của bạn đang cố gắng làm quá nhiều việc.

Ví dụ: SenEmailAndUploadFile(), CopyTextAndShowResult(), etc...

=> Đó là dấu hiệu để bạn biết cần tạo 2 method, không phải 1 method (Trường hợp này gọi là Bad Method)

5. Side Effects:

Một Class/Method đặt tên có cấu trúc tốt sẽ không gây bất ngờ cho người sử dụng với những tác dụng phụ không mong muốn.

Ví dụ:

❌ Bạn đặt tên method là CheckPassword nhưng trong code lại có xử lí logout user.

❌ Method ValidateName() nhưng lại có xử lí save thông tin name của user.

Tóm lại:

  • Đảm bảo tên Method của bạn không lừa dối người đọc. Nếu không họ sẽ phải đọc kỹ từng dòng và đảm bảo nó thực hiện chính xác những gì đã được nêu.
  • Người đọc, đồng nghiệp của bạn đều muốn tin tưởng vào giao kèo mà bạn đang công khai thông qua Tên method mà bạn chọn.

6. Abbreviations:

Vấn đề với chữ viết tắt là ít có chữ viết tắt nhất quán và rõ ràng ngay từ đầu. Hãy tưởng tượng bạn đang đọc một cuốn sách hoặc bài viết chứa đầy chữ viết tắt khó hiểu. Nếu tác giả không giải thích chi tiết về những thuật ngữ ngắn này thì bài đọc sẽ thực sự khó chịu.

✅ Nên tránh viết tắt

Những cái tên viết tắt khó hiểu cản trở việc thảo luận về code. Hãy tưởng tượng rằng chúng ta có một Class có tên là RegisterUser. Nếu thay vào đó chúng ta gọi nó là RegUsr hoặc RegistUser hoặc RegisUser hoặc RegisterUsr, ... không có gì trong số này trôi chảy. Điều này khiến chúng ta khó đọc mã hơn và khó trao đổi với đồng nghiệp hơn khi có vấn đề phát sinh.

7. Naming variables: Booleans

✅ Đặt tên biến Boolean phải nghe giống như câu hỏi đúng/sai

✅ Đặt tên biến Boolean tốt giúp code của bạn đọc giống như lời nói.

Dirty Clean
open isOpen
end done
status isActive
login loggedIn
if (active) { ... } if (isActive) { ... }
etc... etc...

8. Naming variables: Be symmetrical

Dirty Clean
on/disable on/off
show/off show/hide
lock/open lock/unlock
slow/max min/max
etc... etc...

9. Naming variables: Don't add unneeded context

Nếu tên Class/Object của bạn cho bạn biết điều gì đó, đừng lặp lại điều đó trong tên biến (variable).

🔴 Dirty

Car car = Car(
  carMake: "Huyndai",
  carModel: "i10",
  carColor: "White"
);

public void PaintCar(Car car, Color color) {
  car.carColor = color;
}

Trong ví dụ trên, chúng ta có car.carColor, điều này là không cần thiết và đọc không hề tự nhiên chút nào. Hãy xem xét ví dụ clean:

🟢 Clean

Car car = Car(
  carMake: "Huyndai",
  carModel: "i10",
  carColor: "White"
);

public void PaintCar(Car car, Color color) {
  car.color = color;
}

Cảm ơn bạn đã đọc hết bài viết. Nếu thấy hay hãy để lại mình 1 vote và hẹn gặp lại trong bài viết tiếp theo! 🚀


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í