OOP: ¿el formulario contiene una instancia de clase o la clase contiene una instancia de formulario?
Frecuentes
Visto 67 equipos
0
¿Cuál es la mejor manera (léase: la más técnicamente correcta) de manejar las GUI para los objetos de clase?
Digamos, por ejemplo, que tengo una clase para tratar con E/S. llamémoslo clsIO
. También tengo un formulario que le permite al usuario cambiar varias opciones/propiedades de esta clase, llamémoslo frmIO
. frmIO
La GUI es específica para el clsIO
, no se utilizará en ningún otro lugar de la aplicación.
Mi aplicación siempre creará una instancia de la clsIO
, cargará su configuración predeterminada y comenzará su funcionamiento. El usuario puede necesitar o no mostrar el frmIO
'formulario de configuración' para que pueda configurarlo.
Para mí, parece que la mejor manera de manejar esto es almacenar una referencia de objeto al formulario dentro de la clase y proporcionar un ShowConfigForm()
método, en lugar de instanciar el formulario, que a su vez instancia la clase.
¿Esto es diseño de sonido?
EDITAR
Planeo reutilizar esta combinación de clase/formulario en varios proyectos. Ya lo he desarrollado en su propio proyecto, por lo que puedo transferirlo/importarlo fácilmente a otros proyectos que lo requieran.
Pseudocódigo simple con mi diseño actual:
class clsIO
{
public bool Active{get;set;}
public int Port{get;set;}
public ShowConfigForm()
{
frmIO settings = new frmIO(this);
settings.Show();
}
}
class frmIO
{
private clsIO _IO;
public frmIO(clsIO IO){_IO = IO;};//constructor
private btnEnable_Click()
{
_IO.Active = true;
//etc etc
}
}
Aquí solo necesito instanciar el clsIO
. No de la otra manera.
2 Respuestas
1
De la forma en que lo ha hecho, hay un acoplamiento estrecho entre clsIO y frmIO (que es la clase GUI). Esta no es una buena práctica, ya que este estrecho acoplamiento le impedirá realizar pruebas unitarias, etc. Además, en caso de que necesite reutilizar clsIO para alguna otra operación, este estrecho acoplamiento a fromIO le impedirá hacerlo.
Es necesario que haya otra clase que los agrupe creando primero una instancia de clsIO y luego frmIO pasando la instancia de clsIO a frmIO. De esta manera, separas las preocupaciones de cada clase y le das la responsabilidad de cablear las cosas a otra, que sería más limpia.
Además, puede mejorar el diseño extrayendo una interfaz de la clase clsIO y usando el tipo de interfaz dentro de frmIO para referirse a clsIO. esto le ayudará a tener un acoplamiento flojo entre las 2 clases.
avíseme si me proporciona una muestra de código, si lo que describí no tiene mucho sentido.
Respondido 04 Jul 12, 11:07
+1 gracias puedo verlo mejor ahora. en realidad mi clsIO
en realidad también implementa una interfaz. - Simon
1
Por lo general, tendría una clase que contiene la configuración. El formulario en sí tiene una referencia a eso. settings
clase. Si el usuario cambia una configuración en el formulario, el formulario se lo dice al settings
clase / objeto.
Ahora puedes registrar tu clsIO
como observador en los escenarios. Es decir, cada vez que algo cambia, el clsIO
recibe una notificación y puede actualizar sus operaciones (de esta manera, la configuración contendría referencias a todos sus observadores). Esto se conoce como el patrón de observador. Tiene su fuerza si muchos objetos 'desconocidos' observan algo. Quiero decir, la configuración puede ser algo que impactaría en muchas clases/objetos diferentes. Los observadores solo deciden los escenarios, pero nunca los cambian.
Si desea mantenerlo simple, sin mucho esfuerzo, solo agregue una referencia a la configuración en su clsIO
. Es un diseño que puedes elegir. Este es más simple, por lo que si es una aplicación pequeña y simple, debería ser suficiente.
Pero lo que creo que realmente deberías hacer es separar la forma de los valores. Un formulario es solo una vista, mientras que los valores reales están contenidos en otra clase.
Respondido 04 Jul 12, 09:07
Creo que puede haber entendido mal mi pregunta. Mi clase de Configuración es clsIO
y, de hecho, el formulario notifica cualquier cambio a través de la GUI directamente al clsIO
. No puedo ver por qué necesitaría una alternativa, clase para manejar la interacción. - Simon
Oh bien, lo siento por eso. Leí la pregunta actualizada de nuevo. Entonces, básicamente, su clsIO siempre existe, pero frmIO solo es necesario si el usuario quiere cambiar algo. Su solución hasta ahora tiene sentido. Puedes hacerlo de esta manera. La pregunta más importante es entonces: ¿frmIO necesita acceso a clsIO o es al revés? Parece que clsIO solo lee de frmIO, pero frmIO ni siquiera sabe acerca de clsIO. Entonces parece correcto tener una referencia de clsIO a frmIO. - Slomo
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas oop user-interface or haz tu propia pregunta.
La pregunta es un poco vaga, pero me parece que tienes una solicitud en línea. que es responsable de hacer que todas esas clases funcionen juntas, y debe tener instancias de la clase I/O y la clase GUI. - Thilo
Tiene razón, digamos una aplicación winforms, pero generalmente diseñaría una clase de 'Gestión' que controla la interacción entre varias clases (
clsIO
y otros). De esta manera, la clase 'administradora' solo necesita preocuparse por los objetos de clase en lugar de la GUI. En este ejemplo particular, la GUI siempre está vinculada a la clase, pero cada uno (clsIO
efrmIO
) depende uno del otro. - Simon