Functional Programming Là Gì

     
Phần 1: con phố sáng

Lúc bấy giờ, Tin giới Tây phương mở ra 2 lão tai quái Nguyên Anh hậu kỳ đỉnh phong, cách Hóa Thần chỉ nửa cách cảm ngộ ý cảnh. Một người là Đồ Linh tôn trả - tức Alan Turing, nổi danh với pháp môn Turing Machine. Người kia là Khâu Kỳ thượng tiên, Alonzo Church, vẫy vùng tam giới bởi đạo thuật Lambda Calculus (1).

Bạn đang xem: Functional programming là gì

Turing Machine của Alan Turing với Lambda Calculus của Alonzo Church thực chất là hai bí quyết tiếp cận nguyên lý xử lý giám sát trong computer, thường được giới chuyên môn gọi phổ biến là Luận đề Church - Turing (The Church-Turing Thesis).

Turing Machine đặt các đại lý trên việc nắm giữ state machine cùng trạng thái tiến trình, còn ý tưởng phát minh Lambda Calculus được tạo trên các đặc thù của hàm toán học. đem tu vi của bổn tiên bây chừ thì không lĩnh hội được mấy thứ cao siêu như vậy, nên không dám lạm bàn ngơi nghỉ đây. Chỉ biết rằng, 2 thuật pháp nhắc trên là khởi nguồn của 2 phe cánh tu luyện mạnh nhất trong tin giới hiện tại nay: Object Oriented Programming với Functional Programming.

Có không ít cơ chế xây dựng - Programming Paradigm. OOP cùng Functional Programming chỉ cần 2 trong các đó. Trong cuốn "Programming Paradigms for Dummies: What Every Programmer Should Know", tác giả Peter Van Roy đưa ra quy mô tổng hợp quan hệ tình dục giữa các cơ chế lập trình như vậy này:

*

Trong lịch sử công nghệ, dường như OOP chiếm phần ưu thay hơn so với Functional Programming. Các bạn cứ thử nhìn bao phủ mình là biết, từ bỏ thời tập tành code đang thấy thiên địa tràn trề quy tắc OOP rồi. Các job description, các buổi interview đều nhắc đến OOP như pháp thuật căn bản. đàm luận kỹ thuật hầu như xoay quanh mấy định nghĩa Class, Object, Inheritance, rồi cao hơn thì SOLID, Polymorphism, Encapsulation...

Nhưng, trên cầm cố giới, từ bỏ thời Lisp mang lại FP, rồi Haskell, Elixir, chưa khi nào thiếu vắng đông đảo tu tin giả đi theo con phố Functional Programming. Duy nhất là khoảng chừng sau 2010, không rõ vị sao fan ta bắt đầu phàn nàn nhiều hơn nữa về OOP, trích dẫn các hơn luận điểm banana/gorilla của Joe Armstrong (2), theo đó, chủ đề "Functional Programming" bắt đầu nóng dần trở lại.

Tôi nghe biết Functional Programming vào tầm khoảng 2015 sang một talk show trên YouTube của "chú Bob", nhưng thiếu hiểu biết nhiều lắm nên cũng không chú ý.

Phải sang 2016, tôi mới chính thức tìm hiểu sâu về Functional Programming sau thời điểm đọc 2 loạt nội dung bài viết "Composing Software" của Eric Elliott cùng "So You Want to be a Functional Programmer" của Charles Scalfani bên trên Medium.

Eric Elliott lần lượt phân tích và lý giải từng concepts của Functional Programming một cách tường tận, dễ dàng hiểu. Còn Charles Scalfani và đúng là fan cuồng Functional Programming. Anh trình diễn nó bên dưới dạng một hệ thống triết lý, thế giới quan sệt sắc. Thậm chí, Scalfani còn đề cao Functional Programming như nấc thang tiến hóa trong lịch sử dân tộc lập trình. Lối viết của anh ấy gây ấn tượng cực mạnh.

