PDA

Ver la Versión Completa : Como conocer que funcion invoco a otra....


oracle
15-01-2008, 15:20:52
Hola queridisimos colegas:

Esta vez traigo una sencilla pero interesante duda (por lo menos para mi).
El asunto es que por ejemplo tengo una Clase A, y esta clase dentro tiene una funcion F();

Supongamos que yo utilizo dicha funcion F1() en dos funciones mas F2() y F3() que no necesariamente estan dentro de mi clase A, pueden estar en otra cualquiera. El asunto es que yo necesito conocer dentro de la Funcion F1() cual de estas dos funciones F2() o F3() la invoco para de ahi en adelante determinar un comportamiento condicionado por la funcion que realizo la llamada a F1().

Se me ocurre que quizas pasando un parametro a F1() se podria hacer un rejuego ahi de alguna forma, pero no me parece que esta sea la unica forma, entonces apelo a vuestra experiencia a ver si alguien me sabe hacer otra sugerencia.....


En espera de algun comentario.....


Un abrazo


oracle

Chris
15-01-2008, 15:34:01
En mi escaso conocimiento, esa es la única forma que conozco amigo Oracle. Talvez otros compañeros tienen otra opinión.

Saludos.

oracle
15-01-2008, 16:38:57
Bueno realmente no se trata de un problema, ya sabemos como solucionarlo, el asunto es que si alguien sabe si hay otra manera de hacerlo pues que por favor lo diga.

Por otro lado tambien pudieramos crear en vez de una funcion 3 funciones, F1(), F2() y F3() donde F1() tenga el comportamiento comun de las otras dos, y estas ultimas solo se especializarian en lo que necesitan las funciones externas que las utilizan. Aun asi pienso que debe haber alguna alternativa a esta especie de "cacharreo", aunque todos sabemos que no siempre esto de la programacion tiene que ser exacto....


salu2

oracle

Mick
15-01-2008, 19:25:59
Intentar que una funcion/metodo haga algo distinto dependiendo de la funcion desde la que es llamada es una aberracion. Si una funcion debe comportarse de distinta forma precisamente para eso estan los parametros: pasarle informacion a la funcion, que necesita para hacer lo que sea.

Ahora si, seria interesante saber exactamente que se requiere que haga esa funcion, porque puede haber otras soluciones mas logicas ademas de la de pasar un parametro, pero dependeria de cada caso concreto (por ejemplo sobrecargar metodos, usar clases hijas, etc).

Saludos

oracle
16-01-2008, 02:49:24
Gracias Mick por tu respuesta, si lo hubiese sabido que lo que estaba preguntando era una "aberracion" ni lo hubiese mencionado, en fin ya me he tenido que decidir por la via de un parametro adicional asi que gracias otra vez...

//oracle

Fate
16-01-2008, 16:59:42
1) Los metodos en java puedes distinguirlos ya sea por el numero de parametros:

- public void doIt(String x, String y)
- public void doIt(String x, String y, int m)

2) Los metodos en java puedes distinguirlos ya sea por el tipo de parametros:

- public void doIt(String x, String y)
- public void doIt(String x, Integer y)

Bueno, quizas ya conocias esto(probablemente), lo cual es lo mas cercano que puedo yo brindarte como solucion.

Sin embargo, el hacer lo que has descrito con el método F1() que has dicho me parece que es una mala programación, porque asi estas condicionando a tu método F1() a funcionar en base a F2() y a F3(), pero, pierdes el sentido de lo que es en escencia un objeto y su capacidad de ser rehusado.

Creo que deberias volver a analizar tus métodos, cualquier cosa, aqui sigo...



_______________"Dios esta muerto y su cadaver apesta, su amor por los hombres le ha matado"

__hector
16-01-2008, 21:51:11
Podrias quizas tambien utilizar programacion orientada a aspectos (AOP) para esto. Mira a ver si AspectJ te sirve.

oracle
17-01-2008, 03:57:58
Bueno amigos, para que no haya dudas, aqui os dejo lo que termine haciendo, lo de hacer 3 funciones fue solo una idea, ya que lo unico que yo necesitaba que cambiara era solo una linea de codigo en dependencia desde donde fuera llamada la funcione, aqui os la dejo:

