Các mẫu UI trong các ngôn ngữ chức năng


11

Tôi muốn bắt đầu nghịch ngợm với ClojureScript, nhưng tôi bối rối về một số điểm. Vấn đề của tôi là cách tốt để đối phó với những thay đổi trạng thái đến từ sự tương tác của người dùng, khi bạn cố gắng làm việc theo chức năng.

Hãy để tôi đưa ra một vài ví dụ. Tôi có trong đầu các ứng dụng chạy trên trình duyệt, nhưng tôi nghĩ vấn đề này chung chung hơn. Tất nhiên một cái gì đó sẽ thay đổi - ít nhất là DOM. Nhưng tôi muốn tìm hiểu cách tổ chức phần còn lại của mã để làm việc với các cấu trúc dữ liệu bất biến.

1) Nói rằng tôi muốn đính kèm một số sự kiện vào một số đối tượng DOM. Điều này không khó thực hiện theo cách chủ yếu là chức năng: khi bạn tạo nút, bạn đính kèm bản đồ băm với các trình xử lý sự kiện khác nhau. Nhưng hãy xem xét trường hợp bạn đang sử dụng ủy quyền sự kiện. Sau đó, khi bạn tạo một nút mới, bạn có thể đính kèm một trình xử lý sự kiện vào một số nút cha có thể đã tồn tại. Vì vậy, bạn sẽ phải thay đổi hàm băm liên quan đến nút đã tồn tại.

2) Giả sử tôi đang thiết kế một mô-đun tự động hoàn thành cho trường đầu vào. Mỗi khi người dùng nhấn một phím, tôi có thể thực hiện cuộc gọi đến máy chủ để nhận các đề xuất. Điều này thật dễ dàng. Nhưng bây giờ giả sử tôi muốn tối ưu hóa nó một chút. Nếu tôi biết tất cả các kết quả khớp foo, sẽ không có vấn đề gì khi hỏi lại tất cả các kết quả khớp foobar; Tôi chỉ có thể lọc các cựu. Vì vậy, tôi cần phải xây dựng một số loại bộ đệm. Bộ đệm này sẽ được cập nhật mỗi khi người dùng chèn một từ mới không phải là siêu từ của các từ đã nhập trước đó. Một lần nữa: làm thế nào để tôi mô hình bộ đệm? Cách hợp lý nhất có vẻ là một từ ánh xạ băm ánh xạ đến kết quả, nhưng nó có thể thay đổi được.

Bạn có thể đề xuất một số mẫu giúp kết hợp các thay đổi dễ dàng hơn do tương tác của người dùng với thiết kế chức năng không?


4
Tra cứu "Lập trình phản ứng chức năng".
dan_waterworth

Điều này không hoàn toàn giống nhau, nhưng với các mẫu XSLT (không có tác dụng phụ) phù hợp với các sự kiện DOM do người dùng khởi tạo, chúng tôi gặp phải một vấn đề tương tự trong Saxon-CE. Cách tôi muốn thấy là người dùng đang kích hoạt thay đổi trạng thái, không phải XSLT vì vậy đó là loại Ok. Điều quan trọng là đảm bảo mã quản lý tương tác người dùng và các thay đổi tiếp theo trong trạng thái rất tách biệt với phần còn lại.
pgfearo

@pgfearo Bạn có lời khuyên nào về cách tổ chức mã sao cho tương tác người dùng được giữ tách biệt với phần còn lại không?
Andrea

Không có cách nào tốt để đối phó với những thay đổi trạng thái khi bạn đang làm việc theo chức năng, vì lập trình chức năng là không trạng thái.
Old Pro

3
@Old Pro: Điều này không hoàn toàn chính xác. Trong khi trong lập trình chức năng, bạn xác định một tính toán bằng ứng dụng hàm thay vì hiệu ứng phụ, cuối cùng bạn phải lưu kết quả tính toán ở đâu đó. Trọng tâm của FP là hạn chế việc sử dụng trạng thái ở mức tối thiểu trong khi trong lập trình mệnh lệnh biến đổi trạng thái tăng dần (theo tác dụng phụ) là công cụ cơ bản để xác định tính toán.
Giorgio

Câu trả lời:


3

Như đã đề cập trong các bình luận, bạn nên tra cứu "Lập trình phản ứng chức năng" và bạn cũng nên đọc một số bài đăng tại http://prog21.dadgum.com/archives.html . Cụ thể hơn, có lẽ bạn nên đọc " Đừng yêu công nghệ của bạn ", " Viết mã như bạn vừa học cách lập trình ", " Lập trình chức năng không hoạt động (và phải làm gì với nó) " và có thể là vài cái khác

Hoàn toàn tránh được tính đột biến và tác dụng phụ thực tế là không thể. Ngay cả các lập trình viên Haskell thỉnh thoảng cũng sẽ tận dụng unsafePerformIOđể thoát ra khỏi mô hình hoàn toàn chức năng, không có tác dụng phụ, được gõ tĩnh để làm một số việc nhất định. Nếu bạn đang bắt tay vào dự án này như một bài tập học thuật thuần túy thì hãy tiếp tục và tránh khả năng biến đổi và tác dụng phụ hết mức có thể nhưng nếu bạn đang cố gắng xây dựng một sản phẩm có thể sử dụng theo thời hạn thì sẽ không có mô hình nào cứu bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.