FUNCTIONAL LÀ GÌ

  -  
Phần 1: con phố sáng

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

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

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

Turing Machine đặt đại lý trên việc nắm giữ state machine cùng trạng thái tiến trình, còn 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 hiện thời thì không lĩnh hội được mấy thứ cao quý như vậy, nên không đủ can đảm lạm bàn sinh hoạt đây. Chỉ biết rằng, 2 thuật pháp nhắc trên là khởi nguồn của 2 phe phái tu luyện mạnh mẽ nhất trong tin giới hiện nay nay: Object Oriented Programming cùng Functional Programming.

Có không ít cơ chế thiết kế - Programming Paradigm. OOP với Functional Programming chỉ nên 2 trong các đó. Trong cuốn "Programming Paradigms for Dummies: What Every Programmer Should Know", người sáng tác Peter Van Roy đưa ra mô hình tổng hợp tình dục giữa các cơ chế lập trình như vậy này:

*

Trong lịch sử vẻ vang công nghệ, có vẻ OOP chiếm ưu vậy hơn đối với Functional Programming. Bạn cứ test 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 ngập quy tắc OOP rồi. Các job description, các buổi interview đều nói đến OOP như pháp thuật căn bản. đàm đạo kỹ thuật đa số xoay quanh mấy có mang Class, Object, Inheritance, rồi cao hơn vậy thì SOLID, Polymorphism, Encapsulation...

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

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

Phải thanh lịch 2016, tôi mới thiết yếu 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 và "So You Want khổng lồ be a Functional Programmer" của Charles Scalfani trên Medium.

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

*

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

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

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


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

*

What"s Functional Programming?

Vậy sau cuối Functional Programming là loại gì? giả dụ 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 nhà chương buộc phải định nghĩa ngắn gọn nắm này:

Functional Programming là phương pháp lập trình đem function làm 1-1 vị thao tác làm việc cơ bản.

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

Đó gọi là không khí "first-class functions", nơi lập trình viên đối xử với functions như "first-class citizens". Ở đâu functions được đánh giá trọng như vậy, ở đó ta hoàn toàn có thể lập trình theo nguyên lý Functional Programming. JavaScript, Python, Golang, ngay cả PHP đó là như vậy. Java tính tự v8.0 reviews năm 2017 cũng là như vậy. Cho dù không tuyệt đối hoàn hảo như Haskell, F#, etc - hồ hết tu chân giới vốn được sinh ra mang đến Functional Programming - dẫu vậy ta vẫn rất có thể tu luyện Functional Programming được...

Chỉ bao gồm điều phải vận dụng khác một chút, linh hoạt hơn một chút. Đó là tại sao tại sao trong các chương trình JavaScript, Python, mặc dù viết theo phong thái Functional Programming nhưng mà vẫn nên dùng đến các biến, lệnh gán nhằm thao tác.

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

Nào, bây chừ hãy ban đầ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à: loại nào đã khai báo một đợt thì mãi mãi như vậy, không lúc nào thay thay đổi nữa. Các biến hoặc đối tượng người tiêu dùng trong kịch bạn dạng Functional Programming nếu bao gồm thì yêu cầu immutable.

Xem thêm: Hướng Dẫn Cách Chơi Ashe Mùa 7, Cách Lên Đồ Ashe Mùa 7 Mới Nhất

Code nuốm này không hẳn là Functional Programming bởi x và y bị thế đổ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 hơn cả thấp nhất. Những 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, vứt hẳn var , và sử dụng let đúng liều lượng.

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

Nếu dự án công trình đủ phức tạp, hãy suy nghĩ sử dụng các thư viện chuyên được 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 xẩy ra pha tạp.

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

Hàm sau đây không đề nghị pure function vày nó sửa đổi DOM element phía bên ngoài và biến hóa giá trị cất trong localStorage.

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

Hàm dưới đây không phải pure function vì chưng trả về công dụng khác nhau đến cùng đầu vào:

const getDuration = (timestamp) => return Date.now() - timestamp;;Pure function trong Functional Programming thường ngắn gọn, dễ dàng và chỉ cách xử lý duy độc nhất 1 vấn đề logic.

Đây là 1 trong pure function gớm điển:

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

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

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

`

Phần 1 của chăm đề Functional Progamming xin dựng chân lại tại đây. Thanks for reading.

Xem thêm: Tai Game Vua Tro Choi Yugioh Tieng Viet, Download Game Vua Tro Choi Yugioh Tieng Viet

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ỳ.