CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 20 Sep 2018 10:27

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 23 mensajes ]  Ir a página Anterior  1, 2
Autor Mensaje
NotaPublicado: 24 Ene 2011 16:22 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
jenesis escribió:

Así que debo de estar haciendo alguna otra cosa mal... :\


Bueno sí... he cambiado el orden de los "ifs" y arreglado. :)

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 24 Ene 2011 16:23 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5303
Ubicación: Coruña
jenesis escribió:
Pues es que si no lo compruebo, cualquier acción que competa a ese y otro objeto, no pasa de ahí, es capturada y la segunda comprobación nunca se ejecuta.


Claro, pues precisamente por lo que acabo de decir.

Sin la comprobación, estás capturando "verbear X con Y" (lanza el bote a los cocodrilos) con el código de "verbear X" (lanza el bote). Que es lo que no quieres hacer en ese caso. Por eso dije que depende.

Puedes incluir la comprobación, o puedes simplemente poner lo más específico (verbear X con Y) antes que lo más genérico (verbear X). Así, aunque el código de verbear X sea permisivo y trague también con verbear X con Y, eso no te obstaculizará el código específico que tengas para ciertos Y concretos (cocodrilos).

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 24 Ene 2011 16:38 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Puedes incluir la comprobación, o puedes simplemente poner lo más específico (verbear X con Y) antes que lo más genérico (verbear X). Así, aunque el código de verbear X sea permisivo y trague también con verbear X con Y, eso no te obstaculizará el código específico que tengas para ciertos Y concretos (cocodrilos).


Bueno, ahora el reto es aplicar a todos los objetos lo que aquí hemos hablado, pero casi mejor en mi próximo proyecto, porque éste ya está demasiado embarullado.

Así que lo aplicaré a los contenedores y a ver si con eso basta. :)

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 24 Ene 2011 16:45 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5303
Ubicación: Coruña
Para el próximo proyecto, te recomiendo que leas la documentación y creo que te darás cuenta de que es mucho más fácil hacer todas estas cosas si usas los métodos específicos en lugar del genérico. Aunque las comprobaciones esas de equals(obj1,path1.get(0)) y similares las tendrás que hacer igual si hay contenedores, sí que te libras de cosas como comprobar nulos (si defines el método para dos objetos ya se llama sólo cuando hay dos, no hay nulos que valgan), o el orden de los ifs que decías antes (la decisión de "pongo las cosas para dos objetos antes que las de para uno" la toma el sistema por ti, llamando al método para dos objetos antes que al método para uno), etc. Y lo de los path y qué significan está explicado ahí con algún ejemplo.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 24 Ene 2011 16:54 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Lo que a lo mejor sí tiene sentido hacer en PUCK es que el mismo método tenga varias plantillas: una para el caso 1 que mencionaba antes, otra para el caso 2 y otra para ambos. Aunque habría que pensar si realmente compensa, porque igual ver tantas plantillas abruma al usuario haciéndole pensar cuál elegir, más que ayudarlo.


Pues yo al menos te lo agradecería.
Porque aún no me he puesto a hacer el uso contrario de ese parseCommand, y mucho me temo que cuando llegue el caso, vamos a tener que empezar de nuevo. :oops:

Citar:
Para el próximo proyecto, te recomiendo que leas la documentación y creo que te darás cuenta de que es mucho más fácil hacer todas estas cosas si usas los métodos específicos en lugar del genérico. Aunque las comprobaciones esas de equals(obj1,path1.get(0)) y similares las tendrás que hacer igual si hay contenedores, sí que te libras de cosas como comprobar nulos (si defines el método para dos objetos ya se llama sólo cuando hay dos, no hay nulos que valgan), o el orden de los ifs que decías antes (la decisión de "pongo las cosas para dos objetos antes que las de para uno" la toma el sistema por ti, llamando al método para dos objetos antes que al método para uno), etc. Y lo de los path y qué significan está explicado ahí con algún ejemplo.


Sí lo he leído Alk, lo que pasa es que mi cerebro es de madera. :oops:
Si existe un modo de que todo se pueda hacer desde un parseCommand genérico y ya tengo las comprobaciones necesarias para olvidarme de las comprobaciones de nulls y de orden de objetos, creo que ya no necesito más.


Veamos...

void parseCommandOnContentsGeneric ( Mobile aCreature , String verb , String args1 , String args2 , Vector path1 , Vector path2 , Entity obj1 , Entity obj2 , boolean goesFirst )
{

//caso A: acciones que competen a dos objetos.
if ( !equals(null,obj2) && (equals(obj1,path1.get(0)) && equals(obj2,path2.get(0))) )
{

}

//Caso B: acciones que competen a un solo objeto
if (equals(obj1,path1.get(0) ) )
{}

//Caso C: ?????

}

¿Podrías añadir aquí los demás casos?
Así no hace falta ni que los pongas en el PUCK, yo los copio y ya los tengo. :D

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 24 Ene 2011 17:09 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5303
Ubicación: Coruña
jenesis escribió:
Sí lo he leído Alk, lo que pasa es que mi cerebro es de madera. :oops:
Si existe un modo de que todo se pueda hacer desde un parseCommand genérico y ya tengo las comprobaciones necesarias para olvidarme de las comprobaciones de nulls y de orden de objetos, creo que ya no necesito más.


