1. Clean code là gì?

Có thể là có rất nhiều định nghĩa. Vì vậy, tôi sẽ đưa ra một định nghĩa về clean code của Grady Booch:

“Clean Code là code đơn giản và rõ ràng. Đọc nó giống như việc bạn đọc một đoạn văn xuôi. Code sạch sẽ thể hiện rõ ràng ý đồ của lập trình viên, đồng thời mô tả rõ sự trừu tượng và các dòng điều khiển đơn giản”.

2. Các nguyên tắc chung để viết clean code?
2.1. Nguyên tắc DRY: Loại bỏ sự trùng lặp mã

Nguyên tắc DRY, từ viết tắt của “Don’t Repeat Yourself”, nhấn mạnh tầm quan trọng của việc tránh trùng lặp mã trong ứng dụng. Bằng cách loại bỏ mã trùng lặp, chúng ta có thể nâng cao khả năng bảo trì mã, giảm độ phức tạp và giảm thiểu rủi ro phát sinh lỗi. Mã trùng lặp có thể dẫn đến sự không nhất quán và khiến những thay đổi trong tương lai trở nên khó khăn hơn.

DRY mở rộng ra ngoài việc sao chép mã theo nghĩa đen. Nó cũng bao gồm sự trùng lặp về kiến thức và ý định. Nói cách khác, đó là việc thể hiện cùng một khái niệm ở nhiều nơi, có thể theo những cách khác nhau. Để tuân thủ nguyên tắc DRY, chúng ta nên cố gắng tạo ra mã sạch, mô-đun và có thể tái sử dụng. Điều này có thể đạt được thông qua các kỹ thuật như sử dụng phương thức, lớp, kế thừa và giao diện.

Áp dụng nguyên tắc DRY trong thực tế

Một cách để thực hiện nguyên tắc DRY là sử dụng các phương pháp. Bằng cách trích xuất mã thường lặp lại thành các phương thức, chúng ta có thể tập trung logic của nó và tránh trùng lặp nó trên ứng dụng của mình. Cách tiếp cận này cho phép bảo trì dễ dàng hơn và thúc đẩy khả năng sử dụng lại mã. Một kỹ thuật khác liên quan đến việc sử dụng các lớp và sự kế thừa. Chúng ta có thể di chuyển mã trùng lặp sang một lớp cơ sở và yêu cầu các lớp khác extends từ nó, đảm bảo rằng chỉ cần thực hiện các sửa đổi ở một nơi. Cuối cùng, các giao diện có thể được sử dụng để chia sẻ mã giữa các lớp mà không có cơ sở chung. Bằng cách xác định giao diện và triển khai nó trong các lớp có liên quan, chúng ta có thể đạt được việc chia sẻ mã trong khi vẫn duy trì tính linh hoạt

Hãy xem xét ví dụ sau trong Java

Trong ví dụ này, phương thức AddIntegers có thể tái sử dụng và loại bỏ nhu cầu sao chép mã để cộng. Bằng cách tuân theo nguyên tắc DRY, chúng ta có thể tạo ra các cơ sở mã sạch hơn, dễ bảo trì hơn.

2.2. Nguyên tắc KISS: Chấp nhận sự đơn giản

Nguyên tắc KISS, viết tắt của " Keep It Simple, Stupid ", nhấn mạnh tầm quan trọng của sự đơn giản trong thiết kế và phát triển phần mềm. Mục tiêu là ưu tiên các giải pháp đơn giản hơn các giải pháp phức tạp. Bằng cách giữ cho mã của chúng ta đơn giản, chúng ta có thể nâng cao tính dễ hiểu, khả năng sử dụng và khả năng bảo trì. Nguyên tắc KISS không chỉ áp dụng cho mã mà còn cho các khía cạnh khác nhau của phát triển phần mềm, bao gồm kiến trúc và thiết kế giao diện người dùng.

Thực hiện nguyên tắc KISS

Có một số cách để triển khai nguyên tắc KISS trong mã của chúng ta. Một cách tiếp cận là sử dụng tên biến và phương thức rõ ràng và mang tính mô tả. Điều này tăng cường khả năng đọc và hiểu mã. Tránh sự phức tạp không cần thiết bằng cách loại bỏ mã trùng lặp, loại bỏ các tính năng không sử dụng và tuân thủ các tiêu chuẩn mã hóa đã được thiết lập. Ngoài ra, hãy cân nhắc việc tách biệt trách nhiệm trong các lớp của dự án để đạt được một cơ sở mã có tính mô-đun hóa và dễ bảo trì hơn.

