Hành trình vạn dặm bắt đầu từ một bước chân, và thế giới lập trình cũng vậy. Trước khi xây dựng những phần mềm phức tạp, bạn cần nắm vững các khái niệm cốt lõi. Một trong những “viên gạch” nền tảng quan trọng nhất chính là **hàm (function/method)**.
Nếu bạn từng thắc mắc làm thế nào các lập trình viên có thể viết hàng nghìn, thậm chí hàng triệu dòng code mà vẫn giữ được sự ngăn nắp, dễ hiểu, thì câu trả lời phần lớn nằm ở việc sử dụng hàm một cách hiệu quả. Trong bài viết này, The Blogs News sẽ cùng bạn “giải phẫu” khái niệm hàm một cách đơn giản và trực quan nhất, giúp bạn tự tin hơn trên con đường chinh phục những dòng code đầu tiên.
Hàm (function) trong lập trình là gì? Một ví dụ dễ hình dung
Hãy tạm quên đi những thuật ngữ kỹ thuật khô khan. Tưởng tượng bạn đang muốn làm một ly sinh tố bơ. Quy trình của bạn sẽ là:
- Đầu vào (Nguyên liệu): 1 quả bơ, một ít sữa đặc, sữa tươi và đá viên.
- Xử lý (Hành động): Bạn cho tất cả nguyên liệu vào máy xay sinh tố, đậy nắp và nhấn nút. Chiếc máy sẽ bắt đầu xay nhuyễn hỗn hợp.
- Đầu ra (Thành phẩm): Một ly sinh tố bơ thơm ngon, mát lạnh.
Trong lập trình, một **hàm (function)** hoạt động y hệt như chiếc máy xay sinh tố kia. Nó là một khối mã được đặt tên, được tạo ra để thực hiện một công việc cụ thể.
Cụ thể hơn:
- Đầu vào của hàm được gọi là tham số (parameters/arguments). Đây là dữ liệu bạn cung cấp cho hàm để nó xử lý, giống như bạn cho bơ, sữa, đá vào máy xay.
- Khối mã xử lý bên trong được gọi là thân hàm (function body). Đây là nơi các chỉ thị, lệnh được thực thi, tương tự cơ chế hoạt động của lưỡi dao và động cơ máy xay.
- Kết quả đầu ra mà hàm tạo ra được gọi là giá trị trả về (return value), chính là ly sinh tố thành phẩm của chúng ta.

Tóm lại, hàm là một khối code có tổ chức, có thể tái sử dụng, được thiết kế để thực hiện một tác vụ duy nhất. Mỗi khi bạn cần thực hiện tác vụ đó, thay vì viết lại toàn bộ các bước, bạn chỉ cần “gọi” tên của hàm và cung cấp cho nó những “nguyên liệu” cần thiết.
Tại sao hàm lại là “xương sống” của mọi chương trình?
Việc sử dụng hàm không chỉ là một lựa chọn, mà là một yêu cầu bắt buộc để xây dựng các phần mềm chuyên nghiệp. Nó mang lại vô số lợi ích mà bất kỳ lập trình viên nào cũng phải công nhận.
1. Khả năng tái sử dụng mã (Code Reusability)
Đây là lợi ích lớn nhất. Hãy tưởng tượng bạn đang viết một chương trình cần tính diện tích hình tròn ở 10 vị trí khác nhau trong code. Nếu không có hàm, bạn sẽ phải viết đi viết lại công thức diện_tích = 3.14 * bán_kính * bán_kính 10 lần. Điều này không chỉ tốn thời gian mà còn tiềm ẩn rủi ro sai sót. Nhưng với hàm, bạn chỉ cần tạo một hàm duy nhất tên là tinhDienTichHinhTron(banKinh). Sau đó, ở 10 vị trí kia, bạn chỉ cần gọi tên hàm này ra và truyền vào bán kính tương ứng. Nhanh, gọn và chính xác.
2. Giúp chương trình có tổ chức và dễ đọc hơn
Một chương trình lớn có thể được chia thành nhiều hàm nhỏ, mỗi hàm đảm nhận một chức năng riêng biệt. Ví dụ, trong một trang web bán hàng, thay vì viết tất cả code vào một file, bạn có thể chia ra thành các hàm như: hienThiSanPham(), themVaoGioHang(), xuLyThanhToan(), kiemTraDangNhap()… Điều này làm cho code của bạn giống như một cuốn sách được chia thành nhiều chương, mục rõ ràng, giúp người khác (và cả chính bạn trong tương lai) dễ dàng đọc hiểu và nắm bắt luồng hoạt động của chương trình.