Pero es que... con los específicos es más sencillo... me dices algo del cerebro pero es que lo estás haciendo trabajar de más porque te complicas la vida.

¿No te das cuenta de que haciéndolo todo en el genérico, lo que estás haciendo es hacer tú trabajo que de otra manera haría el sistema? El sistema comprueba por ti el orden, los nulos, etc. y según esa comprobación llama al método que tú eliges, por ejemplo si quieres capturar una acción sobre dos objetos sin que importe el orden, le das a "método para dos objetos sin que importe el orden" y ya no tienes que comprobar tú nada.

Usando el método genérico, lo que haces es que ese trabajo que hace el sistema, en su lugar lo tienes que hacer tú.

jenesis escribió:
¿Podrías añadir aquí los demás casos?
Así no hace falta ni que los pongas en el PUCK, yo los copio y ya los tengo. :D


A ver, es que hay cien mil formas de definir los "casos". Hay muchas cosas que puedes hacer. Cuando una acción compete a un solo objeto, puedes ser estricta y querer que no tecleen ninguno más, o te puede valer que tecleen alguno más. Cuando la acción compete a dos objetos, te puede importar el orden o te puede no importar.

Si obviamos lo del orden (suponemos que lo compruebas dentro de los ifs), sería algo como:

Código:
//caso A: acciones que competen a dos objetos, que son éste y otro.
if ( !equals(null,obj2) && (equals(obj1,path1.get(0)) && equals(obj2,path2.get(0))) )
{

}

//Caso B: acciones que competen a un solo objeto, que es éste, y a ninguno más.
if (equals(obj1,path1.get(0)) && equals(obj2,null) )
{

}

//Caso C: acciones que competen a un solo objeto, que es éste, pero si teclean alguno más, te da igual.
if (equals(obj1,path1.get(0))  )
{

}

//Caso D: acciones que competen a un solo objeto, que está contenido en éste, y a ninguno más.
if (!equals(obj1,path1.get(0)) && equals(obj2,null) )
{

}

//Caso E: acciones que competen a un solo objeto, que está contenido en éste, pero si teclean alguno más, te da igual.
if (!equals(obj1,path1.get(0)) )
{

}

//Caso F: acciones que competen a dos objetos, que son uno contenido en éste, y otro, por ese orden.
if ( !equals(null,obj2) && path1.contains(self) && !equals(obj1,path1.get(0)) && equals(obj2,path2.get(0)) )
{

}

//Caso G: acciones que competen a dos objetos, que son otro, y uno contenido en éste, por ese orden.
if ( !equals(null,obj2) && path2.contains(self) && equals(obj1,path1.get(0)) && !equals(obj2,path2.get(0)) )
{

}

//Caso H: acciones que competen a dos objetos, contenidos en éste y en otro.
if ( !equals(null,obj2) && !equals(obj1,path1.get(0)) && !equals(obj2,path2.get(0)) )
{

}


De todas formas, si lees la documentación, y ves ahí lo que significan obj1, obj2, path1 y path2, no necesitarás ninguna lista de casos. Y si encima usaras los métodos específicos, la cantidad de casos se te reduciría a dos o tres en lugar de ocho, porque todo el tema de número de objetos, orden, etc. ya te vendría comprobado de fábrica.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 24 Ene 2011 18:46 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
De todas formas, si lees la documentación, y ves ahí lo que significan obj1, obj2, path1 y path2, no necesitarás ninguna lista de casos. Y si encima usaras los métodos específicos, la cantidad de casos se te reduciría a dos o tres en lugar de ocho, porque todo el tema de número de objetos, orden, etc. ya te vendría comprobado de fábrica.


Vale, haré un nuevo esfuerzo y veré si puedo resolver todo esto con los parseCommands específicos, pero es que me joroba mucho capturar un verbo y tener que empezar por no tener claro cuál de ellos usar, o tener que usar varios parseCommands para un mismo verbo.
Pero lo intentaré, te lo prometo. :)

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 24 Ene 2011 18:51 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5303
Ubicación: Coruña
jenesis escribió:
Vale, haré un nuevo esfuerzo y veré si puedo resolver todo esto con los parseCommands específicos, pero es que me joroba mucho capturar un verbo y tener que empezar por no tener claro cuál de ellos usar, o tener que usar varios parseCommands para un mismo verbo.
Pero lo intentaré, te lo prometo. :)

Pero para la próxima, ¿eh? No te pongas a volver a hacer todos los métodos de ésta desde cero que te veo capaz... :P

¿Por qué te fastidia "tener que usar varios parseCommands" y en cambio no te fastidia tener que usar el mismo pero hacer varias comprobaciones? En programación orientada a objetos, usar varios métodos pequeños para definir distintas cosas se suele considerar mejor práctica que usar un solo método y hacer comprobaciones con ifs. Es parte de la esencia de la POO, dividir los problemas en problemas más pequeños.

No sé, tú lee la documentación y ya me dirás si te convence la forma en que hago yo las cosas ahí o no. Si te convence los usas, y si no, pues haces como hasta ahora. Yo creo que debería convencerte, porque sinceramente me parece mucho más fácil, aunque para gustos colores.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 23 mensajes ]  Ir a página Anterior  1, 2

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM