Động Lực
Nếu bạn mất hơn 3 giây để hiểu hàm của mình đang làm gì, đây chính là dấu hiệu để bạn xem xét tái cấu trúc nó. Chất lượng của hàm tỉ lệ nghịch với thời gian cần thiết để hiểu chúng.
Những hàm phức tạp có thể dẫn đến lỗi, làm cho việc thay đổi trở nên khó khăn và làm chậm quá trình thích ứng của các lập trình viên khác. Hãy nhớ rằng, mã nguồn thường được đọc nhiều hơn là viết, vì vậy đầu tư thời gian vào việc viết các hàm sạch sẽ là một trong những khoản đầu tư đắt giá nhất mà bạn có thể thực hiện trong lâu dài.
Dưới đây là 7 mẹo giúp bạn viết hàm sạch hơn.
1. Giữ cho hàm của bạn nhỏ
Uncle Bob từng nói:
Quy tắc đầu tiên của các hàm là chúng nên nhỏ. Quy tắc thứ hai là chúng nên nhỏ hơn nữa.
Một hàm nên làm một nhiệm vụ và làm tốt việc đó. Kích thước lý tưởng của một hàm không có quy tắc cứng nhắc nào. Đôi khi 5 dòng là đủ, đôi khi 50 dòng là cần thiết để đảm bảo một trách nhiệm duy nhất.
Tốt nhất là bạn nên sử dụng phán đoán của mình dựa trên ngữ cảnh. Bạn hãy thực dụng, đừng cứng nhắc. Hãy cố gắng viết các hàm nhỏ gọn nhưng không tạo ra quá nhiều hàm gây rối cho mã nguồn của bạn.
2. Đặt tên cho hàm một cách hợp lý
Tôi gặp vấn đề với các hàm được đặt tên kém hàng tuần. Trái ngược với suy nghĩ phổ biến rằng việc đặt tên cho hàm không khó, thực tế nó đòi hỏi sự nỗ lực, thử nghiệm và tinh chỉnh liên tục.
Dưới đây là 4 mẹo tôi sử dụng để đặt tên cho các hàm của mình:
- Sử dụng tên tiết lộ ý định liên quan đến lĩnh vực kinh doanh. Nếu mã nguồn của bạn không sử dụng ngôn ngữ của khách hàng, bạn không tập trung vào vấn đề của họ.
- Sử dụng động từ hoặc cụm động từ. Tên hàm bằng danh từ hoặc tính từ có thể gây nhầm lẫn vì không thể hiện rõ chức năng.
- Thống nhất quy ước đặt tên trong nhóm của bạn.
- Đừng sử dụng nhiều thuật ngữ khác nhau cho cùng một khái niệm, điều này khiến mã của bạn mất tính nhất quán.
3. Giới hạn số lượng tham số
Số lượng tham số lý tưởng cho một hàm là 0. Việc có quá nhiều tham số làm tăng độ phức tạp và khó kiểm thử hơn.
Hãy cố gắng giới hạn tối đa là 3 tham số cho mỗi hàm. Một giải pháp tốt cho vấn đề này là nhóm các tham số có liên quan lại với nhau.
4. Giảm độ lồng ghép với việc trả giá trị sớm
Tránh sử dụng các câu lệnh IF
lồng nhau trong một hàm. Chúng làm tăng độ phức tạp và giảm tính duy trì.
Thay vào đó, hãy đảo ngược các điều kiện và sử dụng điều kiện bảo vệ (guard clauses) để giúp mã dễ dàng theo dõi hơn và loại bỏ các câu lệnh ELSE
.
5. Viết hàm tinh khiết không tác động phụ
Hàm tinh khiết là gì? Một hàm được coi là tinh khiết nếu nó luôn tạo ra đầu ra giống nhau với đầu vào giống nhau và không có tác động phụ. Điều này có nghĩa là đầu ra chỉ phụ thuộc vào đầu vào mà không có các hành vi ẩn.
Có 3 lợi ích chính của hàm tinh khiết:
- Mã trở nên dễ dự đoán hơn.
- Dễ kiểm thử hơn.
- Có thể chạy song song.
Bạn biết bạn đang làm việc với mã sạch khi mọi hàm bạn đọc đều làm đúng những gì bạn mong đợi. Các hàm tinh khiết giúp mã của bạn trở nên sạch hơn.
6. Tránh tham số kiểu boolean flag
Việc sử dụng biến kiểu boolean
làm tham số thường dẫn đến mã khó hiểu. Có hai vấn đề chính với điều này:
- Thứ nhất, khi gọi hàm với cờ true hoặc false, không rõ giá trị đó có ý nghĩa gì.
- Thứ hai, khó mở rộng hành vi liên quan đến các cờ đó.
Thay vì sử dụng boolean, hãy sử dụng Enums
để làm cho mã của bạn dễ hiểu hơn. Điều chỉnh nhỏ nhưng có tác động lớn.
7. Sử dụng comment một cách hợp lý
Khi một hàm trở nên khó hiểu, đừng cố gắng cải thiện nó bằng cách thêm comment. Comment thường là dấu hiệu của mã nguồn kém.
- Comment dễ lỗi thời.
- Comment thường thừa thãi.
- Nhiều lập trình viên lười đọc comment.
Comment tốt để giải thích WHY, nhưng nên là phương án cuối cùng để giải thích WHAT. Trong hầu hết các trường hợp, bạn có thể thay thế comment bằng cách sử dụng tên hàm thích hợp.
Hãy nhớ rằng: Một tên hàm mô tả dài còn tốt hơn một comment mô tả dài.
Tóm tắt
Chúng ta dành gấp 10 lần thời gian để đọc mã nguồn so với viết mã. Việc viết các hàm sạch sẽ là một trong những cách mạnh mẽ nhất để tạo ra mã nguồn dễ đọc.
Nhớ rằng: Lập trình không chỉ là nói cho máy tính phải làm gì, mà còn là nói cho một lập trình viên khác biết bạn muốn máy tính làm gì.
Mỗi dòng mã bạn viết là một thông điệp gửi đến đồng nghiệp của bạn. Hãy tạo ra mã rõ ràng, ngắn gọn và thuyết phục.
Bonus: Nâng cấp kỹ thuật tạo tham số trong hàm
Ví dụ, có một task nhỏ: Tạo một hàm in ra thông tin người dùng. Chúng ta sẽ áp dụng 3 kỹ thuật tạo tham số trong hàm dưới đây.
Kỹ thuật Truyền Thống
js
function printPerson(name, age = 24, address = 'Hà Nội') {
console.log(name, age, address)
}
printPerson('pdthien') // pdthien, 24, Hà Nội
Khi hàm đã được gọi nhiều nơi, việc thêm tham số mới cần xử lý cẩn trọng để không ảnh hưởng đến project.
Kỹ thuật "Bỏ trứng vào cùng 1 giỏ"
Tạo ra 1 object chứa các tham số truyền vào hàm.
js
const info = { name: 'pdthien' }
function printPerson(info) {
const { name, age = 24, address = 'Hà Nội' } = info
console.log( name, age, address)
}
printPerson(info) // pdthien, 24, Hà Nội
Kỹ thuật Destructuring
js
function printPerson({ name, age = 24, address = 'Hà Nội' }) {
console.log(name, age, address)
}
printPerson({ name: 'pdthien' }) // pdthien, 24, Hà Nội
Kỹ thuật rest và spread
Sử dụng kỹ thuật này khi hàm không biết rõ số lượng tham số truyền vào.
js
function sum(...params) {
let total = 0;
params.forEach(param => total += param);
return total;
}
const array = [1, 1, 2, 3, 5, 8];
console.log(sum(...array)); // Sử dụng spread
source: viblo