2010-02-24 15 views
22

Estamos utilizando Qt que ofrece señales y ranuras que me parece realmente conveniente. Sin embargo, con un gran poder viene una gran responsabilidad y creo que es muy fácil también hacer un mal uso de esta característica.Cuándo usar señales y ranuras y cuándo no a

¿Existen mejores prácticas para el uso de la ranura de señal? Me está costando encontrar algunas pautas generales de esta manera. Algunas preguntas (tengo opiniones claras sobre, pero con las que no todos los miembros de mi equipo están de acuerdo):

  • ¿Está bien utilizar señales para informar errores?
  • ¿Está bien suponer que se manejará una señal?
  • ¿Se pueden usar señales para iniciar acciones? P.ej. signal displayInfoScreen() debe ser manejado por una ranura que muestra una pantalla de información.

Cualesquiera otras opiniones sobre cuándo deberían/​​no deberían usarse señales son muy bienvenidos!

Respuesta

12

¿Está bien usar señales reportar
errores?

Sí, por ejemplo, vea QFtp, donde la señal de hecho lleva un estado. No lleva el error real, solo la información que ha ocurrido un error.

¿Está bien suponer que se manejará una señal ?

No. El remitente nunca puede asumir que, sin embargo, su aplicación particular puede depender de ello. Por ejemplo, la QAction que representa Archivo - Nuevo necesita ser manejada para que la aplicación funcione, pero al objeto QAction no le importaría menos.

¿Se pueden utilizar las señales para iniciar acciones? P.ej. señal displayInfoScreen() debe ser manejado por una ranura que muestra una pantalla de información.

Nuevamente, sí, por ejemplo, el objeto QAction. Pero si desea poder reutilizar componentes, debe tener cuidado de asegurarse de que la clase real no dependa de ella.

+0

Aceptado como esta respuesta proporcionó ejemplos claros de usos en Qt. ¿Crees que los errores están bien, pero solo cuando el procesamiento es asincrónico? – larsmoa

+0

Gracias! Y, sí, de lo contrario, agregue un valor de retorno de estado o un argumento de estado (como lo hace QString :: toInt). – e8johan

10

¿Está bien suponer que se manejará una señal?

No, no lo es. Las señales son cosas que se olvidan y se olvidan. Quién se conecta a una señal y qué hace no debería ser la preocupación del emisor.

3

Las señales/slots (también llamados eventos) son una buena manera de eliminar el acoplamiento entre objetos.

Por ejemplo, en lugar de tener vistas que entienden cómo funciona el modelo, y cuando el modelo cambia, "escuchan" el modelo. El modelo es responsable de decir cuándo cambia, qué cambia.

El problema con los eventos es cuando diseñas tus eventos con los requisitos del cliente. Por ejemplo, no debería tener una señal displayInfoScreen porque asume algo acerca de los objetos que usan esta señal. En su lugar, debe ser infoChanged y InfoScreenDisplayer escucha estas señales para mostrarlo en la pantalla. Si lo necesita, puede agregar más tarde un InfoTweeterPoster que publique la información en Tweeter cada vez que cambien.

+6

Escribes ak.a. eventos, pero eso no es cierto. Qt viene con una infraestructura de eventos separada. – e8johan

11

Las señales y las ranuras son potentes porque desacopla objetos. No puede suponer que una señal tiene una ranura conectada, como se respondió previamente.

Un inconveniente importante del diseño basado en señal/ranura es que puede perder fácilmente la lógica de la implementación, ya que una acción de un objeto puede desencadenar otras acciones de cualquier otro objeto que se conecte a una señal emitida. Es mucho más fácil tener efectos secundarios no deseados, llamadas recursivas, etc.

5

¿Está bien utilizar señales para informar errores?

Sí, pero generalmente haría que esta situación dependa. Si el error puede ocurrir de manera asíncrona, entonces una señal para indicarlo es definitivamente correcta. Si el error solo ocurre cuando el código del cliente llama a una determinada función, entonces el error debe estar en la respuesta de esa función, no como una señal. Sin embargo, hay una gran variedad de situaciones intermedias que podrían hacerse caso por caso.

Además, los mecanismos de ranura de señal pueden facilitar la comunicación entre hilos (lo que bien podría considerarse el caso asíncrono), y los usaré para ese propósito (error o no).

¿Está bien suponer que se manejará una señal?

Las señales están (filosóficamente) diseñadas para indicar que algo ha sucedido. Como han indicado otros, nunca es una buena idea asumir que una señal se corresponderá con una ranura, o incluso con solo otra ranura.

¿Se pueden usar las señales para iniciar acciones? P.ej. signal displayInfoScreen() debe manejarse mediante una ranura que muestre una pantalla de información.

Las señales se pueden utilizar para iniciar acciones, pero probablemente no en la forma en que usted está pensando. La señal indica que foo ha sucedido. Si el código que supervisa su clase decide que cuando ocurre foo, se debe mostrar un cuadro de diálogo, luego la señal se utilizó para iniciar esa acción. Sin embargo, generalmente no es responsabilidad de la clase que emite la señal garantizar que se realice la acción adecuada, porque no es responsable de realizar esa acción. (Si lo era, entonces debería ser parte de la misma clase, y no se necesitaría ninguna señal.)

Cuestiones relacionadas