Giới thiệu functional programming trong JavaScript

Functional Programming ? Là cái gì? Tại sao dùng? Dùng như thế nào?

Các bạn có từng hoảng loạn như mình khi phải nghe hàng loạt thuật ngữ sau không

stateless, compose, pure, side effect, ramda, lazy, immuable, curry, functor, monad, monoid, higher-order, referential transparency

Functional Programming là gì ? (dân tình hay viết tắt là FP)

Functional Programming nó là một thuật ngữ mà hiểu theo kiểu bình dân là một style-phong cách-kiểu viết code.

Khi nói đến style thì bắt buộc phải có một số đặc thù nhất định để phân biệt với các style khác. Chút nữa sẽ nói cụ thể.

Không chỉ có JS mà một số ngôn ngữ lập trình khác cũng hỗ trợ style này

  • F#
  • Haskell
  • Erlang
  • JS ( tất nhiên )
  • Elm
  • Scala
  • Ocaml
  • Clojure

Ngoài trước FP, nếu các bạn học cùng thời với mình thì sẽ được dạy Object Oriented Programming

Một thuật ngữ các bạn cũng sẽ hay gặp là programming paradigm, có thể hiểu bình dâncách chúng ta nhìn nhận mọi thứ vận hành, cách mà chương trình sẽ kết nối và hoạt động với nhau (mindset nếu muốn dùng thuật ngữ hoa mỹ)

Một số programming paradigm liên quan

Nhóm 1 Nhóm 2
Imperative: tập các lệnh được đưa ra theo thứ tự cố định Declarative: tui muốn cái này, bạn làm sao đưa ra kết quả như mong muốn
Object-Oriented: imperative cool, nhưng nếu có nhiều state và phải quản lý toàn bộ nó, hãy chia nó ra thành từng object làm nhiệm vụ quản lý state này và chương trình là sự kết hợp các object truyền/nhận thông tin Functional: một dạng sub-paradigm (con cùng cha chú) với declarative

Ý tưởng FP không qua cao siêu, chỉ gói gọn trong một câu

Pure Function: chỉ phụ thuộc vào input truyền vào, chỉ trả về output không làm gì khác cả

Ví dụ, một function như thế này không được xem là Pure Function

var name = "Andy";

function greet() {
    console.log("Hello, " + name + "!")
}

greet(); // Hello, Andy!

name = "luckyluu"
greet(); // Hello, luckyluu!

Nó vi phạm 2 nguyên tắc, một là phụ thuộc vào một biến bên ngoài, 2 là nó không trả về mà làm thay đổi một thứ bên ngoài (ở đây là log ra một giá trị).

Tại sao lại sử dụng FP?

Predictable/Safer

Chúng ta có thể hoàn toàn tin tưởng vào pure function, nó chỉ làm đúng việc cần làm và không ảnh hưởng đến hàng xóm. Chắc chắn là ít có những có bug mà ai cũng không ngờ tới

Dễ test/debug

Những gì bạn cần test trên một Pure Function là đưa vào input và kiểm tra output. Ví dụ mà bạn nhận được một output sai, kiểm tra input đã đúng hết thì bạn sẽ biết ngay vấn đề nằm ở trong function đó, hãy nhớ Pure Function chỉ phụ thuộc vào input, không có side effect thì làm gì đổ lỗi được.

Ngoài ra theo quan điểm cá nhân thì việc sử dụng FP cũng giúp chúng ta copy-paste code giữa nhiều dự án dễ dàng hơn

Còn nếu bạn đang sử dụng FP vì những lý do sau, thì mình khuyên bạn không nên tin vào điều này

  • Những người sử dụng FP trông cool/ngầu hơn những người tiền bối sử dụng Object Oriented
  • Đây là paradigm xịn sò nhất ở thì hiện tại

Nói chung FP cũng chỉ là một trong những paradigm trong lập trình, sẽ có điểm mạnh và điểm yếu riêng.

Tại sao lại sử dụng FP với JavaScript?

Khi bắt đầu học và sử dụng JS để viết object-oriented chúng ta đều nhận ra một điều rằng: JS không phải sinh ra để viết object-oriented.

Bạn sẽ thấy nhan nhản các câu hỏi tricky trong JavaScript về prototype , this trong các buổi phỏng vấn, qua chi là khó để làm việc và hiểu được thực những thứ như vậy trong javascript, chúng ta sẽ kỳ vọng nó làm việc như thế này, nhưng JS lại không làm như chúng nghĩ.

Đã bao nhiêu lần bạn bị dính bug liên quan tới this

Dù cho bạn là chuyên gia lập trình cấp cao, chắc cũng bao lần mệt mỏi với this

Và nếu bạn sử dụng FP mọi thứ nhức đầu đó sẽ không còn là vấn đề quan tâm.

Ngoài ra có khá nhiều thư viện/công cụ trong cộng đồng javascript xây sẵn để chúng ta xào món FP này nhanh nhất có thể

Viết FP như thế nào?

Mình đã có 2 bài viết cho chủ đề này, các bạn có thể đọc lại

Nguyên lý nền tảng của lập trình function

Functional programing nên và không nên

Một số thư viện để bạn viết FP một cách gọn gàn, sạch sẽ, thơm tho

Tài liệu tham khảo

https://codewords.recurse.com/issues/one/an-introduction-to-functional-programming

https://www.youtube.com/watch?v=qtsbZarFzm8&list=WL&index=7&t=0s