The Art of Readble Code

Làm sao có thể viết code một cách dễ hiểu

Screenshot from 2015-07-27 10:13:45.png

Mở đầu

  • Có thể bạn đang làm việc tại một công ty phần mềm nổi tiếng nào đó, với những kĩ sư giỏi, nhưng có thể bạn vẫn sẽ vẫn gặp phải những vấn đề cần phải cải thiện. Trên thực tế chúng ta đã từng gặp rất nhiều đoạn code khó hiểu và ngu gốc . Chính bạn cũng có thể đã viết ra những đoạn code này .
  • Nhưng hãy tượng tượng xem khi mà chúng ta viết ra được những đoạn code đẹp, những đoạn code dễ đọc. Good code sẽ giúp bạn hiểu được chức năng của nó là gì một cách dễ hiểu và nhanh chóng . Và nó sẽ tạo động lực cho bạn cải thiện những đoạn code của bạn trở nên tốt hơn.

=> Mục tiêu của bài viết này là đưa ra một số lời khuyên giúp bạn khi lập trình có thể đưa ra được những dòng code dễ hiểu hơn . Khi chúng ta nói đến 'code', theo nghĩa đen có thẻ hiểu là các dòng mã khi bạn viết trên trình soạn thảo của bạn . Chúng ta ở đây không nói về kiến trúc của project hay lựa chọn design patterns. Những thứ đó là quan trọng, nhưng theo tôi thì chúng ta thứ quan trọng nhất ngày qua ngày những công cụ cơ bản . Như tên biến(naming variables), các vòng lặp, những function. Và gần như không thể thiếu đó chính là việc đọc code và sửa lại code đã có . Tôi cam đoan là bất kì ai trong chúng ta như một lập trình viên đều phải làm việc này .

I. Viết code làm sao cho dễ hiểu, dễ đọc

Screenshot from 2015-07-27 10:43:11.png

  • Tôi tin rằng nguyên tắc quan trọng nhất bạn có thể sử dụng khi quyết định làm sao để viết code của bạn chính là key idea. Vậy làm sao để làm được việc này. Chúng ta sẽ trả lời một số câu hỏi sau:

1. Làm sao để code trở nên tốt hơn

  • Gần như toàn bộ các lập trình viên(bao gồm cả tác giả) khi tạo ra chương trình đều dựa trên trực giác và cảm nhận của mình .Ví dụ như Screenshot from 2015-07-27 11:09:27.png

    Sẽ tốt hơn nếu viết thành :

Screenshot from 2015-07-27 13:01:54.png

=> 2 đoạn code trên là hoàn toàn giống nhau về khi chạy . Nhưng bạn có thể thấy đoạn code thứ 2 đọc dễ hiểu hơn. Bạn có thể xem thêm ví dụ dưới đây : Screenshot from 2015-07-27 13:05:35.png

cũng có thể viết : Screenshot from 2015-07-27 13:06:05.png

Cách viết thứ nhất rất ngắn gọn . Nhưng với cách viết thứ 2 thì code sẽ trông dễ hiểu hơn nhiều.

2. Viết code ngắn hơn liệu có tốt hơn ?

  • Nói một cách tổng quát : Viết ít dòng code hơn thì tốt hơn. Bạn có thể mất ít thời gian hơn khi đọc 2000 dòng code so với 5000 dòng code .
  • Nhưng đôi khi sự thật không như vậy. Có thể sẽ mất nhiều thời gian hơn khi đọc dòng expression sau đây : Screenshot from 2015-07-27 13:18:09.png Có thể viết như dưới đây là dễ đọc hơn : Screenshot from 2015-07-27 13:19:16.png

Thông thường để cho những đoạn code phức tạp trở nên dễ hiểu bạn có thể thêm comment Screenshot from 2015-07-27 13:20:31.png

=> như vậy ta có thể thấy mặc dù viết ít dòng code hơn nhưng đôi khi ta vẫn phải dành nhiều thời gian hơn để hiểu cách nó làm việc.

II. Đặt tên các thành phần một cách dễ hiểu

