Code sạch nhà người ta: Viết hàm sạch

Author Avatar
Dev Nhà Người Ta Jul 23, 2017

Bài viết này nằm trong series “Code sạch nhà người ta” - là tập hợp những kinh nghiệm rút ra được từ quyển Clean Code nổi tiếng của Uncle Bob.

Trong bài này mình sẽ tóm tắt lại, trình bày một số thứ mà các Dev nhà người ta đã làm để viết, tổ chức các Hàm trong chương trình của họ tốt hơn, đẹp hơn và sạch hơn.

Ok, đi vào vấn đề luôn nhé, … sẽ có một số điều cần nhớ sau đây:

# Nhỏ

Nguyên tắc thứ nhất của hàm là nó nên nhỏ thôi. Nguyên tắc thứ hai là nó nên nhỏ hơn nữa 😃.
Một hàm nên có số lượng dòng code dưới 20 và dưới 150 kí tự trên mỗi dòng.
Nếu bạn có một hàm quá dài, hãy cố gắng làm nhỏ nó lại bằng cách tách ra các hàm con khác.

# Do One Thing: Làm một việc thôi

Một hàm chỉ nên làm một việc, và chỉ làm tốt việc đó thôi. Rõ ràng rồi, đừng viết một hàm kiểu lẩu thập cẩm, một hàm chỉ nên giải quyết một vấn đề thôi.

Xem xét ví dụ sau:

1
2
3
4
5
6
7
8
function emailClients(clients) {
clients.forEach((client) => {
const clientRecord = database.lookup(client);
if (clientRecord.isActive()) {
email(client);
}
});
}

Hàm emailClients trên đang làm nhiều hơn 1 việc, nó phải tìm record của client đó, kiểm tra active hay không sau đó mới gửi email nếu record đó active. Chúng ta có thể tách ra như sau:

1
2
3
4
5
6
7
8
9
10
function emailClients(clients) {
clients
.filter(isClientActive)
.forEach(email);
}
function isClientActive(client) {
const clientRecord = database.lookup(client);
return clientRecord.isActive();
}

# Đối số của hàm

Số lượng đối số lý tưởng cho một hàm là 0. Một hàm với 1 hoặc 2 đối số thì cũng có thể chấp nhận được, tuy nhiên lý tưởng nhất vẫn là một hàm không cần đối số.
Hàm với nhiều đối số sẽ làm cho code của bạn phức tạp hơn và khó để test được hơn, vì vậy hãy cố gắng gọi hàm với ít đối số nhất có thể.

Khi cần truyền nhiều hơn 2 hoặc 3 đối số, hãy cân nhắc sử dụng các cấu trúc khác để thay thế.

Ví dụ:

1
Circle makeCircle(Point center, double radius);

thì tốt hơn là

1
Circle makeCircle(double x, double y, double radius);

# Tránh ảnh hưởng phụ

Hàm chỉ làm gì đó hoặc trả lời thứ gì đó, nhưng không phải là cả hai nhé. Nếu một hàm làm nhiều hơn việc nhận giá trị đầu vào và trả về một hoặc nhiều giá trị, thì nghĩa là nó đang tạo ra những ảnh hưởng phụ (side effects). Những ảnh hưởng này có thể là ghi file, thay đổi biến toàn cục, ..

Ví dụ:

1
2
3
4
5
6
7
8
9
let name = 'Dev Nhà Mình';
function splitIntoFirstAndLastName() {
name = name.split(' ');
}
splitIntoFirstAndLastName();
console.log(name); // ['Dev', 'Nhà', 'Mình'];

Trong gọi hàm trên, biến toàn cục name đã bị thay đổi.
Ta sẽ refactor đoạn code đó như sau:

1
2
3
4
5
6
7
8
9
function splitIntoFirstAndLastName(name) {
return name.split(' ');
}
const name = 'Dev Nhà Mình';
const newName = splitIntoFirstAndLastName(name);
console.log(name); // 'Dev Nhà Mình';
console.log(newName); // ['Dev', 'Nhà', 'Mình'];

# Tên hàm có nghĩa

Đặt những tên có nghĩa. Xem thêm bài viết Đặt tên cho biến
Tên hàm nên là các Động từ hoặc cụm động từ, ví dụ như handleXYZ, getXYZ hay calculateABC

# DRY: khô thoáng

Điều cuối cùng, hãy giữ cho codebase của bạn khô thoáng mỗi ngày với.. DRY. DRY là viết tắt của cụm từ Don't Repeat Yourself - Đừng lặp lại những gì giống nhau.
Có một câu nói của bởi ai đó như thế này:

Code bị duplicate có thể là nguyên nhân của mọi sự rắc rối trong phần mềm.

Nếu muốn viết nhiều đoạn code khác nhau ở nhiều chỗ khác nhau thực hiện một công việc giống nhau, hãy viết một hàm chung sau đó gọi ở những chỗ chúng ta cần dùng thay vì copy paste ra nhiều chỗ khác nhau.

Hãy tưởng tượng bạn có 18 hàm tính số tiền khi mua hàng ở 18 nơi có thể trên một website thương mại. Bạn có nhu cầu sửa công thức tính tiền, bạn phải sửa cả 18 chỗ có hàm đó 😕, và sẽ ra sao nếu bạn làm thiếu? 😱..
Bởi vậy, ráng giữ khô thoáng nhé

Happy coding!

This blog is under a CC BY-NC-ND 4.0 License
Link to this article: https://devnhanguoita.com/posts/Code-sach-nha-nguoi-ta-Viet-ham-sach-hon/