The Art of Readble Code (Part II)

Làm sao có thể viết code một cách dễ hiểu (Phần 2)

III. Đặt tên để không bị hiểu sai

Screenshot from 2015-08-31 09:22:52.png

  • Key Idea : Ở bài trước tôi đã đề cập đến việc đặt tên cho dễ hiểu . và ở bài này khi bạn đặt tên biến hay luôn tâm niệm rằng liệu người khác khi đọc tên bạn đặt liệu có cách hiểu khác nào không .

  • Ví dụ 1 : filter() Giả sử bạn đang viết code để thao tác 1 tập hợp các kết quả trả về của cơ sở dữ liệu Screenshot from 2015-08-31 09:39:13.png Khi đọc hàm này liệu bạn có biết kết quả trả về như thế nào ?

    Trả về các Objects với year là <= 2011 hay các Objects với year không là <=2011 ? Vấn đề ở đây filter là 1 từ không rõ ràng. Nó là không rõ ràng liệu nó có nghĩa là để chọn ra hay là để loại bỏ. Tốt nhất là nên tránh những từ không rõ ràng như thế này để tránh bị hiểu nhầm

    Giải pháp: Nếu bạn muốn chọn ra các Objects với điều kiện trên thì nên đặt là là select() và ngược lại nếu bạn muốn loại bỏ thì nên đặt tên là exclude().

  • Ví dụ 2: Clip.

    Giả sử bạn có một function để bớt nội dung trong 1 đoạn văn Screenshot from 2015-08-31 09:49:40.png Sẽ có 2 cách hiểu mà bạn có thể tưởng tượng ra function Clip sẽ làm gì: Loại bỏ một đoạn length từ cuối đoạn văn hoặc sẽ cắt đoạn văn để độ dài maximum là length.

    Cách kiểu thứ 2 có vẻ thông dụng hơn, nhưng bạn không bảo giờ có thể chắc chắn. Tốt hơn hết bạn nên đặt 1 cái tên tốt hơn như Truncate.

    Mặc dù tham số có tên length cũng không được tốt. Nếu nó có tên là max_length thì sẽ cũng làm cho nó dễ hiểu hơn.

    Nhưng đây vẫn chưa phải là kết thúc. Cái tên max_lenth vẫn để lại cho nhiều khúc mắc như : Số bytes tối đa hay số lượng kí tự tối đa hay số từ tối đa. Do vậy có thể đặt lại là max_chars.

  • Ví dụ 3: Sử dụng minmax khi dùng các tên mang ý nghĩa giới hạn Ví dụ bạn có một web quản lý shop và cần dừng những người mua trên 10 sản phẩm một lần : Screenshot from 2015-08-31 10:02:56.png

    Đoạn code trên có một lỗi cơ bản . Chúng ta có thể sửa nó 1 cách dễ dàng bởi thay đổi Screenshot from 2015-08-31 10:03:52.png Hoặc thay đổi CART_TOO_BIG_LIMIT thành 11. Nhưng vấn để gốc là CART_TOO_BIG_LIMIT là một biến khó hiểu . Nó không rõ ràng liệu ý của bạn là đến hoặc đến và bao gồm. => Lời khuyên : cách dễ hiểu nhất để đặt tên một giới hạn là thêm max_ hoặc min_ vào đầu của tên biến giới hạn. Trong trường hợp này chúng ta có thể đặt thành MAX_ITEMS_IN_CART.

  • Ví dụ 4: Đặt tên biến logic Khi chúng ta đặt một tên cho một biến logic hoặc một function có giá trị trả về là một biến logic, hay đảm bảo rằng nó là dễ hiểu cái gì truefalse Đây là một ví dụ nguy hiểm: Screenshot from 2015-08-31 10:10:08.png Phụ thuộc vào việc bạn đọc nó như thế nào(không có ý nói giễu), Có 2 cách để hiểu : Chúng ta cần đọc cái password này hoặc password đã được đọc.

    Trong trường hợp này, tốt nhất là tránh từ read đổi thành need_password hoặc user_is_authenticated.

    Nói chung, việc thêm các từ như is, has, can or should có thể làm cho các biến booleans thêm rõ ràng .

    Thêm một ví dụ một function có tên SpaceLeft() có vể như nó có thể trả về một số. Nếu nó nghĩa là trả về một giá trị booleans thì cái tên hay hơn là hasSpaceLeft().

    Cuối cùng, nên tránh đặt những cái tên mang ý nghĩa tiêu cực như bool disable_ssl = false thay vào đó là bool use_ssl = true.

