2010-06-09 31 views
7

Một nhà phát triển cấp cao trong nhóm của tôi đã sử dụng ứng dụng Q2 truyền thống C-style callbacks trong ứng dụng Qt của chúng tôi thay vì sử dụng cơ chế tín hiệu/khe Qt.Tôi có nên sử dụng cơ chế tín hiệu/khe Qt qua các cuộc gọi lại truyền thống không?

Phản xạ đầu tiên của tôi là thay thế mã của anh ấy và sử dụng tín hiệu/khe Qt thay thế.

Có lý do nào tốt để sử dụng gọi lại trong ứng dụng/thư viện Qt không?

Cảm ơn.

+0

Cẩn thận với việc sử dụng cụm từ của bạn, thay đổi từ cuộc gọi lại kiểu C thành tín hiệu/vị trí âm thanh giống như viết lại không phải là trình cấu trúc lại trong trường hợp này. Nếu bạn đang thay đổi mã trong một thư viện, bạn có thể lấy đi bằng một trình tái cấu trúc, nhưng nếu nó được sử dụng trong suốt ứng dụng của bạn, bạn có nhiều khả năng sẽ chuyển sang lãnh thổ viết lại. Tôi không có ý cầu kỳ, nhưng mọi người thường lạm dụng thuật ngữ refactor chỉ để thay đổi. –

+1

Mã nằm bên trong một thư viện cụ thể. Ở những nơi khác, chúng tôi đang sử dụng tín hiệu và khe. Cám ơn bạn đã góp ý. –

Trả lời

18

Tôi nghĩ cách tiếp cận tốt hơn là nắm lấy khung bạn đang sử dụng và sử dụng tín hiệu/khe.

Điều đó đang được nói, nếu mã trong câu hỏi hoạt động, và không phải là xấu hoặc gây ra vấn đề, thì tốt nhất bạn nên để nó một mình.

Tư vấn Signal/Slot documentation mô tả tại sao/Khe cắm tiếp cận tín hiệu là tốt hơn:

Callback có hai sai sót cơ bản: Thứ nhất, họ không loại an toàn. Chúng tôi không bao giờ có thể chắc chắn rằng chức năng xử lý sẽ gọi lại số gọi với các đối số chính xác. Thứ hai, gọi lại mạnh mẽ kết hợp với chức năng xử lý vì chức năng xử lý phải biết gọi lại để gọi.

Do nhận thức được những điều sau đây mặc dù:

So với callbacks, tín hiệu và khe cắm là hơi chậm vì sự linh hoạt tăng mà họ cung cấp

Tốc độ có lẽ không quan trọng đối với hầu hết các trường hợp, nhưng có thể có một số trường hợp cực đoan gọi lặp lại tạo nên sự khác biệt.

+2

+1 cho cả việc chấp nhận khung công tác và để mọi thứ giống như chúng. – OregonGhost

+9

Tài liệu không thực sự chính xác. Gọi lại thực tế là an toàn, trừ khi bạn sử dụng reinterpret_casts. Và với reinterpret_casts, tín hiệu/khe cũng không an toàn. Chức năng xử lý chắc chắn không cần phải biết gọi lại để gọi. Trong thực tế, việc thực hiện callbacks phổ biến nhất không - người gọi chuyển một con trỏ hàm cho callback. – MSalters

+0

@MSalaters: Đồng ý –

2

Bạn nên phân biệt giữa các cuộc gọi lại đồng bộ và được sử dụng để trả lại kết quả hoặc bộ t gradnh dần (nhiều mục, như cặp <> nhưng nhiều hơn) và gọi lại là ghép nối không đồng bộ. Tín hiệu/khe thường nên được sử dụng cho sau này. Đối với cái trước, nó có thể có ý nghĩa theo cách phụ thuộc vào việc nó là một chức năng chính của ứng dụng của bạn (sử dụng tín hiệu/khe) hay giao diện của một thư viện không phải GUI có thể di động hơn (sử dụng callbacks thẳng cho đồng bằng C/C++ mã di động).

Nói chung, tôi có các quy tắc thiết kế lập trình ngắn gọn có xu hướng trỏ đến bất kỳ thứ gì phức tạp và ít nhất là mã/giao diện phức tạp. Đối với trường hợp trả về tuple, tôi thường sử dụng QMap thay vì tạo ra một định nghĩa lớp khác hoặc phương thức signal/slot hoặc callback. Điều này hoạt động tốt cho các tham số bundling và passing, đặc biệt là cho những thứ cần phải phát triển trong các phần khác nhau của hệ thống.

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