bởi Rick Henry
Sử dụng kỹ thuật chức năng này có thể làm cho mã của bạn thanh lịch hơn

Lập trình hàm cung cấp cho chúng ta các kỹ thuật để giải quyết các vấn đề trong mã của chúng ta. Một trong số đó, ứng dụng một phần, hơi khó hiểu nhưng nó có thể cho phép chúng ta viết ít hơn (nghe có vẻ thú vị phải không?).
Nó là gì?
Ứng dụng một phần bắt đầu với một chức năng. Chúng tôi lấy chức năng này và tạo một chức năng mới với một hoặc nhiều đối số của nó đã được “đặt” hoặc áp dụng một phần. Điều này nghe có vẻ lạ, nhưng nó sẽ làm giảm số lượng tham số cần thiết cho các chức năng của chúng ta.
Hãy đưa ra một số bối cảnh khi chúng ta có thể sử dụng một phần ứng dụng:
const list = (lastJoin, ...items) => { const commaSeparated = items.slice(0,-1).join(", "); const lastItem = items.pop(); return `${commaSeparated} ${lastJoin} ${lastItem}`;}
Chức năng nhỏ này có trong một từ duy nhất, lastJoin
và một số lượng tùy ý items
. Ban đầu, list
tuyên bố một commaSeparated
Biến đổi. Biến này lưu trữ một mảng được nối được phân tách bằng dấu phẩy của tất cả các phần tử ngoại trừ phần tử cuối cùng. Trên dòng tiếp theo, chúng tôi lưu trữ mục cuối cùng trong items
trong một lastItem
Biến đổi. Sau đó, hàm trả về bằng cách sử dụng mẫu chuỗi.
Hàm sau đó trả về items
, dưới dạng chuỗi, ở định dạng danh sách. Ví dụ:
list("and", "red", "green", "blue"); // "red, green and blue"list("with", "red", "green", "blue"); // "red, green with blue"list("or", "red", "green", "blue"); // "red, green or blue"
Của chúng ta list
chức năng cho phép chúng tôi tạo danh sách khi chúng tôi muốn. Mỗi loại danh sách chúng tôi tạo, “và”, “với”, “hoặc” là một chuyên biệt hóa của danh sách chung list
chức năng. Sẽ không hay sao nếu chúng có chức năng của riêng chúng?!
Cách sử dụng ứng dụng từng phần
Đây là nơi ứng dụng một phần có thể giúp ích. Ví dụ, để thực hiện một listAnd
chức năng, chúng tôi “thiết lập” (hoặc áp dụng một phần) các lastJoin
lập luận là “và”. Kết quả của việc này có nghĩa là chúng ta có thể gọi hàm được áp dụng một phần như sau:
listAnd("red", "green", "blue"); // "red, green and blue"
Nó cũng không cần phải dừng lại ở đó. Chúng ta có thể thực hiện nhiều chức năng chuyên biệt bằng cách áp dụng một phần một đối số cho chức năng danh sách của chúng tôi:
listOr("red", "green", "blue"); // "red, green or blue"listWith("red", "green", "blue"); // "red, green with blue"
Để làm được điều này, chúng ta cần tạo một partial
chức năng tiện ích:
const partial = (fn, firstArg) => { return (...lastArgs) => { return fn(firstArg, ...lastArgs); }}
Hàm này nhận một hàm fn
vì nó là tham số đầu tiên và firstArg
như thứ hai của nó. Nó trả về một hàm hoàn toàn mới với một tham số, lastArgs
. Điều này tập hợp các đối số được thông qua.
Bây giờ để làm cho chúng tôi listAnd
chức năng chúng tôi gọi partial
đi qua trong chúng tôi list
chức năng và từ tham gia cuối cùng của chúng tôi:
const listAnd = partial(list, "and");
Của chúng ta listAnd
chức năng bây giờ chỉ lấy một danh sách các mục tùy ý. Hàm này khi được gọi sẽ lần lượt gọi hàm được truyền vào list
chức năng. Chúng ta có thể thấy rằng nó sẽ được thông qua “và” làm đối số đầu tiên và tập hợp lastArgs
sau đó.
Bây giờ chúng tôi đã tạo một chức năng được áp dụng một phần. Chúng ta có thể sử dụng đi sử dụng lại chức năng đặc biệt này trong chương trình của mình:
listAnd("red", "green", "blue"); // "red, green and blue"
Đưa nó đi xa hơn
Các partial
chức năng chúng tôi đã tạo là để minh họa cách ứng dụng một phần hoạt động. Có một số thư viện JavaScript chức năng tuyệt vời có sẵn tiện ích này, chẳng hạn như Ramda JS.
Điều đáng chú ý là ngay cả khi bạn chưa quen với ứng dụng một phần như một khái niệm thì vẫn có khả năng bạn đã sử dụng nó. Nếu bạn đã từng sử dụng .bind()
phương thức trên một chức năng, đây là một ví dụ về ứng dụng từng phần. Đó là thông lệ để vượt qua this
vào liên kết để đặt bối cảnh của nó. Dưới mui xe, nó được áp dụng một phần this
và trả về một chức năng mới.