IV. Thẩm mỹ

Screenshot from 2015-08-31 10:17:32.png

1. Tại sao lại có vấn đề về thẩm mỹ

Screenshot from 2015-08-31 10:21:36.png

  • Hãy tưởng tượng rằng bạn phải sử dụng class này :

Screenshot from 2015-08-31 10:22:33.png

  • bạn sẽ phải dành nhiều thời gian hơn để hiểu nó nhưng nếu bạn đọc 1 phiên bản khác dễ đọc hơn thì mọi chuyện sẽ khác. Screenshot from 2015-08-31 10:24:41.png Rõ ràng là sẽ dễ dàng làm việc hơn với những đoạn code có thẩm mỹ cao hơn. Nếu bạn nghĩ về việc này, hầu hết thời gian lập trình của bạn dành cho việc nhìn vào các đaoạn code. Cách nhanh nhất bạn có thể lướt qua code của bạn, cách dễ hơn để cho bất kì ai cũng có thể đọc code và hiểu code của bạn.

2. Sắp xếp lại các dấu xuống dòng để cho phù hợp và nhỏ gọn hơn

  • Giả sử bạn đang viết một đoạn Java code để đánh giá chương trình của bạn chạy như thế nào dưới các tốc độ internet khác nhau . Bạn có một TcpConnectionSimulator mà sẽ nhận 4 tham số trong khi khởi tạo:

    Tốc độ của kết nối (Kbps)

    Độ trễ trung bình (ms)

    Hiện tượng jitter của độ trễ (ms)

    Số packet bị thất lạc (phần trăm )

    Code của bạn cần 3 khởi tạo TcpConnectionSimulator

    Screenshot from 2015-08-31 10:36:51.png

Ví dụ code này cần rất nhiều dấu xuống dòng để thỏa mãn giới hạn 80 kí tự mỗi dòng (đây là coding convention của khá nhiều công ty). Không may thay, nó làm phần định nghĩa của t3_fiber trông khác so với những cái còn lại. Để đoạn code trên trở nên nhất quán tôi giới thiệu phương pháp tăng thêm dấu ngắt dòng như sau : Screenshot from 2015-08-31 10:42:12.png

Đoạn code này có một môt hình phù hợp, rất dễ để có thể quét qua cả đoạn code. Nhưng không may là nó sử dụng rất nhiều dấu space. Có 1 cách ngắn gọn hơn để viết : Screenshot from 2015-08-31 10:46:39.png

Tôi đã di chuyển các phần comments lên trên phía trên và đặt tất cả các tham số vào cùng một dòng. Mặc dù phần comment không ở gần mỗi dòng, nhưng nó làm cho trong như gắn gọn hơn rất nhiều .

3. Sử dụng cột liên kết

  • Các cạnh và các cột một cách thẳng hàng sẽ dễ dàng hơn trong việc đọc qua văn bản .
  • Đôi khi bạn có thể giới thiệu cột liên kết để làm code dễ dàng hơn để đọc. Ví dụ ở các phần trước , bạn có thể tạo khoảng trống và xếp hàng các đối số ví dụ : Screenshot from 2015-08-31 10:57:10.png Có thể thành Screenshot from 2015-08-31 10:59:16.png

Bạn cũng có thể viết với mảng để nhìn dễ hơn :

Screenshot from 2015-08-31 11:00:29.png

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