Añado tu último correo respecto al programa para seguir en esta conversación.
Ahora estoy interesado en mejorar el programa, empezando por donde tú me dijiste. Enseñé el código a un amigo y me recomendó separar con dos librerías estrictas las dos funciones del programa: manejar columnas y conjugar verbos. La utilidad es evidente, si a alguien le interesa solamente manejar columnas, no tiene por qué tener un conjugador de japonés incrustado. Pero esto será más adelante.
Respecto a la función quina_forma me comentó que no hacía falta convertir siempre la forma de cadena a entero, pero creo que se equivoca. Ha de ser mejor transformar a enteros, operar con enteros, y antitransformar si hace falta.
Mi plan para el programa a medio plazo es:
- reprogramar la función quina_forma
- añadir un conversor hiragana -> romaji al conjugador
- usando el programa, colgar nuevas lecciones de verbos.
- separar el programa en dos librerías distintas.
Creo que ya he entendido lo del cubo, en el momento de recibir el correo no era mi prioridad mejorar el código, pero tenía en mente la necesidad. Voy a intentar construir otra vez la función y volvemos a hablar.
Por cierto, anoche estuve mirando algunas funciones del código fuente de LearnExperiment en javascript, y me resultó bastante interesante. Más adelante me pondré en ello...
Saludos!
2010/8/10 Jaime García Marsá
<ja...@legendarya.com>
por cierto, una propuesta para la funcion quinaforma (separador-conjugador-
funcions_de_codi.h),
reduce el código haciendo las comprobaciones de error todas juntas y
usando arrays para escoger el resultado a devolver, en lugar de ifs. No
se si estará del todo bien. Con PHP hay otras facilidades y es a lo que
estoy acostumbrado, pero al menos puede dar ideas.
// Comprobamos si el valor es incorrecto
if(is_afirm(forma)!=0 && is_afirm(forma)!=1) return -1;
int[] forma_te=[NFORMATE,FORMATE];
if(is_fte(forma)) return forma_te[is_afirm(forma)];
// Comprobamos si el valor es incorrecto
if((is_formal(forma)!=0 && is_formal(forma)>1) || (is_present(forma)!=0 && is_present(forma)!=1)) return -1;
int[][][] forma=[ // no formal (no presente/presente) // formal (no presente/presente)
[[CNPASSAT,CNPRESENT],[FNPASSAT,FNPRESENT]]] // No afirmativo
[[FPASSAT,FPRESENT],[CPASSAT,CPRESENT]]] // Afirmativo
];
return forma[is_afirm(forma)][is_formal(forma)][is_present(forma)];
La idea es que tenemos un "cubo" con tres lados, para las
variables formal/informal, afirmativo/negativo y presente/pasado. En un
array se definen los valores para cada casilla del cubo, y luego se
usan las variables devueltas simplemente como índices. Como dije,
usando excepciones podríamos incluso eliminar las líneas de
comprobación de errores