Lập trình chức năng là gì?
⚡ Tóm tắt thông minh
Lập trình hàm là một phương pháp xây dựng phần mềm bằng cách kết hợp các hàm thuần túy, tránh sử dụng trạng thái chia sẻ và dữ liệu có thể thay đổi. Nó nhấn mạnh vào biểu thức hơn là câu lệnh, do đó đầu ra của một hàm chỉ phụ thuộc vào đầu vào của nó, điều này làm cho chương trình dễ dự đoán và dễ kiểm thử.

Lập trình chức năng là gì?
Lập trình hàm (còn gọi là FP) là một cách tư duy về xây dựng phần mềm bằng cách tạo ra các hàm thuần túy. Nó tránh các khái niệm về trạng thái chia sẻ và dữ liệu có thể thay đổi được thường thấy trong lập trình hướng đối tượng.
Ngôn ngữ lập trình chức năng nhấn mạnh vào biểu thức và khai báo hơn là việc thực thi các câu lệnh. Do đó, không giống như các thủ tục khác phụ thuộc vào trạng thái cục bộ hoặc toàn cục, giá trị đầu ra trong lập trình chức năng chỉ phụ thuộc vào các đối số được truyền cho hàm.
Đặc điểm của lập trình chức năng
- Phương pháp lập trình hàm tập trung vào kết quả, chứ không phải quy trình.
- Trọng tâm là vào những gì cần được tính toán.
- Dữ liệu là bất biến.
- Lập trình hàm phân rã vấn đề thành các hàm.
- Nó được xây dựng dựa trên khái niệm về các hàm toán học sử dụng biểu thức điều kiện và đệ quy để thực hiện phép tính.
- Nó không hỗ trợ các câu lệnh lặp như vòng lặp và các câu lệnh điều kiện như If-Else.
Lịch sử lập trình hàm
- Nền tảng của Lập trình Chức năng là Phép tính Lambda. Nó được phát triển vào những năm 1930 để ứng dụng, định nghĩa và đệ quy trong lập trình chức năng.
- LISP là ngôn ngữ lập trình hàm đầu tiên. McCarthy đã thiết kế nó vào năm 1960.
- Vào cuối những năm 70, các nhà nghiên cứu tại Đại học Edinburgh đã định nghĩa ML (Ngôn ngữ siêu hình).
- Vào đầu những năm 80, ngôn ngữ Hope đã bổ sung các kiểu dữ liệu đại số để hỗ trợ đệ quy và suy luận bằng phương trình.
- Năm 2004, ngôn ngữ lập trình chức năng 'Scala' được ra đời.
Ngôn ngữ lập trình chức năng
Mục tiêu của bất kỳ ngôn ngữ lập trình hàm nào là mô phỏng các hàm toán học. Tuy nhiên, quá trình tính toán cơ bản trong lập trình hàm lại khác.
Dưới đây là một số ngôn ngữ lập trình hàm nổi bật nhất:
- Haskell
- SML
- Clojure
- Scala
- nhị lang
- Làm sạch
- F#
- ML/OCaml Lisp / Lược đồ
- XSLT
- SQL
- Toán học
Thuật ngữ lập trình hàm cơ bản và Concepts
Dữ liệu bất biến
Dữ liệu bất biến có nghĩa là bạn có thể dễ dàng tạo ra các cấu trúc dữ liệu mới thay vì chỉnh sửa những cấu trúc đã tồn tại.
Tính minh bạch tham chiếu
Các chương trình lập trình hàm nên thực hiện các thao tác như thể đó là lần đầu tiên. Vì vậy, bạn sẽ biết điều gì có thể hoặc không thể xảy ra trong quá trình thực thi chương trình, và các tác dụng phụ của nó. Trong thuật ngữ lập trình hàm, điều này được gọi là tính minh bạch tham chiếu.
Mô đun
Thiết kế dạng mô-đun giúp tăng năng suất. Các mô-đun nhỏ có thể được lập trình nhanh chóng và có khả năng tái sử dụng cao hơn, điều này chắc chắn dẫn đến việc phát triển chương trình nhanh hơn. Bên cạnh đó, các mô-đun có thể được kiểm thử riêng biệt, giúp giảm thời gian dành cho kiểm thử đơn vị và gỡ lỗi.
Khả năng bảo trì
Khả năng bảo trì là một thuật ngữ đơn giản, có nghĩa là lập trình hàm (FP) dễ bảo trì hơn, vì bạn không cần phải lo lắng về việc vô tình thay đổi bất cứ điều gì bên ngoài hàm đã cho.
Chức năng hạng nhất
"Hàm hạng nhất" là một định nghĩa được gán cho các thực thể ngôn ngữ lập trình không có bất kỳ hạn chế nào về cách sử dụng. Do đó, các hàm hạng nhất có thể xuất hiện ở bất kỳ đâu trong chương trình.
Đóng cửa
Closure là một hàm bên trong có thể truy cập các biến của hàm cha, ngay cả sau khi hàm cha đã thực thi xong.
Các hàm bậc cao hơn
Các hàm bậc cao hơn lấy các hàm khác làm đối số hoặc trả về chúng dưới dạng kết quả.
Các hàm bậc cao cho phép áp dụng từng phần hoặc kỹ thuật currying. Kỹ thuật này áp dụng một hàm cho các đối số của nó từng cái một, mỗi lần áp dụng trả về một hàm mới chấp nhận đối số tiếp theo.
Hàm thuần túy
'Hàm thuần túy' là hàm có đầu vào được khai báo là đầu vào và không có hàm nào bị ẩn. Các đầu ra cũng được khai báo là đầu ra.
Các hàm thuần túy hoạt động trên các tham số của chúng. Chúng không hiệu quả nếu không trả về bất kỳ giá trị nào. Hơn nữa, chúng luôn cho ra cùng một kết quả với các tham số đã cho.
Ví dụ:
Function Pure(a,b) { return a+b; }
Hàm không tinh khiết
Hàm không thuần túy hoàn toàn trái ngược với hàm thuần túy. Chúng có các đầu vào hoặc đầu ra ẩn, và đó là lý do tại sao chúng được gọi là hàm không thuần túy. Hàm không thuần túy không thể được sử dụng hoặc kiểm thử một cách độc lập vì chúng có các phụ thuộc.
Ví dụ
int z; function notPure(){ z = z+10; }
Thành phần chức năng
Tổ hợp chức năng là việc kết hợp 2 hoặc nhiều chức năng để tạo thành một chức năng mới.
Các bang được chia sẻ
Trạng thái chia sẻ là một khái niệm quan trọng trong lập trình hướng đối tượng. Về cơ bản, đó là việc thêm các thuộc tính vào đối tượng. Ví dụ, nếu ổ cứng là một đối tượng, thì dung lượng lưu trữ và kích thước ổ đĩa có thể được thêm vào như các thuộc tính.
Tác dụng phụ
Tác dụng phụ là bất kỳ thay đổi trạng thái nào xảy ra bên ngoài hàm được gọi. Mục tiêu lớn nhất của bất kỳ ngôn ngữ lập trình hàm nào là giảm thiểu tác dụng phụ bằng cách tách chúng ra khỏi phần còn lại của mã phần mềm. Trong lập trình hàm, việc tách tác dụng phụ ra khỏi logic lập trình còn lại là vô cùng quan trọng.
Lợi ích của lập trình chức năng
- Giúp bạn tránh những vấn đề và lỗi gây nhầm lẫn trong mã nguồn.
- Dễ dàng hơn để kiểm tra và thực hiện kiểm thử đơn vị và gỡ lỗi FP Code.
- Xử lý song song và đồng thời.
- Triển khai mã nóng và khả năng chịu lỗi.
- Cung cấp khả năng tùy biến tốt hơn với mã ngắn gọn hơn.
- Tăng năng suất làm việc của lập trình viên.
- Hỗ trợ các hàm lồng nhau.
- Các cấu trúc chức năng như Bản đồ & Danh sách lười biếng, v.v.
- Cho phép sử dụng hiệu quả phép tính Lambda.
Hạn chế của lập trình chức năng
- Mô hình lập trình hàm không dễ hiểu, vì vậy người mới bắt đầu sẽ gặp khó khăn trong việc nắm bắt nó.
- Khó bảo trì vì nhiều đối tượng thay đổi trong quá trình lập trình.
- Cần rất nhiều thao tác giả lập và thiết lập môi trường phức tạp.
- Việc tái sử dụng rất phức tạp và cần phải liên tục chỉnh sửa lại cấu trúc.
- Các đối tượng có thể không thể hiện chính xác vấn đề.
Lập trình chức năng so với lập trình hướng đối tượng
| Lập trình chức năng | OOP |
|---|---|
| FP sử dụng dữ liệu bất biến. | OOP sử dụng dữ liệu có thể thay đổi. |
| Tuân theo mô hình lập trình khai báo. | Tuân theo mô hình lập trình mệnh lệnh. |
| Trọng tâm của chương trình là: “Những gì bạn đang làm trong chương trình.” | Trọng tâm của nó là: “Cách bạn lập trình.” |
| Hỗ trợ lập trình song song. | Không hỗ trợ lập trình song song. |
| Chức năng của nó không có tác dụng phụ. | Một phương pháp có thể gây ra nhiều tác dụng phụ. |
| Kiểm soát luồng được thực hiện bằng cách sử dụng lệnh gọi hàm và lệnh gọi hàm bằng đệ quy. | Quá trình điều khiển luồng được thực hiện bằng cách sử dụng các vòng lặp và câu lệnh điều kiện. |
| Thứ tự thực hiện các câu lệnh không quan trọng lắm. | Thứ tự thực hiện các câu lệnh là quan trọng. |
| Hỗ trợ cả “Cơ bụng”traction over Data” và “Abstrac"Quan điểm hơn hành vi." | Chỉ hỗ trợ “Abs”trac"Sự ưu tiên dữ liệu". |

