Bất kỳ thay thế thực tế nào cho mô hình Tín hiệu + Slots cho lập trình GUI?


9

Phần lớn các Bộ công cụ GUI hiện nay sử dụng mô hình Tín hiệu + Slots. Đó là Qt và GTK +, nếu tôi không sai, người tiên phong cho nó.

Bạn biết đấy, các vật dụng hoặc các đối tượng đồ họa (đôi khi cả những vật thể không được hiển thị) gửi tín hiệu đến trình xử lý vòng lặp chính. Trình xử lý vòng lặp chính sau đó gọi các sự kiện , cuộc gọi lại hoặc vị trí được gán cho đối tượng widget / đồ họa đó. Do đó, thường virtualcó các trình xử lý sự kiện mặc định (và trong hầu hết các trường hợp ) đã được bộ công cụ cung cấp để xử lý tất cả các tín hiệu được xác định trước, do đó, không giống như các thiết kế trước đó mà nhà phát triển phải viết toàn bộ vòng lặp chính và trình xử lý cho mỗi và mọi thông báo (nghĩ WINAPI), nhà phát triển chỉ phải lo lắng về các tín hiệu anh ta cần để thực hiện chức năng mới trên.

Bây giờ thiết kế này đang được sử dụng trong hầu hết các bộ công cụ hiện đại theo như tôi biết. Có Qt, GTK +, FLTK, v.v ... Có Java Swing. C # thậm chí có một tính năng ngôn ngữ cho nó (các sự kiện và đại biểu) và Windows Forms đã được phát triển trên thiết kế này. Trong thực tế, trong thập kỷ qua, thiết kế này để lập trình GUI đã trở thành một loại tiêu chuẩn bất thành văn. Vì nó làm tăng năng suất và cung cấp sự trừu tượng lớn hơn.

Tuy nhiên, câu hỏi của tôi là:

Có bất kỳ thiết kế thay thế, đó là song song hoặc thực tế cho lập trình GUI hiện đại?

tức là thiết kế Tín hiệu + Slots, thiết kế duy nhất trong thị trấn? Có khả thi để làm Lập trình GUI với bất kỳ thiết kế nào khác không? Có bất kỳ bộ công cụ GUI hiện đại (tốt nhất là thành công và phổ biến) được xây dựng trên một thiết kế thay thế không?


Mô hình hàng đợi tin nhắn mà bạn tìm thấy trong Windows API không giống như các sự kiện và đại biểu. Các đại biểu được gọi một cách đồng bộ và ngay lập tức, giống như std::function, không phải là tín hiệu không đồng bộ. Bên cạnh đó, WinAPI không cung cấp DefWindowProcđó xử lý thông điệp của Windows như một thực hiện mặc định. Vì vậy, tôi sẽ khẳng định rằng câu hỏi của bạn dựa trên logic thiếu sót.
DeadMG

2
QT và GTK + khác xa với các khung GUI đầu tiên sử dụng phương pháp tiếp cận theo hướng sự kiện. Khái niệm này quay trở lại Smalltalk-80 ( en.wikipedia.org/wiki/Smalltalk ).
Doc Brown

Câu hỏi thú vị, tôi tò mò nếu model này thay đổi nhiều với giao diện cảm ứng đa điểm.
Ben DeMott

Tôi sẽ hào phóng và cho rằng anh ta biết về SendMessage, đó là sự đồng bộ, không chỉ là PostMessage. Tuy nhiên, anh ta vẫn sai ở chỗ bạn không bao giờ phải viết toàn bộ vòng xử lý tin nhắn cho mỗi tin nhắn.
gbjbaanb

JavaFx cung cấp một cơ chế tương tự thông qua các API Bindings của nó.
Eng.Fouad

Câu trả lời:



5

Đó là một chủ đề yêu thích của tôi và trong khoảng một thập kỷ (từ 70 đến 86) tôi nghĩ rằng có một GUI bao gồm các đối tượng phản ứng với các sự kiện là cách đúng đắn để làm điều đó.

