Giải thích về pure function trong JavaScript

Pure Function (hàm thuần khiết) là gì và tại sao chúng ta lại cần quan tâm đến chúng?

Định nghĩa về pure function

  • Pure function luôn trả về kết quả giống nhau khi tham số truyền vào giống nhau. Nó không bị phụ thuộc bởi bất cứ trạng thái, dữ liệu hay thay đổi nào khi chương trình chạy mà chỉ phụ thuộc duy nhất vào tham số truyền vào.
  • Pure function không tạo ra những side effect đến chương trình ví dụ như gửi request, hay thay đổi dữ liệu bên ngoài phạm vi hoạt động của nó.

Observable side effects là gì?

Observable side effect là bất kỳ sự tương tác nào với bên ngoài từ bên trong hàm ví dụ như việc thay đổi giá trị biến ở bên ngoài hàm hay gọi hàm khác từ bên trong hàm (trừ khi hàm được gọi cũng pure).

Side effects có thể bao gồm các trường hợp sau:

  • Tạo HTTP request
  • Thay đổi dữ liệu
  • In dữ liệu ra console hay màn hình
  • Thao tác với DOM
  • Math.random()
  • Lấy thời gian hiện tại
  • ...

Ví dụ về Pure Function trong JavaScript

Ví dụ dưới đây tính giá sản phẩm đã bao gồm thêm thuế (10% VAT)

function priceAfterTax(productPrice) {
 return (productPrice * 0.1) + productPrice;
}

Hàm này không bị phụ thuộc vào biến bên ngoài, thay đổi dữ liệu hay sản sinh bất cứ side effect nào do đó hàm này được coi là pure. Nếu bạn chạy hàm này 1 triệu lần với tham số đầu vào không đổi ví dụ productPrice là 10 thì cả 1 triệu lần nó sẽ đều trả về cùng một kết quả là 11.

Cùng xét một ví dụ khác

var tax =  10;

function calculateTax(productPrice) {
 return (productPrice * (tax/100)) + productPrice; 
}

Hàm này vi phạm một điều đó trong định nghĩa về pure function đó là nó bị phụ thuộc vào biến tax bên ngoài nó, cho nên nó không thể coi là pure.

Tại sao Pure Functions lại quan trọng trong lập trình JavaScript?

Pure functions được sử dụng nhiều trong lập trình hàm. Những thư viện JS như ReactJS và Redux sử dụng pure function. Bạn cũng có thể gặp chúng ở bất kỳ đâu tuy nhiên không phải tất cả các hàm đều cần thiết phải pure. Một yếu tố khác cũng khuyến khích bạn viết pure functions khi có thể đó là khoản testing và refactoring. Đặc tính luôn trả về một kết quả với cùng một đầu vào giúp cho việc test trở nên dễ dàng hơn bao giờ hết. Trong khi đó, đặc tính không làm ảnh hưởng đến môi trường bên ngoài cũng giúp việc refactor code thuận lợi hơn bởi vì bạn luôn chắc chắn rằng những thay đổi bên trong pure function sẽ chẳng phương hại gì đến những phần code khác của bạn. Từ đây có thể thấy việc sử dụng pure function sẽ giúp cải thiện chất lượng code của bạn, giúp code clean hơn và hạn chế bug đáng kể.

Tham khảo

JavaScript: What Are Pure Functions And Why Use Them?