Lập trình chức năng(Functional Programming – FP) là một tiến trình tạo nên một phần mềm bằng cách kết hợp các pure function, và tránh chia sẻ states, mutable data, side-effect. Lập trình chức năng là declarative, chứ không phải imperative. Những biến(state), dữ liệu sẽ kết nối thông qua những pure function. Khác với lập trình hướng đối tượng, khi mà các biến(state) thường được truy xuất và chia sẻ bên trong các phương thức(method) của đối tượng.
Lập trình chức năng là một trong những mô hình của lập trình. Một mô hình bao gồm các khái niệm, tiêu chuẩn, nguyên tắc để xây dựng nên một phần mềm. Những mô hình khác bao gồm lập trình hướng đối tượng(OOP), lập trình thủ tục(procedural programming).
Một trong những cái khó là bạn có thể chưa quen với những thuật ngữ mới trong Functional Programming như:
-Pure function(Hàm thuần khiết)
-Function composition(Sự kết hợp các hàm với nhau)
-Avoid shared state(Tránh chia sẻ biến)
-Avoid mutating state(Tránh thay đổi biến)
-Avoid side effects(Tránh hiệu ứng phụ)
Để hiểu rõ hơn về FP thì chúng ta phải nắm được những khái niệm này.
Pure Function(Hàm thuần khiết)
Một pure function là một hàm có:
-Với các inputs giống nhau, luôn cho ra một output giống nhau, và
-Không có hiệu ứng phụ(side-effects)
Function Composition(Sự tổng hợp của các hàm)
Đó là một tiến trình kết hợp hai hay nhiều hàm để tạo nên hàm mới hoặc thực hiện một nhiệm vụ gì đó.
Hiểu được function composition là một bước quan trọng để hiểu phần mềm được xây dựng sử dụng Functional Programming như thế nào.
Shared State(Biến chia sẻ)
Shared state là bất cứ các biến, đối tượng, hoặc không gian bộ nhớ mà chúng tồn tại trong một pham vi được chia sẻ(shared scope). Một shared scope bao gồm scope toàn cục và scope closure. Chúng được dùng chung quá nhiều nơi và rất khó để biết hàm nào đã làm thay đổi biến đó. Các hàm không nên chia sẻ nhau giữa các biến, dữ liệu.
Ví dụ như bạn với vợ/chồng bạn dùng chung điện thoại(state) với nhau. Mỗi khi bạn vào sử dụng điện thoại bạn lại khá bực mình vì bạn không thích bật màn hình điện thoại quá sáng hay ai đã cài ứng dụng gì đó vô máy bạn. Tóm lại điện thoại(state) được chia sẻ nên bạn cũng như chồng/vợ của bạn điều khó chịu, không hiểu những cài đặt đó là do đâu, …
Kết quả có thể khác nhau nếu chúng ta đổi thứ tự của các hàm với những biến chia sẻ(hay dùng chung với nhau).
Cùng xem một ví dụ sau nhé:
// With shared state, the order in which function calls are made // changes the result of the function calls. const x = { val: 2 }; const x1 = () => x.val += 1; const x2 = () => x.val *= 2; x1(); x2(); console.log(x.val); // 6 //This example is exactly equivalent to the above, except... const y = { val: 2 }; const y1 = () => y.val += 1; const y2 = () => y.val *= 2; // ...the order of the function calls is reversed... y2(); y1(); // ... which changes the resulting value: console.log(y.val); // 5
Side Effects
A side effect(hiệu ứng phụ) là tất cả những thay đổi của state trong ứng dụng mà nó nằm bên ngoài hàm đang thực thi. Side effect bao gồm:
-Thay đổi biến bên ngoài và thuộc tính của đối tượng(global variable, parent scope chain)
-Console
-Ghi lên file
FP trong Javascript
Trong JS chúng ta có thể lập trình kết hợp giữa hai mô hình FP và OOP. Chúng tồn tại song song và một trong những cách đơn giản sử dụng FP trong JS đó là:
- Sử dụng các built-in FP như: filter, map, reduce, find,… trong Array prototype
- Bạn cũng có thể viết một FP để reuse cho app của bạn
- Bạn có thể tham khảo cách sử dụng FP của Lodash, React, Redux.
Xem thêm những thủ thuật xịn cho Javascript tại Youtube của tôi.