Nhiều ngôn ngữ lập trình hiện đại hỗ trợ một số khái niệm về đóng , tức là một đoạn mã (một khối hoặc một hàm) mà
- Có thể được coi là một giá trị và do đó được lưu trữ trong một biến, được chuyển qua các phần khác nhau của mã, được định nghĩa trong một phần của chương trình và được gọi trong một phần hoàn toàn khác của cùng một chương trình.
- Có thể nắm bắt các biến từ bối cảnh được xác định và truy cập chúng khi nó được gọi sau này (có thể trong một bối cảnh hoàn toàn khác).
Dưới đây là một ví dụ về việc đóng cửa được viết bằng Scala:
def filterList(xs: List[Int], lowerBound: Int): List[Int] =
xs.filter(x => x >= lowerBound)
Hàm bằng chữ x => x >= lowerBound
chứa biến tự do lowerBound
, được đóng (ràng buộc) bởi đối số của hàm filterList
có cùng tên. Việc đóng được truyền cho phương thức thư viện filter
, có thể gọi nó nhiều lần như một hàm bình thường.
Tôi đã đọc rất nhiều câu hỏi và câu trả lời trên trang web này và, theo tôi hiểu, thuật ngữ đóng thường được tự động liên kết với lập trình chức năng và phong cách lập trình chức năng.
Định nghĩa của lập trình hàm trên wikipedia đọc:
Trong khoa học máy tính, lập trình chức năng là một mô hình lập trình coi việc tính toán là việc đánh giá các hàm toán học và tránh trạng thái và dữ liệu đột biến. Nó nhấn mạnh việc áp dụng các chức năng, trái ngược với phong cách lập trình mệnh lệnh, trong đó nhấn mạnh đến những thay đổi về trạng thái.
và hơn thế nữa
[...] trong mã chức năng, giá trị đầu ra của hàm chỉ phụ thuộc vào các đối số được nhập vào hàm [...]. Loại bỏ các tác dụng phụ có thể giúp dễ hiểu và dự đoán hành vi của chương trình hơn, đây là một trong những động lực chính cho sự phát triển của lập trình chức năng.
Mặt khác, nhiều cấu trúc bao đóng được cung cấp bởi các ngôn ngữ lập trình cho phép một bao đóng để nắm bắt các biến không cục bộ và thay đổi chúng khi đóng được gọi, do đó tạo ra hiệu ứng phụ trên môi trường mà chúng được xác định.
Trong trường hợp này, các bao đóng thực hiện ý tưởng đầu tiên về lập trình chức năng (các hàm là các thực thể hạng nhất có thể được di chuyển xung quanh như các giá trị khác) nhưng bỏ qua ý tưởng thứ hai (tránh tác dụng phụ).
Việc sử dụng các bao đóng này với các tác dụng phụ được coi là kiểu chức năng hay là các bao đóng được coi là một cấu trúc tổng quát hơn có thể được sử dụng cho cả kiểu lập trình chức năng và không chức năng? Có tài liệu nào về chủ đề này không?
LƯU Ý QUAN TRỌNG
Tôi không đặt câu hỏi về tính hữu ích của tác dụng phụ hay việc đóng cửa với tác dụng phụ. Ngoài ra, tôi không quan tâm đến một cuộc thảo luận về những lợi thế / bất lợi của việc đóng cửa có hoặc không có tác dụng phụ.
Tôi chỉ quan tâm để biết nếu sử dụng các bao đóng như vậy vẫn được coi là phong cách chức năng bởi người đề xuất lập trình chức năng hay ngược lại, việc sử dụng chúng không được khuyến khích khi sử dụng một phong cách chức năng.