Phương pháp lập trình hàm

     
1 year ago Ứng dụng “Giúp tôi!” kết nối bác sĩ, cung ứng người bị ảnh hưởng bởi Covid-19 1 year ago Prosus đồng ý mua Stack Overflow với mức giá 1,8 tỷ đô la 1 year ago 30 năm thành lập Linux: phỏng vấn Linus Torvalds về Mã nguồn mở và hơn thế nữa – Phần 2 1 year ago 30 năm ra đời Linux: vấn đáp Linus Torvalds về Linux cùng Git – Phần 1 1 year ago Giải ngoại hạng Anh chọn cơ sở hạ tầng đám mây Oracle mang đến phân tích soccer
*
Photo: guru99.com

Các hàm thanh khiết (Pure functions)

Lý tưởng trong thiết kế hàm là những gì được gọi là các hàm thuần khiết. Một hàm thuần khiết là 1 trong hàm mà kết quả của nó chỉ dựa vào vào các tham số đầu vào và buổi giao lưu của nó không tạo ra hiệu ứng phụ (side effect) nào, nghĩa là, không tạo nên tác động phía bên ngoài nào bên cạnh giá trị trả về.

Vẻ rất đẹp của một hàm thanh khiết là sinh sống sự dễ dàng và đơn giản trong kiến trúc. Bởi vì một hàm tinh khiết bị giảm chỉ từ các đối số và quý hiếm trả về (nghĩa là API của nó), nó rất có thể được coi là một ngõ cụt phức tạp: liên tưởng duy nhất của nó với hệ thống phía bên ngoài mà nó vận động là thông qua API được xác định.

Điều này trái ngược cùng với OOP nơi những phương thức đối tượng được thiết kế để can hệ với tinh thần của đối tượng người sử dụng (các thành viên đối tượng) và trái lại với mã kiểu thủ tục nơi trạng thái bên ngoài thường được thao tác từ bên trong hàm.

Bạn đang xem: Phương pháp lập trình hàm

Tuy nhiên, vào thực tế, các hàm thường chấm dứt bằng việc liên hệ với văn cảnh rộng hơn, được chứng tỏ bằng useEffect hook của React.

Tính bất biến (Immutability)

Một nguyên tắc khác của triết lý thiết kế hàm là không sửa thay đổi dữ liệu bên ngoài hàm. Trong thực tế, điều này có nghĩa là tránh sửa đổi các đối số đầu vào cho một hàm. Cố vào đó, cực hiếm trả về của hàm phải phản ánh quá trình đã thực hiện. Đây là một cách để tránh chức năng phụ. Nó tạo nên nó tiện lợi hơn để suy luận về những tác động của hàm khi nó hoạt động trong hệ thống lớn hơn.

Hàm hạng nhất (First class functions)

Ngoài hài lòng về hàm thuần khiết, trong thực tế lập trình chàm chuyển phiên quanh các hàm hạng nhất. Một hàm hạng nhất là một hàm được coi như một “vật từ bỏ thân”, có công dụng đứng 1 mình và được giải pháp xử lý độc lập. Xây dựng hàm tìm biện pháp tận dụng sự cung cấp của ngữ điệu trong bài toán sử dụng những hàm làm biến, đối số và giá trị trả về để chế tạo mã thanh lịch.

Bởi vì các hàm hạng nhất rất linh hoạt cùng hữu ích, ngay cả những ngôn ngữ OOP trẻ khỏe như Java với C # đã và đang chuyển quý phái kết hợp cung cấp hàm hạng nhất. Đó là hễ lực đằng sau sự cung cấp của Java 8 cho các biểu thức Lambda.

Một biện pháp khác để mô tả những hàm lớp đầu tiên là các hàm bên dưới dạng dữ liệu. Bao gồm nghĩa là, một hàm lớp đầu tiên rất có thể được gán mang đến một thay đổi giống như ngẫu nhiên dữ liệu nào khác. Khi chúng ta viết let myFunc = function () , bạn đang sử dụng một hàm làm dữ liệu.

Hàm bậc cao (Higher-order functions)

Một hàm gật đầu đồng ý một hàm làm cho đối số hoặc trả về một hàm, được gọi là 1 trong hàm bậc cao hơn nữa – một hàm chuyển động dựa trên một hàm.

Cả JavaScipt và Java các đã bổ sung thêm cú pháp hàm cách tân trong những năm gần đây. Java vẫn thêm toán tử mũi tên với toán tử lốt hai chấm (arrow operator & double colon operator). JavaScript đang thêm toán tử mũi tên. Những toán tử này được thiết kế với để góp việc xác minh và sử dụng những hàm dễ dàng hơn, nhất là các hàm nội tuyến đường (inline) dưới dạng các hàm ẩn danh (anonymous functions). Một hàm ẩn danh là 1 hàm được khái niệm và sử dụng mà không được cung cấp một biến hóa tham chiếu.

