Clean code – Chapter 2: Tất tần tật về Function (Phần 1)

2384

Các function, method xuất hiện rất nhiều trong lập trình và phần clean code của phần này cũng là một phần mình thấy khá khó. Trong bài viết mình đưa ra một vài nguyên tắc và cố gắng clean code chính mình theo các nguyên tắc đó và tất nhiên các đoạn code mình tối ưu chưa phải là tốt nhất.

Trước hết hãy xem đoạn code xử lý bước login sau (Xử lý với framework FuelPHP nhé): Tống tất cả vào 1 hàm:

Đoạn code chạy ổn (tất nhiên là phải chạy ổn mới dám nghĩa tới clean code chứ :v) nhưng ta sẽ tối ưu nó ngon hơn hiện tại

Đừng bỏ lỡ phần 1:

  Clean code - Chapter 1: Đặt tên có ý nghĩa!

1. Small!!!

Nguyên tắc đầu tiên viết hàm là hàm đỏ nên nhỏ và nguyên tắc thứ 2 là hàm đó nên nhỏ hơn nữa. Vậy thế nào là nhỏ? Trong cuốn clean code, tác giả có đề cập đến đoạn code xử lý 1 trò chơi. Nó cung cấp một hiệu ứng ảo nhìn rất đẹp, khi bạn di chuyển chuột, có các hình lấp lánh rơi xuống dưới màn hình như các đũa thần. Tác giả viết gộp tất cả vào khoảng 3000 dòng và sau khi tham khảo đoạn code của 1 người bạn để học các clean code, người bạn đó chia code thành các function cực nhỏ, nhỏ đến mức mỗi hàm chỉ 2,3 dòng.

Khỏi lấy ví dụ đâu xa, hãy xem code trong Laravel xem function của họ nhỏ đến mức nào. Trích code của trait ThrottlesLogins trong Laravel:

Vì vậy đừng lo hàm của bạn có 1,2 dòng và thật vô nghĩa. Nên chia hàm thành các hàm nhỏ, nhỏ và nhỏ hơn nữa.

1.1. Blocks and Indenting

Bạn có thấy nếu bạn sử dụng quá nhiều if như đoạn code trên, code phồng khá to và gây khó đọc. Một nguyên tắc nữa là thực hiện với if, else, while .. sau đó chỉ nên có 1 dòng. Dòng này nên được gọi hàm. Điều này không chỉ giúp hàm trở nên small mà nó còn làm tài liệu có giá trị vì hàm được gọi bên trong block có 1 cái tên miêu tả rất đẹp:

2. Do one thing!!!

Hàm nên được rõ ràng và chỉ nên đảm nhiệm làm 1 thứ. Tư tưởng này đã xuất hiện từ hơn 30 năm về trước “FUNCTIONS SHOULD DO ONE THING . THEY SHOULD DO IT WELL .THEY SHOULD DO IT ONLY.” Hàm đó có thể tạo các bộ nhớ đệm, chỉ format dữ liệu, chỉ render ra HTML … Tuy nhiên định nghĩa thế nào là làm 1 việc lại là vấn đề khó.

Nhìn lại ví dụ trong 1.1 ta thấy hàm thực hiện:

    1. Determining whether the page is a test page.
    1. If so, including setups and teardowns.
    1. Rendering the page in HTML.

Như vậy hàm đó thực hiện một việc hay nhiều việc. Hãy để ý rằng, 3 bước này là 3 bước để thực hiện một việc, mỗi bước được gọi một tên hàm @@. Như vậy nó thực hiện 1 việc. Chúng ta có thể mô tả hàm đó bằng đoạn văn TO sau:

Hơi hack não một chút xíu. Nếu như bạn thực hiện theo kiểu từng bước như trên dưới dạng các hàm, hàm đó rõ ràng thực hiện 1 việc (Nguyên bản: It should be very clear that Listing 3-1 contains steps at many different levels of abstraction. So it is clearly doing more than one thing).

Video: Unit testing Android

3. One Level of Abstraction per Function

Để chắc chắn rằng 1 hàm làm 1 việc, bạn nên chỉ gọi 1 level hàm trong 1 hàm :v. Khó giải thích quá nhưng tóm lại là không nên gọi hàm trong hàm trong một hàm =)). OK nói thế này cho dễ hình dung nhé.

3.1. Reading Code from Top to Bottom: The Stepdown Rule

Quy tắc này hiểu đơn giản là chúng ta muốn đọc chương trình của bạn từ trên xuống như là tập các đoạn văn bắt đầu là TO, mỗi bước miêu tả “current level of abstraction” ở hiện tại và các miêu tả các bước con ở level tiếp theo và mỗi hàm chỉ nên dừng lại ở 1 level của sự trừu tượng. Mô tả đoạn code như sau (theo các level):

Từng TO như vậy ta có thể hiểu mỗi TO sẽ là một hàm và nên dùng lại ở 1 level TO thụt vào cho mỗi miêu tả theo nguyên tắc số 3 này. Rất khó để lập trình viên có thể tuân theo nguyên tắc này, nhưng đó chính là thứ giúp bạn có thể cụ thể hóa cái mỗi hàm chỉ làm 1 việc.

4. Ứng dụng để clean đoạn code ban đầu

OK, chúng ta nhớ 2 thứ trong phần bài viết này đó là 1 hàm cần small và small hơn nữa. Thứ 2 là một hàm cần “DO ONE THING”, làm 1 việc như thế nào thì hãy sử dụng các đoạn văn TO, đọc code từ trên xuống dưới để dễ hình dung.

OK vậy pha login ta mô tả đoạn văn TO như sau:

Nhìn qua ta cần xây dựng các hàm login, kiểm tra dữ liệu, tác biệt riêng, không nên để chung hết như phần mở đầu. Cơ bản đoạn TO trên mô tả như sau:

Trong mô tả trên có đoạn ở level 2, bây giờ ta mới mô tả:

Viết hàm validate thôi:

Tương tự xử lý các pha login, ta có đoạn code đầy đủ sau:

Tổng kết

Với Function bạn cần nhớ

  • Small.
  • DO ONE THINGS? Đoạn văn TO.

TopDev via Viblo

  Clean code - Chapter 1: Đặt tên có ý nghĩa!