FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Llamar al Set desde el Get
Hola a todos
Estoy creando un objeto que hereda de un OCX. Se trata, entre otras cosas, de controlar con mi programa el estado de una máquina... Yo quiero que la máquina (una especie de teléfono) sea controlada por el programa y no por el usuario Pero el usuario puede (aunque no debe) "meter mano"... Os pongo un código de ejemplo: La declaración:
Y la implementación:
Tengo definida una propiedad para el estado, y el programa es el que lo gestiona. Mi duda es: he puesto en el GetEstado una comprobación. Miro si el estado registrado en mi programa es el mismo que el estado real del teléfono (por si el usuario...). Si no es igual hago una llamada al SetEstado y lo cambio. ¿Es correcto llamar al Set desde el Get? No sé si me he explicado bien ... Os agradeceré cualquier sugerencia... Un saludo
__________________
La violencia es el último recurso del incompetente. (Salvor Hardin) |
#2
|
||||
|
||||
Cita:
Por otra parte, creo, aunque puedes probarlo para confirmarlo, que si desde el Get Accedes a la propiedad eso te va a provocar que "entres" otra vez en el Get y así sucesivamente, lo que te podría provocar un bucle infinito.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#3
|
||||
|
||||
Hola Neftali
Gracias por contestar. Ya está probado (con el código real) Uso la propiedad (Estado := Result) para que salte el Set... lo necesito para que ponga el teléfono en el estado... Tuve un bucle... porque en el Set preguntaba por el valor de la propiedad (primera línea) en vez de por la variable... Mi duda está realmente en el concepto (porque el código, funcioar, funciona). Es decir, en un "sitio" donde recupero un valor... lo cambio también (y antes de devolverlo)... ¿¿??
__________________
La violencia es el último recurso del incompetente. (Salvor Hardin) |
#4
|
||||
|
||||
Sinceramente no lo sé. Pero en mi humilde opinión no es lógico que se cambie un valor al leerlo.
¿por qué el estado no es el correcto ? Creo que ese código debe ir en otro sitio, es decir, en el constructor, o bien en una propiedad del tipo Active := true / false o en un método llamado OpenTelephone En el constructor pones Festado en eDesconocido En el método OpenTelephone, modificas el estado (es lógico hacer esto aqui), incluso puede ser una función que devuelva TRUE / FALSE si todo ha ido bien. en el GetEstado, solo devuelves el valor de FEstado, ya que: - Si no se ha llamado a OpenTelephone devolverá eDesconocido - Si se ha llamado al método, devolverá el valor detectado en ese método. Ya veremos que opinan los demás Un saludo |
#5
|
||||
|
||||
Hola Lepe
A ver cómo me explico... El código que he colgado es un ejemplo simplificado... Efectivamente en el constructor hay... de todo ¡buff! pero eso "no importa" La cuestión es: el estado puede cambiar porque el usuario "meta la mano" donde no debe (no puedo evitarlo, y lo hacen), pero mi aplicación es "la que sabe" en qué estado debería de estar (hay muchos más estados...) y también tengo implementado (en real) un control de "errores" sobre las funciones/procedimientos del OCX... Quiero decir (que me voy por las nubes), cuando en mi programa consulto el estado tengo dos: el real (en el que está el teléfono) y el último que yo forcé con la alpicación. Pueden ser iguales ¡bien! o no. Si no son iguales..... tengo 2 opciones: 1. Poner el estado de mi variable = al real 2. al revés, forzar al teléfono a ponerse en el estado que marca la variable. Yo he elegido la segunda opción (porque el usuario no debería tocar nada). Lo que pasa es que "me se" ocurrió forzarlo en el propio Get... y "me sonó raro". Me resulta algo así como "contraintuitivo" (mira que soy pedante)... y por eso os preguto vuestra opinión (no porque no me funcione, sino porque el saber no ocupa lugar ) Así que, después del plastazo que acabo de postear, ... pues eso: A ver qué pensáis Saludos.
__________________
La violencia es el último recurso del incompetente. (Salvor Hardin) |
#6
|
||||
|
||||
Entonces solo queda hacer algo así:
Sé que me vas a mandar a paseo por esta respuesta, ya que es idéntico a tu solución, pero no sé .... ¿parece más "elegante"? Si no estas de acuerdo no te molestes en contestar.... ya sé que lo que vas a decir |
#7
|
||||
|
||||
La cosa es muy simple:
- Get es obtener el valor - Set es asignarlo O sea: - JAMAS JAMAS JAMAS en un get se debe alterar el comportamiento/estado interno de un objeto - JAMAS ignorar el punto anterior. Get es acceso de SOLO LECTURA - En un set se DEBERIA leer la variable privada que guarda el ultimo valor (FEstado) por la simple y sencilla razon que el Get puede tener efectos sobre el componente, aun sin cambiar el estado de la varible. Lo que estas buscando NO es un get ni un set. Es un procedimiento. En un procedimiento APARTE: procedure DeterminarEstado begin //Haz lo que necesites end; Es OO basica independizar propiedades de eventos de procedimientos. Nunca mezclarlos para evitar dolores de cabeza. Por lo tanto Estado debe retornar el estado del objeto. Mas bien deberias tener una funcion que devuelva el estado asignado por el usuario y en el metodo DeterminarEstado lees ambos y luego operas esta informacion y la asignas al estado Interno (propiedad estado) del objeto. De hecho, estas MEZCLANDO DOS cosas. UNA es el objeto interno de tu programa. OTRA es la maquina externa. O sea, DEBERIAS tener 2 clases para representar ambas realidades y UNA clases que controle ambas. O sea: TMiObjeto = class(TElOCX) //Heredo de un OCX // Representa el mundo interno de tu sistema TMiTelefono = class(TElOCX) //Heredo de un OCX // Representa el mundo real del telefono Por eso, cuando empiezes a sentir que una clases hace mas de un solo trabajo entonces la solucion es hacer una clase por trabajo. Y debe haber una controladora entre ellas. Es un poco mas de codigo pero es mas facil de entender y mejorar...
__________________
El malabarista. |
#8
|
||||
|
||||
Cita:
Es decir, a ver si me explico: AHORA: Tu almacenas un valor y al consultalo (GET) compruebas y devuelves el correcto. VARIANTE: ¿Porque no hacer lo mismo en el SET? Al hacer el SET comprobar y guardar el valor correcto, así en el GET ya no deberías coprobar ni cambiar nada, sólo devolver lo que hay. Es lo mismo que está haciendo tú (que como ya te he dicho no lo veo incorrecto, sólo un poco raro ) pero en lugar de en el GET, en el SET. No se si me he explicado bien, espero que me entiendas.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#9
|
||||
|
||||
Hola mamcx
Esa es la cuestión. Tal y como cita Neftali (hola de nuevo) de mi primer post: "Mi duda está realmente en el concepto (porque el código, funcionar, funciona). Es decir, en un "sitio" donde recupero un valor... lo cambio también (y antes de devolverlo)" En cuanto a lo de crear 2 clases... tengo que pensar en ello con más calma, pero apriori (en este caso) no me convence. ¿Por qué? Pues porque realmente la clase hace "un solo trabajo" pero (siempre hay un pero) como el usuario puede con sus propias manos tocar y cambiar.... estaba buscando maneras de minimizar sus efectos... y, de rebote, llegué a este tema. Se me ocurrió que, sin encomendarme a Dios ni al Diablo, podía "pasarme por la piedra" el estado real y poner el que yo quiero. Es decir que, como "no me importa" el real, cada vez que quiera saber el estado del objeto reviso el real y lo cambio directamente (porque, repito, el estado real NO importa) matando dos pájaros de un tiro. ¡buff! me resulta un poco difícil explicarlo... pero seguiré dándole vueltas (es bueno pensar de vez en cuando)... En cualquier caso me resulta algo, como decía antes, raro (el hacerlo así) y por eso abrí este hilo
__________________
La violencia es el último recurso del incompetente. (Salvor Hardin) |
#10
|
||||
|
||||
Hola marto
Pues sí... buen link... Lo que me pasa es algo parecido... pero yo no puedo tener un semáforo que me diga si algo ha cambiado porque los cabios no se hacen a través de la aplicación sino a mano (literalmente) por el usuario... pero el "recalculate" de Ian sería el "UpdateEstado" del que escribía Neftali más arriba pero puesto en el Get no en el Set ¿no?
__________________
La violencia es el último recurso del incompetente. (Salvor Hardin) |
|
|
|