3. Dễ dàng bảo trì và gỡ lỗi (Debugging)
Quay lại ví dụ tính diện tích hình tròn. Giả sử sau này bạn muốn dùng số Pi chính xác hơn (ví dụ: 3.14159) thay vì 3.14. Nếu không dùng hàm, bạn sẽ phải tìm và sửa lại ở cả 10 nơi. Rất có thể bạn sẽ bỏ sót một vài chỗ. Nhưng nếu bạn đã đóng gói logic đó vào hàm tinhDienTichHinhTron(), bạn chỉ cần sửa lại công thức bên trong thân hàm một lần duy nhất. Mọi nơi gọi đến hàm này sẽ tự động được cập nhật. Tương tự, khi chương trình có lỗi, việc chia nhỏ chương trình thành các hàm giúp bạn khoanh vùng và xác định nguyên nhân gây lỗi nhanh hơn rất nhiều.
4. Tính trừu tượng (Abstraction)
Khi bạn sử dụng máy xay sinh tố, bạn chỉ cần biết cho nguyên liệu vào và nhấn nút, bạn không cần quan tâm động cơ bên trong nó quay như thế nào, lưỡi dao được làm bằng chất liệu gì. Hàm trong lập trình cũng vậy. Nó che giấu đi sự phức tạp của việc triển khai bên trong. Người sử dụng hàm chỉ cần biết hàm đó tên gì, cần cung cấp đầu vào ra sao và sẽ nhận được kết quả gì, mà không cần bận tâm đến việc nó thực hiện các bước đó như thế nào.
“Giải phẫu” một hàm: Các thành phần cơ bản
Mặc dù cú pháp có thể khác nhau đôi chút giữa các ngôn ngữ lập trình (như Python, JavaScript, C++, Java…), một hàm thường có các thành phần cốt lõi sau:

- Từ khóa khai báo hàm: Dấu hiệu để ngôn ngữ lập trình biết rằng bạn đang định nghĩa một hàm. Ví dụ:
functiontrong JavaScript,deftrong Python. - Tên hàm (Function Name): Tên bạn đặt cho hàm. Tên này nên mang tính gợi nhớ, mô tả rõ chức năng của hàm. Ví dụ:
calculateSum,getUserInfo. - Danh sách tham số (Parameter List): Đặt trong cặp dấu ngoặc đơn
(). Đây là nơi bạn định nghĩa các “khe cắm” đầu vào cho hàm. Nếu hàm không cần đầu vào, bạn vẫn phải để cặp ngoặc đơn rỗng. - Thân hàm (Function Body): Nằm trong cặp dấu ngoặc nhọn
{}(ở nhiều ngôn ngữ) hoặc được thụt lề (trong Python). Đây là nơi chứa các dòng lệnh thực hiện tác vụ của hàm. - Câu lệnh trả về (Return Statement): Dùng từ khóa
returnđể trả kết quả xử lý của hàm ra bên ngoài. Một hàm có thể không có câu lệnhreturn, khi đó nó chỉ thực hiện một hành động nào đó mà không trả về giá trị (ví dụ: hàm in một thông báo ra màn hình).
Hãy xem một ví dụ cực kỳ đơn giản bằng JavaScript:
// 1. Khai báo hàm
function tinhTong(soA, soB) { // function là từ khóa, tinhTong là tên hàm, (soA, soB) là tham số
// Thân hàm bắt đầu
let ketQua = soA + soB; // Thực hiện phép tính cộng
return ketQua; // Trả về kết quả
// Thân hàm kết thúc
}
// 2. Gọi hàm và sử dụng kết quả
let tong = tinhTong(5, 10); // Gọi hàm với đầu vào là 5 và 10
console.log(tong); // Sẽ in ra màn hình số 15Hàm (Function) và Phương thức (Method): Có gì khác biệt?
Khi tìm hiểu về lập trình, đặc biệt là lập trình hướng đối tượng (OOP), bạn sẽ thường nghe đến cả hai thuật ngữ “hàm” và “phương thức”. Vậy chúng có khác nhau không? Câu trả lời là có, nhưng sự khác biệt khá tinh tế.
Về cơ bản, **một phương thức là một hàm thuộc về một đối tượng (object)**.
- Hàm (Function) có thể tồn tại độc lập, không cần thuộc về đối tượng nào. Ví dụ hàm
tinhTong()ở trên. - Phương thức (Method) thì luôn gắn liền với một đối tượng và thường dùng để thực hiện hành động hoặc truy xuất/thay đổi trạng thái của đối tượng đó.

