Tôi đang thiết kế một gói mà tôi muốn cung cấp một API dựa trên mẫu người quan sát: có nghĩa là, có những điểm mà tôi muốn phát ra tín hiệu sẽ kích hoạt số không hoặc các bên quan tâm hơn. Những bên quan tâm đó không nhất thiết cần phải biết về nhau.Có cách nào ưu tiên để thiết kế các API tín hiệu hoặc sự kiện trong Go?
Tôi biết tôi có thể triển khai API như thế này từ đầu (ví dụ: sử dụng bộ sưu tập kênh hoặc chức năng gọi lại), nhưng đã tự hỏi liệu có cách nào thích hợp hơn để cấu trúc các API đó hay không.
Trong nhiều ngôn ngữ hoặc khuôn khổ tôi đã từng chơi, đã có các cách tiêu chuẩn để xây dựng các API này để chúng hoạt động theo cách người dùng mong đợi: ví dụ: các hàm g_signal_*
cho các ứng dụng dựa trên glib, các sự kiện và addEventListener()
cho các ứng dụng JavaScript DOM hoặc các đại biểu multicast cho .NET.
Có điều gì tương tự cho Go không? Nếu không, liệu có cách nào khác để cấu trúc loại API này là thành ngữ hơn trong Go?
Tôi nghĩ rằng câu trả lời này bao gồm một số trường hợp sử dụng, nhưng tôi chắc chắn muốn nghe thêm ý kiến / câu trả lời về vấn đề này. Các kênh gây thêm gánh nặng cho người gọi ("người quan sát"), vì nó phải bắt đầu một goroutine chờ đợi trên kênh này. Nếu cùng một chức năng có thể xử lý nhiều "sự kiện", điều này có thể trở nên rườm rà. Như một ví dụ ngược lại, các cuộc gọi lại được sử dụng trong net/http cho các trình xử lý HTTP. Có những trường hợp sử dụng mà chúng làm cho IMHO có ý nghĩa hơn. – mna
Tôi chỉ sử dụng thuật ngữ "quan sát mẫu" vì nó là thuật ngữ mà mọi người có thể hiểu: Tôi không viết các chương trình của tôi bằng cách phá vỡ chúng thành các mẫu thiết kế có tên, nếu đó là những gì bạn nhận được. Theo như đề xuất API của bạn, tôi có thể thấy cách một hàm trả về các kênh đọc có thể hoạt động cho phía đăng ký, nhưng bạn sẽ mô hình hóa API hủy đăng ký phù hợp như thế nào? –
Các kênh có thể so sánh được với sự bình đẳng và chúng là đối tượng lớp đầu tiên. Để hủy đăng ký, chỉ cần chuyển kênh trở lại nhà xuất bản, nó có thể tìm thấy hồ sơ của kênh và thực hiện hành động thích hợp để chấm dứt đăng ký. – Sonia