Pregunta

Estamos usando Qt que ofrece señales y ranuras que encuentro en realidad conveniente.Sin embargo, un gran poder conlleva una gran responsabilidad y creo que es muy fácil abusar de esta característica.

¿Existen mejores prácticas para el uso de ranuras de señal?Me está costando encontrar algunas pautas generales de esta manera.Algunas preguntas (sobre las que tengo opiniones claras, 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 asumir que se manejará una señal?
  • ¿Se pueden utilizar señales para iniciar acciones?P.ej. signal displayInfoScreen() debe ser manejado por una ranura que muestra una pantalla de información.

Cualquier otra opinión sobre cuándo se deben/no se deben usar las señales es muy ¡bienvenido!

¿Fue útil?

Solución

  

¿Está bien usar señales reportar
  errores?

Si, por ejemplo, ver reúnan las condiciones establecidas, en donde la señal de hecho lleva a un estado. No lleva el error real, sólo la información que ha ocurrido un error.

  

¿Es correcto asumir que una señal se   ser manejado?

No. El remitente no puede asumir que, sin embargo, su aplicación en particular puede depender de ello. Por ejemplo, la representación de QAction Archivo - Nuevo debe ser manejada para la aplicación al trabajo, pero el objeto QAction sin cuidado

.
  

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

Una vez más, si, por ejemplo, el objeto QAction. Pero si usted quiere ser capaz de reutilizar los componentes, se debe tener cuidado para asegurar que la clase real no depende de él.

Otros consejos

Las señales y ranuras son poderosos porque los objetos desacopla. No se puede asumir que una señal ha conectado una ranura, como respondida anteriormente.

Un inconveniente importante de diseño de señal / ranura basada es que puede realizar un seguimiento muy fácil suelto de la lógica que ha implementado , ya que una acción de un objeto puede desencadenar otras acciones de cualquier otro objeto que está conectado a una señal emitida. Es mucho más fácil tener efectos secundarios no deseados, las llamadas recursivas, etc.

  

¿Es correcto asumir que será manejado una señal?

No, no es. Las señales se dispara y olvida tipo de cosas. Que se conecte a una señal y lo que no debe ser la preocupación del emisor.

  

¿Está bien usar señales de errores del informe?

Sí, pero sería en general que esta situación sea dependiente. Si el error se puede producir de forma asíncrona, entonces una señal para indicar tal es sin duda adecuado. Si el error sólo se produce cuando el código de cliente llama a una función determinada, entonces el error debe estar en la respuesta de esa función, no como una señal. Sin embargo, hay una amplia gama de situaciones en el medio que se podría hacer en una base de caso por caso.

Además, los mecanismos de intervalo de la señal puede hacer que la comunicación entre subprocesos más fácil (que bien podría ser considerado el caso asíncrono), y los utilizarán para ese propósito (error o no).

  

¿Es correcto asumir que será manejado una señal?

Las señales son (filosóficamente) diseñado para indicar que algo ha sucedido. Como otros han indicado, que nunca es una buena idea asumir que una señal se corresponde con una ranura, o incluso con sólo un otra ranura.

  

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

Las señales se puede utilizar para iniciar acciones, pero probablemente no en la forma en que están pensando. La señal indica que foo ha sucedido. Si el código de seguimiento de su clase decide que cuando foo que sucede, un cuadro de diálogo se debe mostrar, a continuación, se utiliza la señal para iniciar la acción. Sin embargo, no es por lo general la responsabilidad de la clase que emite la señal para asegurar que se produce la acción adecuada, ya que no es responsable de hacer que la acción. (Si lo era, entonces debería ser parte de la misma clase, y no se necesitaría ninguna señal.)

Signals / ranuras (también llamados eventos) son una forma buena para eliminar el acoplamiento entre los objetos.

Por ejemplo, en lugar de tener puntos de vista que entender cómo funciona el modelo, y cuando los cambios de modelo, que "escuchan" al modelo. El modelo es responsable de decir cuando cambia, lo que cambia.

El problema con los eventos es la hora de diseñar sus eventos con los requisitos del cliente. Por ejemplo, no debe tener una señal de displayInfoScreen porque supone algo acerca de los objetos que utilizan esta señal. En su lugar, debe ser infoChanged y la InfoScreenDisplayer escucha esta señal para mostrar en la pantalla. Si se necesita, se puede añadir más tarde, un InfoTweeterPoster que publicar la información en Tweeter cuando cambien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top