Pure function in javascript

Một trong những điều chúng ta được dạy khi bắt đầu tìm hiểu về redux là pure function hay khi tìm hiểu về component trong React ta có 1 rule đó là All React components must act like pure functions with respect to their props. Vậy nên hôm nay chúng ta sẽ tìm hiểu pure function là gì và tầm quan trọng của nó trong lập trình javascript. Let’s go !

Pure Function là gì ?

  • 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ó.

    Pure-functions

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.

Lợi ích của pure functions:

Nó không thay đổi trạng thái mà nằm bên ngoài scope của nó. Vì vậy bạn chỉ cần để ý giá trị khi gọi pure function trả về là gì.

Điều đó có nghĩa là bạn lúc nào cũng chỉ cần quan tâm đến input và output ra là gì. Nhưng với một chương trình thì việc có những hàm impure là không thể tránh khỏi nên chúng ta nên cố gắng hạn chế việc tạo ra các inpure functions ít nhất có thể vì bạn sẽ chắc chắn dễ dàng bảo trì dự án hơn.

Tóm tắt:

  • Pure function chỉ thao tác trên tham số truyền vào

  • Ít nhất 1 tham số

  • Luôn trả về giá trị

  • Trả về giá trị không đổi khi tham số không đổi

  • Không có side effects(tác dụng phụ)

2 Likes

Có recommend gì về khi nào sử dụng và cách áp dụng ko @Ashley_Ngo ?