BÀN VỀ FUNCTIONAL PROGRAMMING VÀ OOP PROGRAMMING – bài 1


Cách đây mấy hôm tôi có đưa ra một khảo sát xem mọi người sẽ theo hướng FP hay OOP, vì hay gặp cảnh tranh cãi giữa hai trường phái này. Và thường các cuộc tranh cãi đều không có hồi kết, đơn giản vì ai cũng có lý lẽ của mình, và quan trọng nhất là không có ai có thể đưa ra được những lý do xác đáng để bên kia tin theo.

Trong bài này tôi sẽ mặc nhiên coi các bạn đã hiểu về OOP, và sẽ nói một chút về FP (vì trong blog này chưa có bài nào nói về nó). Nếu như bạn chưa thực sự biết rõ cả OOP lẫn FP thì tất cả những lý lẽ đưa ra sẽ đều là cảm tính, do đó quan điểm đưa ra sẽ dễ trở nên phiến diện và không thuyết phục.

Nhớ tìm đọc lại các bài OOP nếu bạn vẫn chưa nắm rõ nhé ❤️.

ℹ️ Vậy Functional Programming là gì?

👉 FP (hay lập trình hàm – Việt hóa) là một cách thức lập trình dựa trên các hàm, trong đó không sử dụng trạng thái và dữ liệu sẽ không bị thay đổi. Một chương trình được viết theo kiểu FP sẽ là sự kết hợp giữa các hàm với nhau, để khi dữ liệu đi vào ở một đầu, ta sẽ nhận được kết quả ở đầu còn lại. Bạn có thể tưởng tượng giống như khi bạn dùng một chương trình chụp ảnh kiểu như Camera 360, khi chụp ảnh thì bức ảnh từ camera chính là dữ liệu đầu vào, để ra kết quả cuối cùng, ta phải áp dụng rất nhiều bộ lọc khác nhau: trắng da -> cà mụn -> xóa lông chân -> cằm V-line -> kéo dài chân -> bụng nhỏ -> mắt to, vv và vv… mỗi bộ lọc chính là một hàm để xử lý bức ảnh đầu vào và tạo một bức ảnh mới ở đầu ra (không phải là sửa ảnh gốc – mà là tạo một ảnh mới đã chỉnh sửa từ ảnh gốc), một chương trình đầy đủ sẽ là sự kết nối giữa các hàm đó với nhau.

👉 Hay bạn cũng có thể tưởng tượng, viết một chương trình theo kiểu FP giống như kết nối một hệ thống đường ống, với mỗi loại ống sẽ tạo ra một loại “nước” mới, dựa trên loại nước mà bạn truyền vào cho nó. Khi thiết kế một loại ống – function, bạn chỉ quan tâm dữ liệu đầu vào và đầu ra của chính ống đó, mà không cần biết những chỗ khác làm việc như thế nào.

👉 Sẽ có một vài điều khác biệt khi viết chương trình FP:- Các thành phần chính trong một chương trình là các function, một chương trình hoàn chỉnh là sự kết hợp giữa các function đó với nhau.

– Dữ liệu không bao giờ thay đổi: Một hàm nhận dữ liệu đầu vào, tính toán và tạo nên dữ liệu MỚI ở đầu ra, dữ liệu cũ sẽ không bao giờ thay đổi.

– Mô hình FP hỗ trợ tính toán song song một cách tự nhiên: Nếu bạn có một công thức x = f(f1(a), f2(b)), thì rõ ràng f1(a) và f2(b) hoàn toàn có thể được tính toán đồng thời với nhau.

– FP dùng đệ quy, không dùng vòng lặp.

👉 Tôi tin rằng tới đây đã có nhiều bạn ngạc nhiên vì cái tôi đang nói không giống với điều bạn hiểu về Functional Programming. Tôi sẽ nói thêm một thông tin nữa, có thể cũng làm bạn ngạc nhiên: khái niệm FP ra đời từ trước OOP rất lâu, so về tuổi thì chắc cũng đáng cha chú của OOP. Ngôn ngữ FP đầu tiên – LISP, ra đời trước cả C, chứ chưa nhắc đến C++ sau này. (Bạn có thể xem một tài liệu từ năm 1960 nói về LISP và FP tại đây http://jmc.stanford.edu/articles/recursive/recursive.pdf)

Nói như vậy để thấy rằng, khái niệm FP là một thứ đã có từ rất lâu, chứ không phải là một phát kiến mới mẻ gì, và lại càng không có gì thần thánh như nhiều bài viết gần đây. Tất nhiên những thứ cũ rích không có nghĩa vô dụng: cái bánh xe người ta đã tạo ra từ xa xưa (chắc chắn là trước khi có FP 😁) nhưng giờ vẫn dùng đấy thôi.Trong những phần sau, ta sẽ tiếp tục thảo luận về lý do tại sao functional programming lại trở nên phổ biến trong những năm gần đây, ưu và nhược điểm của nó so với OOP, cũng như việc lựa chọn hướng đi cho việc học của các bạn.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s