How to write clean code (P1)

by Hoang Anh Tuan
280 views

Mặc dù lâu không viết gì vì đang bận làm đồ án, nhưng sau khi khi hoàn thành 1 task về refactor vài nghìn dòng code đã là động lực để em phải ngoi lên viết bài viết này, để chia sẻ về cách viết code mà bản thân đang áp dụng.
Phần 1 của bài viết sẽ giới thiệu về cách cải thiện code đơn giản và dễ dàng nhất: Đặt tên

Nội dung bài viết

  • Tầm quan trọng của clean code
  • Meaningful names

Tầm quan trọng của clean code

Tại sao clean code lại quan trọng?

  • Những dòng code cũng chính là 1 bản design document, vì vậy nếu code được viết 1 cách gọn gàng, dễ hiểu thì khi 1 người mới đọc code thì sẽ dễ dàng nắm được logic, flow của code – Sếp HoaND1 said.
  • Việc viết code 1 cách clean sẽ giảm thiểu thời gian dể người khác, hoặc chính bạn sau 1 thời gian đọc lại, có thể nhanh chóng hiểu được; tránh gây ra những hiểu lầm về mặt logic.
Clean code cũng giúp tránh việc đồng nghiệp của bạn phải thốt lên “WTF” nữa

Meaningful names

Việc chọn 1 cái tên sao cho truyền tải đủ ý định của biến, hàm, class, … đôi khi sẽ mất nhiều thời gian, những nó sẽ tiết kiệm được nhiều thời gian hơn so với thời gian bị mất.
Một cái tên tốt nên thể hiện tại sao biến này, hàm này, … tồn tại, nó có tác dụng thế nào, được sử dụng thế nào mà không cần tốn thêm quá nhiều thời gian để đi tìm hiểu chúng làm gì.

let temp: Int = 0
func check() -> Bool {}

Ví dụ với những cái tên kiểu này, đồng nghiệp của bạn sẽ phải lặn lội mọi ngóc ngách nơi biến, hàm được gọi để có thể hình dung 1 cái nhìn mơ hồ xem chúng có tác dụng gì… Hãy biết thương đồng nghiệp của bạn.
Ok, giờ thì đi tìm hiểu 1 vài cách đặt tên cho tốt

Coding Conventions

Trong swift, có 1 vài coding conventions cơ bản trong việc đặt tên như:

  • Tên biến, tên class nên là danh từ, tên hàm nên bắt đầu bằng 1 động từ
  • Sử dụng camel case (tránh dùng snakeCase)
  • Viết hoa chữ cái đầu cho các kiểu dữ liệu type, protocol, viết thường cho các thứ khác. …

Hãy chọn những cái tên cụ thể với hành vi

func sortListObject() {}

Như tên hàm này không được cụ thể lắm, vì qua cái tên không thể hiện được là object sẽ sort theo kiểu gì?
Nếu sort theo tên thì nên sửa lại thành sortListObjectById() chẳng hạn, hoặc sortListObjectByName() nếu sort theo tên.

Nếu có điều gì quan trọng về 1 biến, 1 hàm mà người đọc nên biết, thì nên thêm thông tin đó vào tên.

var id: String // "af84ef845cd8"
-> var hexID: String

Tránh những cái tên chung chung

Những cái tên mơ hồ như temp, tmp, i, j, … trong đa số trường hợp thường không thể hiện được quá nhiều thông tin. Vì vậy, hãy chọn 1 cái tên truyền tải nhiều ý nghĩa hơn thay vì chúng.

Cũng có 1 vài trường hợp những cái tên chung chung có thể chấp nhận. Ví dụ như:

if left < right {
   let temp = left
   left = right
   right = left
}

Trong những trường hợp như thế này, việc sử dụng tên “temp” cũng ổn. Bởi mục đích của nó là lưu trữ tạm thời,với thời gian tồn tại chỉ vài dòng, nó cũng không có nhiệm vụ nào khác. Nó không được chuyển sang chức năng khác hoặc được đặt lại, hoặc sử dụng nhiều lần. Và quan trọng hơn là người khác vẫn có thể dễ dàng hiểu.

Hãy chọn những cái tên ý nghĩa. Nếu bạn định sử dụng những cái tên chung chung như “temp”, “tmp”, … hãy chắc chắn rằng có 1 lí do hợp lí cho việc đó.

Tránh những tên quá dài

  • Khi chọn tên, nên tránh những cái tên quá dài, bởi vì chúng rất khó đọc và khó để nhớ
newNavigationControllerWrappingViewControllerForDataSourceOfClass
  • Đôi khi những cái tên cũng chứa những thông tin bị thừa, mà nếu bỏ đi thì cũng không ảnh hưởng gì tới ý nghĩa.
func convertToString() 
func toString() // Vẫn truyền tải đủ ý nghĩa

Tránh những cái tên hiểu lầm

  • Tránh đặt những tên kiểu getXYZ(), sizeXYZ(), … nếu bên trong thân hàm xử lý những logic có độ phức tạp tính toán lớn, bởi những cái tên này thường dễ khiến người đọc hiểu lầm là hàm này "lightweight" nên dùng 1 cách thường xuyên.
// Tên hàm gây hiểu lầm
func getNumberOfSelectedObjects() -> Int {
   Loop hundreds time to calculate ...
}
  • 1 vài kiểu gây hiểu lầm khác như đặt tên biến là objectIndexs nhưng lại trả về kiểu Object, …
  • Những cái tên trả về kiểu boolean thì tên biến, hàm nên bắt đầu bằng các từ như is, has, can, should, … để làm cho rõ nghĩa.
  • 1 số cái tên thông dụng khác như max, min cho giới hạn; first, last cho thứ tự,…

Kết luận

Hãy cố gắng chọn những cái tên truyền đạt đầy đủ ý nghĩa và dễ hiểu đối với mọi người.

Tham khảo

Sách "The Art of Readable Code" – O’Reilly
Sách "Clean Code" – Uncle Bob

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.