5

Tôi đang gặp sự cố khi viết mã GUI theo định hướng sự kiện theo kiểu chức năng, sử dụng Clojure và Seesaw. Cụ thể, tôi không thể tìm ra cách vượt qua trạng thái của chương trình xung quanh mà không sử dụng globals, hoặc một số hack khó chịu khác. Cách tiếp cận hiện tại của tôi là một cái gì đó như thế này:Lập trình hướng sự kiện chức năng

(defn event-handler [gui-state event] 
    (update-gui! (get-new-state gui-state event))) 

(defn update-gui! [gui-state] 
    (remove-all-listeners (gui-state :button)) 
    (seesaw.core/listen (gui-state :button) 
         :action 
         (partial event-handler gui-state))) 

Nó đặt một event listener trên các thành phần có liên quan, với một chức năng áp dụng một phần để thúc đẩy nhà nước và cập nhật gui, bao gồm loại bỏ người nghe cũ. Mặc dù điều này dường như đang hoạt động, tôi không thực sự thích nó, một phần vì tôi không thể truyền người nghe trong trạng thái (vì nó không được xây dựng cho đến sau khi tôi đã định nghĩa trạng thái), vì vậy hãy loại bỏ người nghe cũ yêu cầu xóa tất cả người nghe, điều này có thể gây ra sự cố khi chương trình phát triển.

Giải pháp gần nhất mà tôi tìm thấy trực tuyến là ở this answer, nhưng tôi không biết cách xử lý các sự kiện dưới dạng luồng như hiển thị. Tôi chắc chắn phải có một giải pháp tốt hơn cách tiếp cận hiện tại của tôi, nhưng tôi không thể hiểu được điều gì.

Có ai có thể chỉ cho tôi cách tôi có thể trả lời các sự kiện nhập của người dùng trong khi vẫn theo một kiểu chức năng không?

Trả lời

1

Luồng từ câu trả lời được liên kết có vẻ giống như một kênh analog.async.

Thay vì xóa tất cả người nghe, mỗi sự kiện có thể chuyển vào một kênh có chi tiết sự kiện được đặt vào đó. Cùng một kênh nên đi đến xử lý logic của nút, nơi nó sẽ liên tục được lấy từ.

+0

Điều đó dường như hoạt động và khá đơn giản. Cảm ơn. – resueman

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