Sau đó, tôi tình cờ tìm thấy một cách khác để làm điều đó được mô tả ở đây và với một dự án sourceforge ở đây .

Tóm lại, vấn đề với các đối tượng là chúng vẫn tồn tại và nếu bạn viết mã để tạo chúng, bạn cũng phải viết mã để sửa đổi chúng tăng dần nếu cần thay đổi và bằng cách nào đó nhận được tin nhắn đến và từ chúng. Sẽ không tốt sao nếu bạn chỉ có thể vẽ những gì bạn muốn, và sau đó sơn lại nếu bạn muốn một cái gì đó khác biệt, và không phải lo lắng về sự bền bỉ của các đối tượng trước? Sẽ không tốt sao nếu bạn không bao giờ phải viết mã để xử lý tin nhắn, bởi vì tất cả đều được thực hiện dưới mui xe?

Đó là những gì gói đó làm. Đối với các hộp thoại đơn giản, nó lưu một thứ tự cường độ trong mã. Đối với các hộp thoại thay đổi động phức tạp, nó làm cho chúng có thể.

PS Tôi chỉ làm điều này cho UI máy tính để bàn và UI thiết bị đầu cuối từ xa, không phải UI giao diện web. Tôi chắc chắn là có thể, nhưng tôi chưa có cơ hội để thử nó.


+1, nhưng làm thế nào có thể đạt được chức năng bổ sung, chẳng hạn như đầu vào do người dùng xác định?
Người học việc

@Inter liềnHacker: Tôi không chắc ý của bạn là gì do người dùng xác định đầu vào. Bạn có nghĩa là có một ứng dụng thiết kế mẫu?
Mike Dunlavey

2

Chà, có hai cách khác nhau để nói về điều này:

  1. Có mọi tiện ích hiển thị cơ chế đăng ký chi tiết (Tín hiệu / Khe cắm, Người quan sát / Có thể quan sát, Sự kiện / Đại biểu) và đăng ký mã khách hàng và thực hiện hành động tương ứng.
  2. Đã xây dựng một tiện ích chống lại sự trừu tượng hóa dữ liệu mà nó trình bày và có mã máy khách thực hiện sự trừu tượng hóa đó.

Đây là một ví dụ cho cách tiếp cận thứ hai:

interface Action {
     void execute();
     Bool isEnabled();
     Null<String> description();//used for tooltip
}
interface LabledAction extends Action {
     String getName();
}

Và bây giờ bạn có thể xây dựng mã LabelButtonchống lại LabledActionvà mã máy khách chỉ có thể triển khai nó hoặc sử dụng một số triển khai mặc định chung, nếu có sẵn và phù hợp.

Theo một cách nào đó, cách tiếp cận thứ hai ít linh hoạt hơn, nhưng cứng nhắc hơn. Bạn không chỉ bằng cách nào đó kết nối khung nhìn với mô hình thông qua các phương tiện tương đối nguyên tử. Bạn thiết kế một GUI phù hợp dựa trên yêu cầu của bạn và sau đó bạn triển khai các bộ điều hợp giữa GUI đó và logic miền / ứng dụng của bạn.


Model / View / Controller là tốt, nhưng nó chỉ là một phần mở rộng của mẫu quan sát viên, bởi vì phần điều khiển chỉ là một người quan sát của widget và trong phần mô hình, widget là người quan sát mô hình, vì vậy nó có cùng cơ chế theo cách khác .
Jan Hudec

1

Một vài hệ thống loại điều khiển sử dụng cách tiếp cận cơ sở dữ liệu - mỗi điều khiển gui được liên kết với một tệp trong cơ sở dữ liệu để Gui luôn phản ánh trạng thái cơ sở dữ liệu. Móc DB được sử dụng để kích hoạt các chức năng khi giá trị thay đổi.


4
Đây không phải là khe tín hiệu chỉ với một lớp DB bổ sung sao?
ratchet freak

Cuối cùng, bên dưới tất cả đều bị gián đoạn hoặc gọi lại - chúng là các hoạt động không đồng bộ ở mức độ thấp duy nhất
Martin Beckett
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.