Screenshot from 2015-07-27 13:24:25.png

  • Cho dù tên các biến, function, hay là class, có rất nhiều nguyên tắc giống nhau. Hãy nghĩ ra tên mà nó giống với một comment nhỏ . mặc dù bạn có thể đặt tên biến dài nhưng đó là không nên . Cố gắng đặt tên so cho nó mang nhiều ý nghĩ mô tả về đối tượng đó nhất. Dưới đây là 6 chú ý khi đặt tên .

    +) Chọn tên đặc biệt

    +) Tránh đặt tên chung chung

    +) Dùng tên cụ thể không sử dụng các tên trừu tượng

    +) sử dụng các tiếp đầu ngữ để đưa thêm thông tin vào tên đặt

    +) Quyết định chính xác độ dài của tên sẽ đặt

    +) Đặt tên theo đúng format

  • Chọn tên đặc biệt, chính xác: Ví dụ: từ get là một từ mang nghĩ chung chung và không tường tận

Screenshot from 2015-07-27 13:32:42.png

Từ 'get' này không mang nhiều ý nghĩa. method trên là get page ở local cache hay database hay ở nơ nào đó internet ?. Ta hãy xem xét 1 ví dụ khác

Screenshot from 2015-07-27 13:34:28.png

ở đây Size() sẽ trả về cái gì . Chiều cao của cây hay số lượng các nodes hay là cái gì khác . Khi nhìn vào tên hàm ta rất khó hình dung ra nó sẽ làm cái gì . Vì vậy tốt hơn chúng ta có thể đặt như Height() hoặc NumNodes()...etc..

  • Tránh việc đặt tên chung chung: Tránh đặt những cái tên chung chung như tmp hoặc retval. Mà hãy cố gắng đặt tên mang thể hiện mục đích của biến đó . Ví dụ : Screenshot from 2015-07-27 13:41:00.png

Một biến tạm được sử dụng là retval khi mà bạn không thể nghĩ ra được cái tên nào hay ho hơn. Nhưng retval trên thực tế nó chả mang ý nghĩa gì ở đây. Một cái tên thì nên mô tả mục đích của nó . Ví dụ trong trường hơp sau:

Screenshot from 2015-07-27 13:43:15.png

thì nên đặt thành :

Screenshot from 2015-07-27 13:43:53.png

  • Đặt tên một cách chính xác. Không mang tính trừu tượng

Screenshot from 2015-07-27 13:46:42.png

Đúng như vậy , khi đặt tên biến, function, hay class hoặc bất cứ thành phần nào khác. Làm cho cái tên mô tả một cách chính xác ý nghĩa của nó chứ không mang tính trừu tượng .

Ví dụ: giả sử bạn có một phương thức ServerCanStart() để test xem server có thể chạy hay không ví dụ như nó có lắng nghe trên TCP/IP không . Đây là 1 cái tên trừu tượng . Chính xác hơn bạn nên đặt là CanListenOnPort()

  • Mở rộng thêm thông tin về đối tượng được đặt tên :

Screenshot from 2015-07-27 13:50:44.png

Như đã được đề cập ở trên, tên các biến nên như một comment nhỏ. Mặc dù không được quá dài nhưng nó nên mang thông tin đầy đủ về biến đó

  • Tên biến nên dài bao nhiêu ?

Screenshot from 2015-07-27 13:52:37.png

khi mà chúng ta đặt một tên biến hay, nhưng chúng không được quá dài. Ví dụ : Screenshot from 2015-07-27 13:53:35.png

Một cái tên dài, sẽ khó nhớ hơn và chiếm nhiều diện tích hơn trên màn hình . có thể vượt ra ngoài viền bao qua một dòng

Mặt khác, người lập trình viên có thể đưa ra một lời khuyên quá dài, chỉ sử dụng tên là từ đơn(single-word). Vậy làm sao để quản ly nó? bạn sẽ quyết định tên thế nào nếu biến d, days hoặc days_since_last_update.

  • Sử dụng tên theo format Bạn có thể sử dụng dấu gạch dưới, dấu gạch ngang hoặc viết theo kiểu CAMEL . Ví dụ :

Screenshot from 2015-07-27 14:00:47.png

Có rất nhiều dạng format tên biến ở đoạn code trên như sử dụng uppercase hay dấu gạch dưới để giúp bạn đọc code dễ dàng hơn.

Formatting phổ biến nhất là sửa dụng CamelCase cho class names và sử dụng lower_seped cho tên biến . Nhưng có một vài trường hợp phải viết theo convention của dự án .

Tài liệu tham khảo : The Art of Readable Code by Dustin Boswell and Trevor Foucher.