Functional programming?

Lập trình hàm tạo ra chương trình bằng cách kết hợp các hàm toán học và tránh trạng thái chia sẻ & dữ liệu có thể thay đổi. Lisp (được định nghĩa vào năm 1958) là một trong những ngôn ngữ đầu tiên hỗ trợ lập trình hàm và được truyền cảm hứng nhiều từ giải tích lambda. Lisp và nhiều ngôn ngữ trong gia đình Lisp vẫn được sử dụng phổ biến ngày nay. Lập trình hàm là một khái niệm thiết yếu trong JavaScript (một trong hai trụ cột của JavaScript). Nhiều tiện ích hàm thông dụng đã được thêm vào JavaScript trong phiên bản ES5.

Điểm cộng:

  • Hàm thuần túy (Pure functions).
  • Tránh side-effects.
  • Kết hợp hàm đơn giản (Simple function composition)..
  • Các ví dụ về ngôn ngữ lập trình hàm: Lisp, ML, Haskell, Erlang, Clojure, Elm, F Sharp, OCaml, v.v…
  • Nêu các tính năng hỗ trợ FP: hàm bậc nhất (first-class functions), hàm bậc cao (higher-order functions), hàm được truyền như đối số/giá trị.

Điểm trừ:

  • Không nhắc đến hàm thuần túy / tránh side-effects.
  • Không thể đưa ra ví dụ về ngôn ngữ lập trình hàm.
  • Không nhận biết được các tính năng của JavaScript hỗ trợ FP.

* Sự khác biệt giữa kế thừa cổ điển (classical inheritance) và kế thừa nguyên mẫu (prototypal inheritance) là gì?

Kế thừa cổ điển: các thực thể kế thừa từ các lớp (giống như bản thiết kế – mô tả lớp) và tạo ra mối quan hệ lớp con: phân cấp lớp. Các thực thể thường được khởi tạo thông qua hàm tạo (constructor functions) với từ khóa new. Kế thừa cổ điển có thể sử dụng hoặc không sử dụng từ khóa class từ ES6. Kế thừa nguyên mẫu: các thực thể kế thừa trực tiếp từ các đối tượng khác. Các thực thể thường được khởi tạo thông qua hàm factory hoặc Object.create(). Các thực thể có thể được kết hợp từ nhiều đối tượng khác nhau, cho phép kế thừa lựa chọn dễ dàng.

Trong JavaScript, kế thừa nguyên mẫu đơn giản và linh hoạt hơn so với kế thừa cổ điển.

Điểm cộng:

  • Lớp (Classes): tạo sự liên kết chặt chẽ hoặc phân cấp/taxonomies.
  • Nguyên mẫu (Prototypes): đề cập đến kế thừa nối tiếp (concatenative inheritance), ủy quyền nguyên mẫu (prototype delegation), kế thừa hàm (functional inheritance), kết hợp đối tượng (object composition). Điểm trừ:
  • Không ưu tiên kế thừa nguyên mẫu & kết hợp hơn kế thừa cổ điển.

* Ưu và nhược điểm của lập trình hàm (Functional programming) so với lập trình hướng đối tượng (Object-oriented programming)?

Ưu điểm OOP: Dễ hiểu về khái niệm cơ bản của đối tượng và sự phân cấp, giúp dễ dàng tổ chức và quản lý mã nguồn. OOP giúp đơn giản hóa phát triển và bảo trì mã nguồn thông qua tính đóng gói, kế thừa và đa hình.

Nhược điểm OOP: Có thể tạo ra mã nguồn phức tạp khi sử dụng nhiều kế thừa, làm cho việc dễ dàng thay đổi và mở rộng mã nguồn trở nên khó khăn hơn. OOP có xu hướng thiên về chia sẻ trạng thái, dẫn đến các vấn đề về đồng bộ hóa và tính toàn vẹn của dữ liệu.

Ưu điểm FP (Functional programming) : Đơn giản hóa mã nguồn thông qua việc sử dụng hàm thuần túy, tránh side-effects, giúp mã nguồn dễ đọc, dễ bảo trì và ít lỗi hơn. FP giúp tăng tính tái sử dụng mã nguồn và giảm bớt sự phức tạp của chương trình. FP cũng thích hợp cho việc xử lý song song và hỗ trợ lập trình đa luồng.

Nhược điểm FP: FP có thể khó tiếp cận hơn đối với những người mới bắt đầu, do khái niệm và thuật ngữ khác biệt. Hiệu năng của FP đôi khi kém hơn OOP do việc sử dụng bộ nhớ và tính toán không tối ưu. Ngoài ra, mã nguồn sử dụng FP đôi khi khó hiểu hơn đối với những người không quen thuộc với phương pháp này.

Nguồn: https://viblo.asia/p/blog251-10-cau-hoi-phong-van-ma-moi-lap-trinh-vien-javascript-can-biet-phan-1-x7Z4DjZ0LnX#_2-lap-trinh-ham-functional-programming-la-gi-2

Related Posts