2014-04-09 18 views
7

Nếu trạng thái được coi là một ý tưởng tồi cho các chức năng tại sao nó được coi là có trạng thái khi bạn sử dụng một MailboxProcessor?F # MailboxProcessor và thiết kế chức năng

Để mở rộng, tôi đã giải thích lập trình chức năng cho ai đó, cách chức năng không sử dụng trạng thái (không có biến ngoài hàm - tức là dữ liệu giống nhau cho cùng một dữ liệu) và những điều tốt đẹp mang lại. Nhưng sau đó tôi đã suy nghĩ về MailboxProcessor và cách nó sử dụng đệ quy để duy trì trạng thái giữa các cuộc gọi chức năng, và tôi không thể hoàn toàn hòa giải tại sao nó không quan trọng trong tình huống đó.

Trường hợp đó có phải là cách ít nhất để duy trì trạng thái không?

Trả lời

13

Điều ác thực sự là trạng thái có thể chia sẻ được chia sẻ. Trong trường hợp một luồng, trạng thái có thể thay đổi được chia sẻ có nghĩa là các hàm không thể được soạn thảo một cách an toàn - bởi vì một cuộc gọi có thể sửa đổi một số trạng thái mà sau đó được đọc bởi cuộc gọi thứ hai và bạn sẽ nhận được kết quả không mong muốn. Trong trường hợp nhiều luồng, trạng thái có thể thay đổi được chia sẻ có nghĩa là bạn có tiềm năng cho điều kiện chủng tộc.

Lập trình chức năng thường tránh đột biến. Các hàm vẫn có thể chia sẻ một số trạng thái (ví dụ như đóng cửa có thể nắm bắt trạng thái), nhưng nó không thể bị biến đổi. Trong trường hợp đơn luồng, cũng không có sự không xác định. Trong trường hợp đa luồng, khá nhiều thứ duy nhất mà bạn có thể làm trong phong cách chức năng thuần túy là thực hiện song song nối (và dữ liệu song song) mà không cần trạng thái có thể thay đổi và hoàn toàn xác định được.

Lập trình dựa trên đại lý cũng tránh trạng thái có thể chia sẻ được chia sẻ nhưng theo cách khác. Bạn có các đại lý bị cô lập chỉ có thể chia sẻ bất biến thư. Vì vậy, có một số không xác định (vì chúng giao tiếp bằng cách gửi tin nhắn), nhưng chúng chỉ trao đổi các giá trị bất biến. Trong thực tế, bạn thậm chí có thể sử dụng trạng thái có thể thay đổi bên trong một tác nhân - miễn là nó không được chia sẻ, bạn vẫn tránh trạng thái có thể thay đổi được chia sẻ.

+0

nhiều hơn về trạng thái diễn viên và không xác định [ở đây] (http://james-iry.blogspot.com/2009/04/erlang-style-actors-are-all-about.html) và [tại đây] (http://pchiusano.blogspot.com/2013/09/actors-are-overly-nondeterminstic.html) – eulerfx

Các vấn đề liên quan