public void AddAtomo(Atom A, boolean M){

if(viewer.getMolecula().EsAdyacente(A, this)){

if(listAtomos.size() == 0){
listAtomos.add(A);
matrizAdj = new int[1][1];
matrizAdj[0][0] = 0;
............................
}
else
{
...........................
}
else if(M){
viewer.showMessage("Error, seleccione un fragmento correcto", "Accion Invalida", 2);
}

};Lo que sucedia era que en ocasiones yo hacia esta llamada desde un formulario, en este caso necesitaba lanzar un mensaje en algunos casos, y de la otra forma era cuando necesitaba utilizar esta misma funcion de manera interna, para otro proposito pero sin lanzar el mensaje.....Espero hayamos quedado claros todos....

Un saludo


oracle

oracle
17-01-2008, 04:09:16
Bueno amigos, para que no haya dudas, aqui os dejo lo que termine haciendo, lo de hacer 3 funciones fue solo una idea, ya que lo unico que yo necesitaba que cambiara era solo una linea de codigo en dependencia desde donde fuera llamada la funcione, aqui os la dejo:

public void AddAtomo(Atom A, boolean M){

if(viewer.getMolecula().EsAdyacente(A, this)){

if(listAtomos.size() == 0){
listAtomos.add(A);
matrizAdj = new int[1][1];
matrizAdj[0][0] = 0;
............................
}
else
{
...........................
}
else if(M){
viewer.showMessage("Error, seleccione un fragmento correcto", "Accion Invalida", 2);
}

};Lo que sucedia era que en ocasiones yo hacia esta llamada desde un formulario, en este caso necesitaba lanzar un mensaje en algunos casos, y de la otra forma era cuando necesitaba utilizar esta misma funcion de manera interna, para otro proposito pero sin lanzar el mensaje.....Espero hayamos quedado claros todos....

En cuanto a la AOP Hector creo que no es conveniente en mi caso mezclarlo, ya que esto desarrollando con POO, aunque siempre seria bueno analizar las alternativas.....

Un saludo


oracle

Mick
17-01-2008, 11:21:00
La solucion propuesta no me parece correcta, se esta mezclando dos cosas diferentes en una misma funcion no se debe mezclar el interface con la implementacion.

Que pasaria si en lugar de mostrar o no mostrar un simple mensaje de error fuese necesario hacer muy diferentes acciones segun desde donde se llame ? , por ejemplo en unos casos podriamos necesitar enviar por correo electronico un aviso, en otros poner un simple mensaje, en otros casos no hacer nada, en otros mostrar el error de otra forma distinta a una simple ventana con un mensaje, etc. tendrias que pasarle a esa funcion un monton de parametros no una simple variable booleana.

Lo logico en ese caso es que la funcion devuelva un valor verdadero o falso que indique si ha hecho lo que tenga que hacer, y el mensaje se muestre desde el formulario que hace la llamada a esa funcion en funcion del resultado devuelto por la funcion.

Incluso podria paracer mas logico que el siguiente codigo tambien estuviese fuera de la funcion:


if(!viewer.getMolecula().EsAdyacente(A, this)){
viewer.showMessage("Error, seleccione un fragmento correcto", "Accion Invalida", 2);
}


Saludos

Ñuño Martínez
17-01-2008, 11:54:37
Supongo que la máquina virtual de Java tiene pila y que también es posible obtener la "dirección" de una función. Si es así, entonces podría hacerse obteniendo la dirección de las funciones F2() y F3(). Luego, en F1(), se extrae la dirección del llamante de la pila y se vuelve a apilar para evitar problemas. Al menos en las máquinas "reales" puede hacerse.

[edit]En Pascal sería algo así:


PROCEDURE F1;
VAR
DireccionFuncion: POINTER;
BEGIN
ASM
POP AX;
PUSH AX;
MOVE @DireccionFuncion, AX;
END;
IF (DireccionFuncion = POINTER (@F2)) THEN
BEGIN
...
END
ELSE IF (DireccionFuncion = POINTER (@F3)) THEN
BEGIN
...
END;
...
END;

oracle
17-01-2008, 14:57:40
Muy cierta Mick tu observacion, lo que sucede y fue lo que me hizo irme por ese camino es que el evento, en este caso el mensaje no es controlado por el Frame sino por un componente que esta dentro del frame que se llama viewer como ves en el codigo y que este a su vez tiene una clase para el manejo de eventos del mause (MauseManajer.java) que es uno de los lugares donde se llama la funcion. Por hacer el camino mas corto lo hize mas ambiaguo, vale tu aclaracion, la tendre en cuenta....

En cuento a lo que comentas Ñuño esta muy interesante, tendre que echarle un vistazo a la aritmetica y el trabajo con apuntadores en Java que nunca he trabajado con eso. Se que en C++ si es posible hacer eso con los apuntadores a funciones, etc, pero ya veremos si en Java se puede, os hare saber enseguida....


Un saludo


oracle....

Fate
17-01-2008, 17:38:05
La linea no es importante realmente, lo importante es que ese boleano M este declarado como una variable de tipo protected al inicio de tu clase(con sus respectivos getters y setters) y asi no necesitas agregar parametros ni nada por el estilo y tu método(no función como la llamas) no será dependiente.

Esa es la solución.

__hector
17-01-2008, 19:35:36
En java no existen punteros.

oracle
18-01-2008, 21:03:42
Gracias Fate, muy elegante la alternativa que me das. Por cierto cual es la diferencia entre metodo y funcion???

Hector realmente estoy comenzando en esto de la programacion con Java asi que alguna que otra burrada siempre se va, yo soy de la generacion del C++, los apuntadores son comos mis hermanitos menores, jejeje....

Saludos

//oracle

PD: Por cierto, una peque;a pregunta, alguno de uds conoce algun algoritmo para busqueda de caminos minimos en grafos no ponderados que se llame "Lee" porque no lo encuentro por ningun lado....

Fate
21-01-2008, 23:23:39
Gracias Fate, muy elegante la alternativa que me das. Por cierto cual es la diferencia entre metodo y funcion???

Hector realmente estoy comenzando en esto de la programacion con Java asi que alguna que otra burrada siempre se va, yo soy de la generacion del C++, los apuntadores son comos mis hermanitos menores, jejeje....

Saludos

//oracle

PD: Por cierto, una peque;a pregunta, alguno de uds conoce algun algoritmo para busqueda de caminos minimos en grafos no ponderados que se llame "Lee" porque no lo encuentro por ningun lado....



A ver si te sirve (http://web.iti.upv.es/%7Eevidal/students/ad3/tema2/arbGraf.pdf)

oracle
22-01-2008, 05:05:40
Gracias Fate, realmente no tengo ningun problema con la teoria de Grafos, el asunto es que andaba buscando un buen algoritmo para encontrar el camino minimo entre dos pares de vertices dado de un grafo y un amigo mio me asegura que existe un buen algoritmo desarrollado por un tal ¨Lee¨ que no encuentro por ningun lado. De cualquier forma ya resolvi el problema con una pequeña variante de Dijkstra, pero me quedaba esa duda....

saludos

//oracle