Hãy lấy ví dụ về đối tượng xeHoi:
let xeHoi = {
hangSanXuat: "Vinfast",
mauSac: "Đỏ",
// Đây là một phương thức, vì nó thuộc về đối tượng xeHoi
chay: function() {
console.log("Xe đang chạy...");
}
};
// Để gọi phương thức, bạn phải thông qua đối tượng
xeHoi.chay(); // In ra "Xe đang chạy..."Trong ví dụ này, chay() là một phương thức của đối tượng xeHoi. Bạn không thể gọi chay() một cách độc lập mà phải gọi thông qua xeHoi.chay(). Nói một cách đơn giản, mọi phương thức đều là hàm, nhưng không phải hàm nào cũng là phương thức.
Những ví dụ thực tế về hàm trong cuộc sống hàng ngày
Hàm hiện diện ở khắp mọi nơi trong các ứng dụng bạn sử dụng mỗi ngày. Mỗi hành động của bạn trên một trang web hay ứng dụng di động đều có khả năng kích hoạt một hoặc nhiều hàm chạy ngầm.
- Nút “Đăng nhập”: Khi bạn điền email, mật khẩu và nhấn nút, một hàm như
kiemTraThongTinDangNhap(email, password)sẽ được gọi. Hàm này nhận email và mật khẩu của bạn, xử lý việc kiểm tra trong cơ sở dữ liệu và trả về kết quả là đăng nhập thành công hay thất bại. - Nút “Thích” trên mạng xã hội: Nhấn nút “Thích” sẽ gọi một hàm kiểu
tangLuotThich(idBaiViet), hàm này sẽ gửi yêu cầu lên máy chủ để cập nhật số lượt thích cho bài viết tương ứng. - Tìm kiếm sản phẩm: Khi bạn gõ tên sản phẩm vào ô tìm kiếm và nhấn Enter, một hàm
timKiemSanPham(tuKhoa)được kích hoạt, lấy từ khóa bạn nhập, truy vấn dữ liệu và trả về danh sách các sản phẩm phù hợp.
Hàm – Viên gạch nền móng cho mọi Lập trình viên
Hiểu và vận dụng thành thạo hàm là một trong những kỹ năng cơ bản và quan trọng nhất đối với bất kỳ ai muốn theo đuổi con đường lập trình. Nó không chỉ là một khái niệm lý thuyết mà là công cụ bạn sẽ sử dụng hàng ngày để xây dựng nên những chương trình có cấu trúc tốt, dễ bảo trì và mở rộng.
Đừng nản lòng nếu ban đầu bạn cảm thấy hơi bối rối. Hãy bắt đầu bằng cách viết những hàm thật đơn giản, ví dụ như hàm cộng hai số, hàm kiểm tra một số là chẵn hay lẻ. Càng thực hành nhiều, bạn sẽ càng thấy được sức mạnh và vẻ đẹp của việc phân chia một vấn đề lớn thành những khối chức năng nhỏ và có thể quản lý được. Chúc bạn thành công trên hành trình viết code của mình!






Leave a Comment