Có hai mô hình lập trình phổ biến là
imperative và
declarative, mỗi ngôn ngữ lại có thiên hướng theo một trong hai nhánh mô hình lập trình như hình mô tả dưới đây. Vậy thì JS thực sự nó theo thiên hướng nào?
View attachment 861437
Câu trả lời là:
"
JavaScript can function as both a procedural and an object oriented language" -
theo mozilla.org. Vậy chính xác JS thuộc họ nhà imperative. Nghĩa là chẳng dính dáng gì đến họ nhà declarative ấy thế mà chúng ta lại đi cố tình đưa các triết lý của declarative vào JS. Vậy chẳng lẽ là áp đặt và gượng ép? Quả thực là JS vốn không phải ngôn ngữ sinh ra đã hỗ trợ cho functional programming (FP). Nhưng sau nhiều lần tiến hóa thì đến nay JS đã có những cải tiến để tương thích với các faner của FP qua một loạt thay đổi từ ES6 điển hình là bổ sung
arrow function và const. Tóm lại lập trình FP trong JS nghĩa là ta sẽ bê nguyên các triết lý của mô hình FP với các hỗ trợ có sẵn của JS để triển khai. Mặc dù JS ngay đến bản ES6 này chỉ hỗ trợ lập trình FP tương đối nhưng với quan điểm cá nhân của tôi thì "
nó cũng ổn đấy"
Nhắc lại thế nào là lập trình FP:
Lập trình chức năng (Functional programming) là một dạng của lập trình khai báo nhưng có chiều sâu hơn nghĩa là trong lập trình FP thì bạn đưa bài toán cho máy tính giải quyết (cái vấn đề bạn cần), song song là ẩn chứa ra cách giải quyết (như thế nào) kèm theo đó là coi việc tính toán là việc triển khai các hàm toán học chủ đích là để thực thi chương trình và tránh các dữ liệu, các trạng thái, luồng chương trình bị thay đổi. FP được hình thành từ cơ sở toán học lambda calculus.
Vì đây là seri viết về JS nên tôi sẽ chỉ tóm tắt nhanh thế nào là lập trình FP thôi.cụ thể thì các bạn cần dành nhiều thời gian nghiên cứu.
Bạn có thể xem ví dụ dưới đây:
View attachment 861597
Khi bạn đưa triết lý FP vào JS nghĩa là bạn sẽ tạm biệt luôn những thứ dưới đây vốn rất quen thuộc với bạn:
- Loops
- while
- do...while
- for
- for...of
- for...in
- Variable declarations with var or let
- Void functions
- Object mutation.
- Array mutator methods
- copyWithin
- fill
- pop
- push
- reverse
- shift
- sort
- splice
- unshift
- Map mutator methods
- Set mutator methods
Thay vào đó là chúng ta sẽ sử dụng các hàm toán học để tung hứng, kết hợp và tạo ra luồng chạy cho chương trình. Ngầm chỉ dẫn cho máy tính thực hiện ý đồ lập trình của bạn và máy tính trả kết quả theo đúng kết quả bạn mong muốn.
Cụ thể, mời các bạn xem phần 2 nhé.