Trong ví dụ này, phương thức GetMonthName tuân theo nguyên tắc KISS bằng cách cung cấp một giải pháp đơn giản và dễ hiểu. Bằng cách tránh sự phức tạp không cần thiết và tuân thủ các phương pháp hay nhất, chúng ta có thể tạo mã dễ hiểu và dễ bảo trì hơn.

2.3. Nguyên tắc YAGNI: Tập trung vào chức năng thiết yếu

Nguyên tắc YAGNI, viết tắt của " You Ain’t Gonna Need It " nhắc nhở các nhà phát triển chỉ triển khai chức năng khi nó thực sự cần thiết. Nguyên tắc này khuyến khích cách tiếp cận tối giản để phát triển, tập trung vào việc cung cấp các tính năng quan trọng nhất một cách kịp thời. Bằng cách tránh triển khai các chức năng không cần thiết, chúng tôi có thể tối ưu hóa thời gian phát triển, giảm độ phức tạp và tăng tính linh hoạt.

Lợi ích của Nguyên tắc YAGNI
Tuân thủ nguyên tắc YAGNI mang lại một số lợi ích:

1. Cải thiện hiệu suất của nhà phát triển: Bằng cách tập trung vào chức năng thiết yếu, nhà phát triển có thể cung cấp các yêu cầu hiện tại một cách hiệu quả mà không lãng phí thời gian và công sức vào các tính năng suy đoán.
2. Cơ sở mã linh hoạt: Việc tránh các chức năng không cần thiết cho phép cơ sở mã linh hoạt hơn. Chúng ta không phải giải quyết các giải pháp dưới mức tối ưu đã được triển khai sớm và chúng ta có thể thích ứng với các yêu cầu thay đổi dễ dàng hơn.
3. Tối ưu hóa chi phí: Chỉ thực hiện những gì cần thiết sẽ giảm chi phí phát triển bằng cách tránh những công việc không cần thiết. Điều này có thể đặc biệt có giá trị khi thực hiện các dự án có nguồn lực hạn chế hoặc thời hạn chặt chẽ.

Hãy xem xét ví dụ sau trong java

Trong ví dụ này, lớp Author tuân theo nguyên tắc YAGNI bằng cách chỉ triển khai các thuộc tính và phương thức cần thiết. Bằng cách tránh các tính năng không cần thiết, chúng ta có thể giữ cho cơ sở mã của mình tập trung và hiệu quả.

Thực hiện nguyên tắc YAGNI

Để áp dụng nguyên tắc YAGNI một cách hiệu quả, điều cần thiết là phải ưu tiên các tính năng dựa trên mức độ cần thiết của chúng. Trước tiên, hãy tập trung vào việc cung cấp chức năng cốt lõi, đảm bảo chức năng đó đáp ứng yêu cầu và mang lại giá trị cho người dùng. Tránh thêm các tính năng dựa trên suy đoán hoặc nhu cầu trong tương lai mà hiện tại không cần thiết. Thường xuyên đánh giá lại các yêu cầu của dự án, thu thập phản hồi và điều chỉnh cho phù hợp. Bằng cách tuân theo phương pháp phát triển lặp đi lặp lại và lấy người dùng làm trung tâm, chúng tôi có thể đảm bảo rằng chúng tôi đang cung cấp những gì thực sự cần thiết.

Phần kết luận

Tóm lại, các nguyên tắc DRY, KISS và YAGNI đóng một vai trò quan trọng trong việc thúc đẩy mã sạch, dễ bảo trì và hiệu quả. Bằng cách loại bỏ sự trùng lặp mã, tận dụng sự đơn giản và tập trung vào chức năng thiết yếu, chúng ta có thể tạo ra các cơ sở mã dễ hiểu, duy trì và nâng cao hơn. Những nguyên tắc này đóng vai trò là nguyên lý hướng dẫn cho các nhà phát triển, giúp họ đưa ra quyết định sáng suốt và ưu tiên chất lượng cũng như tính hiệu quả của mã của họ. Khi kết hợp những nguyên tắc này vào quá trình phát triển của mình, chúng ta có thể thu được những lợi ích từ mã sạch hơn, đơn giản hơn và dễ bảo trì hơn.

Nguồn: https://www.linkedin.com/pulse/principles-clean-code-dry-kiss-yagni-rajnish-kumar