*

Trước đó, Scalfani còn có bài "Goodbye, Object Oriented Programming" gây tranh biện sôi nổi.

Nhưng bạn đọc nên giữ ý, Functional Programming không bài xích xích OOP. Chúng chỉ là những tuyến phố tu luyện không giống nhau, cùng nhắm đến Đại Đạo. Trong khi viết code, ta hoàn toàn hoàn toàn có thể phối phù hợp nhiều hiệ tượng lập trình khác nhau, miễn sao đạt đến công dụng Đúng - nhanh - Ổn - Đẹp.

ReactJS là 1 trong ví dụ tiêu biểu, rất có thể coi nó như 7 phần Functional Programming + 3 phần OOP. Về điểm này, Anjana Vakil bao gồm một bài xích thuyết trình rất lôi cuốn ở GOTO 2017.


Dù sao, từ đó đến nay, định hướng tư duy Functional Programming vẫn từng bước một lan rộng, ảnh hưởng đến thiết kế của khá nhiều chương trình hiện đại. Chỉ cần để ý một chút, bạn có thể nhận ra những đặc tính nổi bật của Functional Programming mở ra trong phần nhiều frameworks và các phiên bản cập nhật ngôn ngữ mới. Thậm chí, giả dụ xét kỹ, đều khái niệm thoạt nhìn có vẻ như không tương quan như WebComponent, Serverless, Microservice... Cũng ẩn hiện bốn tưởng Functional Programming. Với tôi gần như không còn đụng tới class, new, this nữa.

*

What"s Functional Programming?

Vậy rốt cục Functional Programming là dòng gì? nếu như google bạn sẽ tìm thấy mặt hàng tá cách giải thích khác nhau. Còn tôi chủ chương buộc phải định nghĩa ngắn gọn ráng này:

Functional Programming là phương thức lập trình lấy function làm đối kháng vị thao tác cơ bản.

Đúng vậy. Functional Programming xét về hài lòng thì chỉ bao gồm function, function với function. Không lệnh gán (assignment statements), không đề nghị tới những biến (variables), không bảo quản trạng thái toàn cục (global state). Trong Functional Programming, chúng ta điều khiển mẫu chảy chương trình bằng phương pháp phối hợp các functions lại với nhau. Chúng ta tung hứng những functions qua lại, nhấn vào function, nhả ra function, lồng ghép, xâu chuỗi, biến đổi chúng theo đều cách có thể nghĩ ra.

Đó call là không gian "first-class functions", vị trí lập trình viên đối xử cùng với functions như "first-class citizens". Ở đâu functions được coi trọng như vậy, ở đó ta hoàn toàn có thể lập trình theo lý lẽ Functional Programming. JavaScript, Python, Golang, ngay cả PHP đó là như vậy. Java tính trường đoản cú v8.0 trình làng năm 2017 cũng là như vậy. Mặc dù không hoàn hảo như Haskell, F#, etc - đông đảo tu chân giới vốn được sinh ra đến Functional Programming - tuy nhiên ta vẫn hoàn toàn có thể tu luyện Functional Programming được...

Chỉ có điều phải vận dụng khác một chút, linh hoạt rộng một chút. Đó là lý do tại sao trong những chương trình JavaScript, Python, cho dù viết theo phong cách Functional Programming nhưng mà vẫn buộc phải dùng đến những biến, lệnh gán để thao tác.

Các tu tin đưa tầng tốt muốn ban đầu con đường Functional Programming cần phải nắm bắt những tư tưởng cơ bản như Immutability, Purity, Higher-order functions, Currying function, Function Composition... Sau khoản thời gian thăng cấp cảnh giới cao hơn thì có thể tìm phát âm Monad, Functor, Setoid, Idempotent, Lens... Và những nữa.

Nào, hiện thời hãy bắt đầu hành trình...

Immutability

Immutability nghĩa là tính bất biến.