Ví dụ về lập trình hàm: Collection

Có lẽ ví dụ rất nổi bật nhất về khu vực mà xây dựng hàm tỏa sáng sủa là xử lý các tập hợp. Điều này là do có thể áp dụng những khối tính năng trên các items vào collection (bộ sưu tập) là điều hoàn toàn phù hợp với ý tưởng hàm thuần túy.

Hãy cẩn thận Listing 1, thực hiện hàm maps () của JavaScript để viết hoa những chữ mẫu trong một mảng.

Listing 1. Sử dụng hàm map() với hàm ẩn danh trong JavaScript

let letters = <"a", "b", "c">;console.info( letters.map((x) => x.toUpperCase()) ); // outputs <"A", "B", "C">Vẻ đẹp nhất của cú pháp này là code được tập trung chặt chẽ. Không yêu cầu thao tác vòng lặp cùng mảng. Thừa trình xem xét về số đông gì đang được triển khai được thể hiện ví dụ bằng mã này. Điều tương tự như cũng có được với toán tử mũi thương hiệu của Java như vào Listing 2.

Listing 2. áp dụng map() với hàm ẩn danh trong Java

import java.util.*; import java.util.stream.Collectors;import static java.util.stream.Collectors.toList;//...List lower = Arrays.asList("a","b","c");System.out.println(lower.stream().map(s -> s.toUpperCase()).collect(toList())); // outputs <"A", "B", "C">Listing 2 thực hiện thư viện luồng (stream library) của Java 8 để thực hiện cùng một tác vụ viết hoa danh sách những chữ cái. Chú ý rằng cú pháp của toán tử mũi tên cốt lõi số đông giống cùng với JavaScript và bọn chúng làm điều tương tự, tức là tạo một hàm đồng ý các đối số, tiến hành logic cùng trả về một giá trị. (Điều quan trọng đặc biệt cần lưu ý là ví như thân hàm được xác minh thiếu dấu ngoặc nhọn xung quanh nó, thì cực hiếm trả về sẽ tự động được cung cấp.)

Tiếp tục với Java, hãy xem xét toán tử lốt hai chấm vào Listing 3. Toán tử này có thể chấp nhận được bạn tham chiếu một thủ tục trên một lớp: vào trường hợp này là cách tiến hành toUpperCase bên trên lớp String. Listing 3 làm điều tương tự như Listing 2. Những cú pháp không giống nhau có ích cho các trường hợp khác nhau.

Xem thêm: Cách Viết Thiệp Chúc Mừng Sinh Nhật Mẹ Hay Và Ý Nghĩa Nhất, Lời Chúc Mừng Sinh Nhật Mẹ Hay Và Ý Nghĩa Số 1

Listing 3. Toán tử lốt hai chấm vào Java (Double Colon Operator)

// ...List upper = lower.stream().map(String::toUpperCase).collect(toList());Trong cả bố ví dụ trên, chúng ta cũng có thể thấy rằng các hàm bậc cao đã hoạt động. Hàm maps () vào cả hai ngữ điệu đều đồng ý một hàm làm cho đối số.

Nói một phương pháp khác, bạn cũng có thể xem bài toán chuyển các hàm vào những hàm khác (trong Array API hoặc cách khác) bên dưới dạng những giao diện chức năng. Các hàm của trình cung ứng (sử dụng những hàm tham số) là các trình gặm thêm vào ngắn gọn xúc tích tổng quát.

Điều này trông giống như một quy mô chiến lược trong OOP (và thực sự, trong Java, một bối cảnh với một cách tiến hành duy nhất được tạo nên bên dưới) tuy thế sự nhỏ dại gọn của một hàm làm cho một giao thức thành phần khôn cùng chặt chẽ.

Như một lấy ví dụ như khác, hãy để mắt tới Listing 4, định nghĩa một trình cách xử trí tuyến trong khung Express đến Node.js.

Listing 4. Route handler trong Express

var express = require("express");var ứng dụng = express();app.get("/", function (req, res) res.send("One Love!"););Listing 4 là một ví dụ điển hình về lập trình sẵn hàm trong các số ấy nó chất nhận được định nghĩa ví dụ về đúng đắn những gì quan trọng để ánh xạ một tuyến đường và xử lý những yêu mong và ý kiến – mang dù rất có thể lập luận rằng thao tác đối tượng người sử dụng phản hồi vào thân hàm là một tác động phụ

Các hàm Curry (Curried functions)

