Lập trình hàm phần 1 - Pure Function
Pure Function là gì?
Trong toán học, một hàm giống như một hộp đen nhận vào đầu vào và trả về đầu ra. Nhưng trong lập trình, mọi thứ phức tạp hơn nhiều. Chúng ta thường muốn hàm làm gì đó, như in ra màn hình, ghi dữ liệu vào file, truy cập cơ sở dữ liệu hay gọi API. Những hành động này không chỉ tính toán giá trị, mà còn tác động vào những thứ bên ngoài hàm.
Và đó là lý do khái niệm tính thuần khiết (purity) ra đời. Một hàm thuần (pure function) hoạt động giống như hàm toán học, nó chỉ tính toán giá trị dựa trên đầu vào và không gây ra bất kỳ tác dụng phụ (side effect) nào.
Vậy cụ thể, tác dụng phụ là gì? Một hàm được xem là có side effect nếu nó thực hiện bất kỳ hành động nào sau đây:
- Thay đổi trạng thái toàn cục (mutate global state), bao gồm cả các biến, property hay dữ liệu có thể được truy cập từ bên ngoài phạm vi của hàm.
- Thay đổi giá trị đầu vào (mutate input arguments).
- Throw exceptions (vì điều này tạo ra sự không xác định trong flow của ứng dụng).
- Thực hiện I/O như đọc/ghi file, in ra console, truy cập cơ sở dữ liệu hoặc gọi API.
Nhờ tính xác định (deterministic), tức là cùng một đầu vào sẽ luôn cho ra cùng một kết quả nên các hàm thuần rất dễ kiểm thử, dễ dự đoán và dễ tối ưu hóa.
Một số kỹ thuật có thể tận dụng đặc tính này bao gồm:
- Parallelization – thực thi nhiều hàm đồng thời mà không sợ xung đột.
- Lazy evaluation – chỉ tính toán khi thật sự cần.
- Memoization – lưu lại kết quả để không phải tính lại lần sau.