Nguyên tắc trước tiên trong Functional Programming là: dòng nào vẫn khai báo một đợt thì lâu dài như vậy, không bao giờ thay thay đổi nữa. Các biến hoặc đối tượng người tiêu dùng trong kịch phiên bản Functional Programming nếu có thì nên immutable.

Xem thêm: Beecost Mua Thông Minh - Nhẫn Vàng Tây Cóc Ngậm Tiền

Code ráng này không hẳn là Functional Programming vày x cùng y bị nỗ lực đổi.

var x = 5;var y = 2;while (x Mutable là điều tối kỵ vào Functional Programming. Cần phải hạn chế đến cả thấp nhất. Các mẫu coding convention với best practices thông dụng hiện nay đều khuyến khích áp dụng const nhằm khai báo, quăng quật hẳn var , và sử dụng let đúng liều lượng.

Đối cùng với Object, ta cần dùng Object.freeze để lock tổng thể thuộc tính. Cũng rất có thể dùng Object.defineProperty, Object.defineProperties nhằm lock một trong những thuộc tính quan lại trọng. Các giải pháp này phần đông chỉ hỗ trợ 1 cung cấp thuộc tính. Phải dữ thế chủ động code thêm nếu như muốn áp dụng lên các thuộc tính con.

Nếu dự án công trình đủ phức tạp, hãy lưu ý đến sử dụng các thư viện chuyên được sự dụng như Immutable.js, Baobap...

Purity

Purity là tính thuần khiết, thuần túy, sự vào sạch, không trở nên pha tạp.

Đây là phép tắc thứ nhì trong Functional Programming: toàn bộ các hàm đều đề xuất là pure function, không có hiệu ứng phụ (side effect), ko được tác động ảnh hưởng lên bất kể giá trị nào bên ngoài nó, cũng nói ko với chỉnh sửa tham số input.

Hàm sau đây không yêu cầu pure function bởi nó chỉnh sửa DOM element bên phía ngoài và biến hóa giá trị đựng trong localStorage.

const updateView = (html) => let $view = document.getElementById("panel"); $view.innerHTML = html; localStorage.setItem("panelCache", html); return $view;Đặc điểm đặc biệt quan trọng nữa của pure function là với từng tập giá bán trị nguồn vào nhất định, luôn có 1 và chỉ 1 hiệu quả trả về tương ứng. Đây là đặc thù của hàm số toán học.

Hàm tiếp sau đây không buộc phải pure function vị trả về hiệu quả khác nhau mang đến cùng đầu vào:

const getDuration = (timestamp) => return Date.now() - timestamp;;Pure function trong Functional Programming hay ngắn gọn, dễ dàng và đơn giản và chỉ cách xử lý duy nhất 1 vụ việc logic.

Đây là một pure function ghê điển:

const địa chỉ = (a, b) => return a + b;;Dù bạn có gọi hàng triệu lần thì add(3, 2) vẫn luôn luôn trả về 5.

Viết unit chạy thử cho pure function là nhiệm vụ thoải mái như đi dạo cùng một phụ nữ ngây thơ trắng trong vậy!

Immutability cùng Purity là 2 đặc trưng cơ phiên bản nhất của Functional Programming, có thể chấp nhận được phân biệt với các cơ chế lập trình sẵn khác. Tu tin mang tu luyện theo con phố này tuyệt nhất định đề xuất giữ tâm niệm "immutable" với "pure" vào từng gần kề na.

`

Phần 1 của chăm đề Functional Progamming xin dừng chân ở đây. Thanks for reading.

Xem thêm: Advcash Là Gì ? Hướng Dẫn Cách Đăng Kí & Sử Dụng Advcash Từ A

Chú thích

1, Chữ Tàu ghi Alan Turing là 艾伦图灵 - Ngải Luân Đồ Linh, Alonzo Church là 阿隆佐邱奇 - A Long Tá Khâu Kỳ.