Bây giờ đồng hồ hãy lưu ý khái niệm thiết kế hàm của các hàm trả về các hàm. Điều này ít chạm chán hơn so với các hàm dưới dạng đối số. Liệt kê 5 tất cả một ví dụ từ 1 mẫu React phổ biến, trong những số ấy cú pháp mũi tên mập (fat-arrow) được xâu chuỗi.

Listing 5. Hàm curry trong React

handleChange = field => e => e.preventDefault();// Handle eventMục đích của phần bên trên là sinh sản một trình giải pháp xử lý sự khiếu nại sẽ chấp nhận trường được nói và tiếp nối là sự kiện. Điều này rất bổ ích vì chúng ta cũng có thể áp dụng và một handleChange cho nhiều trường. Nói cầm lại, và một trình xử lý hoàn toàn có thể sử dụng được trên những trường.

Listing 5 là một trong ví dụ về hàm curried. “Chức năng làm bếp cà ri” là một chiếc tên hơi cực nhọc chịu. Nó vinh danh một người, vấn đề này thật tốt, mà lại nó không bộc lộ khái niệm, vấn đề đó gây nhầm lẫn. Trong phần đông trường hợp, phát minh là khi chúng ta có những hàm trả về các hàm, chúng ta cũng có thể xâu chuỗi những lệnh điện thoại tư vấn chúng lại với nhau, theo phong cách linh hoạt rộng so với câu hỏi tạo một hàm đơn lẻ với các đối số.

Khi gọi những loại hàm này, bạn sẽ gặp nên cú pháp “dấu ngoặc đơn được xâu chuỗi” đặc biệt: handleChange (trường) (sự kiện).

Những ích lợi lớn rộng của thiết kế hàm

Các lấy ví dụ như trước cung ứng sự phát âm biết thực tế về lập trình sẵn hàm trong bối cảnh tập trung, nhưng lập trình hàm nhằm mục tiêu mang lại ích lợi lớn rộng cho bài toán lập trình nói chung. Nói biện pháp khác, xây dựng hàm nhằm mục đích tạo ra các khối hệ thống quy tế bào lớn, linh động hơn, sạch sẽ hơn.

Thật khó để cung cấp ví dụ về điều này, tuy nhiên một ví dụ như trong trái đất thực là hành động của React nhằm mục đích thúc đẩy những functional components. Đội ngũ React đã chú ý rằng functional style of component sở hữu lại công dụng kết thích hợp khi bản vẽ xây dựng giao diện cải tiến và phát triển lớn hơn.

Một hệ thống khác áp dụng nhiều lập trình hàm là ReactiveX. Các khối hệ thống quy mô mập được xây dựng dựa trên loại luồng sự kiện mà ReactiveX sử dụng hoàn toàn có thể được thụ hưởng từ liên hệ thành phần phần mềm được bóc rời. Angular hoàn toàn sử dụng ReactiveX (RxJS) trên diện rộng như một sự ưng thuận về sức khỏe này.

Phạm vi trở thành và ngữ cảnh

Cuối cùng, một vụ việc rất đặc trưng cần chú ý khi thực hiện lập trình hàm, chính là phạm vi biến (variable scope) với ngữ cảnh (context).

Trong JavaScript, context (ngữ cảnh) gồm nghĩa cụ thể là đông đảo gì tự khóa this giải quyết. Vào trường phù hợp của toán tử mũi thương hiệu JavaScript, this đề cập cho ngữ cảnh bao quanh. Một hàm được xác định với cú pháp truyền thống sẽ nhận thấy ngữ cảnh riêng rẽ của nó. Trình cách xử lý sự khiếu nại trên các đối tượng người sử dụng DOM rất có thể tận dụng thực tế này để đảm bảo an toàn rằng từ bỏ khóa this nhắc đến thành phần đang được xử lý.

Scope (phạm vi) đề cập mang đến variable horizon, có nghĩa là những đổi thay nào có thể nhìn thấy được. Vào trường hợp của toàn bộ các hàm JavaScript (cả hàm bự và hàm truyền thống) với trong ngôi trường hợp các hàm ẩn danh vì mũi tên xác định của Java, phạm vi là phạm vi của văn bản hàm bao quanh. Đây là nguyên nhân tại sao các hàm vì thế được điện thoại tư vấn là closures. Thuật ngữ này tức là hàm được phủ quanh trong phạm vi đựng của nó.

Điều đặc biệt quan trọng cần nhớ là: các hàm ẩn danh như vậy bao gồm toàn quyền truy cập vào các biến trong phạm vi. Hàm bên trong có thể hoạt động dựa trên những biến của hàm mặt ngoài. Đây hoàn toàn có thể được xem là một công dụng phụ của hàm ko thuần túy.

Theo: https://www.infoworld.com/article/3613715/what-is-functional-programming-a-practical-guide.html

Theo: https://kipalog.com/posts/Functional-Programming—Phan-1—Con-duong-sang