Viết code hiển nhiên là nhiệm vụ hàng đầu nếu bạn là một nhà phát triển phần mềm. Tuy nhiên, có bao giờ bạn nghĩ code của mình đã thực sự tốt chưa?
Giữ cho code “sạch đẹp”, rõ ràng và dễ đọc là một thói quen tốt nhưng không phải developer nào cũng quan tâm tới. Thật đáng tiếc, bởi việc code sạch thật sự sẽ thay đổi và ảnh hưởng tới nhiều thứ trong project của bạn.
Vậy Code sạch - Clean Code là gì?
Clean Code hiểu tường minh nghĩa là code sạch, code rõ ràng, dễ đọc.
Về hình thức, Clean Code thể hiện như sau:
- Cách trình bày code: cách căn lề, thụt lề sử dụng tab, space… sao cho dễ đọc, dễ nhìn.
- Cách đặt tên biến, hàm, class có theo những nguyên tắc chung khi lập trình không?
- Cách phân phối lượng code (số dòng code trong file, số dòng code trong 1 method…)
Về nội dung cần xem xét:
- Cách đặt tên hàm, tên biến phải dễ đọc, dễ hiểu.
- Xác định khi nào nên viết comment cho code, khi nào không.
- Thiết kế xây dựng cấu trúc của đối tượng (Object) dữ liệu dễ sử dụng và dễ mở rộng.
- Thiết kế cách xử lý ngoại lệ (Exception) hợp lý.
- Khả năng maintain, mở rộng của code đã tốt chưa?
- ...
Nghe thì đơn giản vậy thôi nhưng không hề dễ dàng đâu nhé.
Vì vậy với bài viết này, Quantrimang sẽ liệt kê ra 9 tip giúp cho bạn viết code "clean and better". Mời bạn đọc theo dõi!
Đặt tên có ý nghĩa
Xin hỏi rằng: các đối tượng, các biến, các lớp, các hàm có nghĩa là gì? Có rất nhiều định nghĩa học thuật về các khái niệm này, nhưng khi suy nghĩ một cách tổng thể, có thể khẳng định đây chính là mối liên kết giữa các lập trình viên và sự logic cơ bản của ứng dụng mình đang viết.
Nếu bạn sử dụng các loại tên không rõ ràng, không mô tả cơ bản về các biến, lớp, hàm thì bạn đang tự tay “che giấu” các logic ứng dụng và gây khó khăn cho mình nếu một thời gian sau cần update và chỉnh sửa ứng dụng. Điều này cũng dẫn những người đồng nghiệp sẽ đọc code của bạn sau này vào một mê cung không thấy đường đi lối lại.
"Tôi không phải là một lập trình viên tuyệt vời; tôi chỉ là một lập trình viên giỏi với những thói quen tuyệt vời." - Kent Beck
Một biến có tên là abc có nghĩa là gì? Chịu luôn! Bạn có thể sẽ cần phải đọc lại toàn bộ code để hiểu abc nghĩa là gì!? Tựu chung vấn đề, đọc code kiểu này sẽ cực kỳ vất vả. Thay vì muốn biểu hiện danh sách khách hàng bằng biến list1, hãy dùng listCustomer. Bởi vì list1 là một tên vô nghĩa, dễ gây nhầm lẫn và lộn xộn khi đọc. Điều này cũng đúng với việc đặt tên cho class hay function.
Vậy tóm lại tên biến đạt yêu cầu phải trả lời được 3 câu hỏi lớn:
- WHAT: Nó là cái gì?
- WHY: Nó dùng để làm gì ?
- HOW: Làm sao sử dụng nó ?
Bỏ thêm vài giây để suy nghĩ một cái tên chuẩn, tiết kiệm được hàng giờ đồng hồ sau này.
Các hàm, các lớp nên viết ngắn gọn và làm một việc duy nhất
Bạn đã bao giờ gặp phải một hàm dài hàng trăm, thậm chí hàng ngàn dòng chưa? Nếu rồi, bạn hẳn phải tưởng tượng ra sẽ đau khổ như nào nếu ta phải duyệt, đọc, hay chỉnh sửa các hàm như vậy. Các comment có lẽ sẽ giúp ích một chút, tuy nhiên chỉ ở mức độ rất hạn chế.
Vậy nên, hàm phải ngắn hết mức có thể. Một hàm lý tưởng không nên viết quá 20 dòng. Về nguyên tắc, nếu hàm quá dài hãy chia nhỏ thành các hàm con, mỗi hàm con thực hiện một việc duy nhất. Tên của hàm phải thể hiện rõ tác dụng duy nhất của nó.
Ví dụ một hàm phức tạp như GetCreditScore() có thể được chia thành nhiều hàm trợ giúp nhỏ hơn kiểu dạng GetCreditReports(), ApplyCreditHistoryAge() và FilterOutstandingMarks()...
Xóa bỏ các đoạn code không cần thiết
Thói quen xấu giữ lại một số đoạn code dư thừa là một trong những điều mà lập trình viên nào cũng từng trải qua. Chắc chắn bạn sẽ quen thuộc với kịch bản thế này: bạn muốn sửa chữa hoặc tối ưu hóa một đoạn code, nhưng sau khi comment và viết một đoạn code mới - và mặc dù nó đã hoạt động thì bạn vẫn giữ lại đoạn code cũ ở đó.
Theo thời gian những comment đấy không cần thiết nữa và sẽ khiến cho file nguồn của bạn bị lộn xộn. Do đó, khi có một đoạn code thừa, có cũng như không thì chúng ta cần loại bỏ khỏi source code luôn để ứng dụng của bạn sạch hơn nhé.
Tránh rút gọn code quá mức
Có rất nhiều lập trình viên muốn kết hợp clean code - code sạch với clever code - code thông minh, như kiểu dồn 10 dòng thành một bằng cách nào đó thì nhìn nó sẽ clean hơn. Điều này chắc chắn sẽ giúp đoạn code tốn ít không gian trên màn hình, tuy nhiên liệu nó thực sự dễ hiểu?
Câu trả lời là đôi khi có thể, nhưng phần lớn khẳng định là nó không dễ hiểu chút nào cả!
Thông thường, việc viết code “thông minh” thường là để thể hiện cái tôi cá nhân, hay ngầm thể hiện rằng “à đầu óc mình thông minh nên mới nghĩ ra được như vậy”. Cũng có trường hợp người viết thích thú với thử thách tạo ra sự khác biệt, nhưng vô tình lại làm khó người đọc hiểu code về sau.
Vì vậy, để viết code sạch, bạn hãy đặt cái tôi của mình ra sau, hãy tối ưu code để cả người tiếp theo làm việc với ứng dụng cũng có thể hiểu được. Thậm chí một thời gian sau, người sử dụng code này vẫn là bạn, và bạn lại không nhớ những lối tắt sử dụng trong đoạn code ngắn gọn này của mình nghĩa là gì, cũng có thể lắm chứ! Thật kỳ cục nếu bạn nói rằng không thể hiểu được mình đã từng làm gì phải không?
Lựa chọn kiến trúc phù hợp với project
Có rất nhiều mô hình và kiến trúc khác nhau mà bạn có thể sử dụng để tạo dự án của mình. Nhưng hãy luôn lưu ý rằng, cần chọn đúng kiến trúc cho nhu cầu của bạn, chứ không phải chọn một trong những cái tốt nhất.
Ví dụ:
- Mô hình Model-View-Controller (MVC) rất phổ biến trong phát triển web hiện nay vì nó giúp giữ code của bạn được tổ chức và thiết kế sao cho giảm thiểu tối đa việc bảo trì.
- Tương tự, mô hình Entity-Component-System (ECS) rất phổ biến trong phát triển trò chơi bởi vì nó giúp module dữ liệu trò chơi có thể bảo trì dễ dàng hơn.
Nắm vững sắc thái riêng biệt của ngôn ngữ sử dụng
Một trong những khó khăn trong việc thạo một ngôn ngữ lập trình mới là học các sắc thái tách nó ra khỏi tất cả các ngôn ngữ khác. Những sắc thái này có thể là sự khác biệt giữa một dirty code, phức tạp và clean code, dễ bảo trì.
Hãy xem xét Python, Java và JavaScript, 3 ngôn ngữ này có sự khác biệt rất rõ ràng. Trong khi Python nổi bật với các dòng code ngắn gọn và đơn giản thì Java lại tường minh theo cách khá dài dòng. Vì vậy mỗi ngôn ngữ lập trình đều có các sắc thái riêng, trước khi bạn muốn code sạch thì phải học mà hiểu rõ chúng đã nhé!
Học code sạch từ các Master trong ngành
Nếu bạn muốn viết code sạch, tốt nhất bạn nên “mục sở thị” xem code sạch sẽ trông như thế nào và cố gắng hiểu tại sao clean code lại là như vậy. Không có cách nào để làm điều này tốt hơn việc nghiên cứu các file mã nguồn của những người đi trước, đặc biệt là những dự án của các đối tượng được coi là Master trong ngành.
Tất nhiên là bạn không thể vào trụ sở chính của Microsoft và xem lén các dự án của họ, nhưng bạn luôn có thể tham khảo các dự án mã nguồn mở nổi tiếng. Hãy thử với các dự án tuyệt vời trên Github xem nào!
Một trong những lý do các dự án mã nguồn mở rất được hoan nghênh đó là giúp người khác có thể học hỏi nhiều điều từ code của mình.
Viết comment hợp lý
Viết bình luận hợp lý, thích hợp là lời khuyên lâu đời nhất trong thế giới lập trình. Thực tế, ngay từ khi được giới thiệu về comment, những “newbie” thường có xu hướng lạm dụng bình luận quá mức - mô tả những điều không cần phải mô tả, thiếu quan điểm về một "comment hợp lý" có nghĩa là gì.
Đây là một nguyên tắc nhỏ: comment tồn tại để giải thích tại sao một đoạn code tồn tại chứ không phải những gì mà đoạn code đó thực sự làm. Nếu code được viết đủ sạch, nó tự giải thích như những gì nó làm - comment chỉ nên làm sáng tỏ về ý định đằng sau lý do tại sao nó được viết.
Refactor, Refactor, Refactor
Code refactoring là hoạt động chỉnh sửa khiến source code dễ đọc hơn, được tổ chức khoa học hơn, và có thể có kiến trúc/cấu trúc tốt hơn nhưng không làm thay đổi hành vi của hệ thống về mặt chức năng.
Hiểu đơn giản, refactor (tái cấu trúc, cải tiến mã nguồn) là một cách kỳ diệu để làm sạch mã. Có thể xem đây là mẹo quan trọng nhất nếu bạn muốn code của mình được “clean”.
Hết rồi đấy, nếu bạn đang tìm hiểu và muốn viết code sạch thì có thể áp dụng thử xem nhé. Nếu có mẹo nào hay ho, rất hoan nghênh bạn chia sẻ thêm với Quantrimang.