• Publicidad

Una ayuda para un proyecto

¿Estás desarrollando un proyecto, o piensas hacerlo? Pon aquí tu propuesta, lo más seguro es que alguien esté interesado en ayudarte.

Una ayuda para un proyecto

Notapor danimera » 2007-08-13 11:53 @536

Había posteado la idea de un subforo para guía de proyectos, pero aquí ya existe algo parecido. La ayuda que necesito es la siguiente.

Mi idea es Desarrollar una librería llamada kreader; esto lo quiero hacer para aprender, es decir, practicar y aprender un poco mas, la librería consiste en guardar registro en un fichero, eliminarlos, editarlos y leerlos, esto es, basado en un tutorial de Uriel, mi librería contiene estas funciones:

makefile: prepara el archivo para guardar ahí los registros
swrite: guarda un nuevo registro, tomando los datos de un array
fwrite: lo mismo que el swrite pero tomando los datos de un hash
cfind: busca un registro especificando un campo
kread: lee el fichero y asignando X cantidad de registros y un orden
fedit: edita un registro asignado un ID válido, si no, lo crea de nuevo
rdelete: borra un registro

Hasta ahora sé que funcionan todos, pero no sé si funcionan bien, quiero mejorarlo y continuar con el para implementarlo en una administrador bajo ficheros. La idea es que se me guíe hasta tener algo estable.

http://www.fukkatsu-net.com/blahdocs/uploads/kreader_5943.pm
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Publicidad

Notapor Perl user » 2007-08-13 12:15 @552

Qué tal,

Mira, le eché un vistazo al código y definitivamente si le falta (re)trabajarlo un poco más, pero creo que antes de hacer comentarios al respecto, sería recomendable (y aún más para tí), que REALMENTE expliques detalladamente lo que cada función debe hacer, pero en serio, cubre todos los detalles posibles, porque veo que por ejemplo fwrite puede tomar un atributo de "orden"... o algo así.

Recuerda que la etapa de planeación y diseño es un paso MUY importante para el desarrollo de una aplicación, aun cuando se cuenta con un prototipo.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor danimera » 2007-08-13 12:51 @577

Bueno voy de nuevo.

makefile(“fichero.dat”, @campos) # Crea un fichero con ese nombre y crea los campos, automáticamente crea el campo ID, así que no es necesario crearlo, quedan los ficheros creados de la forma ej:
ID||nombre||apellido||pais||edad
01||dagoberto||perez||chile||23

swrite(“fichero.dat”,@campos) # Agrega campos auto incrementando el ID, los campos deben estar en orden como se ingreso en el makefile.

fwrite(“fichero.dat”,%campos) # mas poderoso que el swrite, permite insertar registros por un hash, ingresa el valor donde el campo sea igual al nombre de la llave, En caso de que halla campos distintos a los campos del fichero, saldrá una advertencia, de lo contrario devolverá 1.

fedit(“fichero.dat”,’$id’,%campos_valores) # lo que hace es editar el registro id los valores de los campos dados en el hash %campo_valores, %campos_valores={‘campo1’,’valor1’,’campo2’,’valor2’};. Si el id indicado no existe se agregará uno nuevo # Esto puede hacer que cambie la secuencia del id del fichero

cfind($file, $campo, $valor) # busca un registro dentro de $file, donde el $campo sea igual al $valor esta búsqueda quedará dentro de un hash ej: %busqueda = cfind($file, $campo, $valor)

Multifind($file) # Aún no le he implementado es para hacer múltiples búsquedas, podría ser edades mayores a 18 o nacidos en Argentina cosas así.

Kread($file,’orden’,’cantidad_registros’) # deja en un array la cantidad de registros que indiquemos en el orden deseado (1=desde el inicio, 0=desde el final)y la cantidad que le digamos también, si no ingresamos cantidad de registros nos devolverá 10 por defecto.

Pero estos registros quedan de la forma : 02||juliana||perez||afiliada||1983
El primer campo es el ID

Espero que quede un poquito mas claro, la idea mía es aprender más y hacer algo aunque no sea la gran cosa pero algo lo mejor posible. Ya con esta idea lo que deseo es Que me guíen paso a paso y yo iré haciendo los arreglos hasta tener algo estable. OK Thanks
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Notapor Perl user » 2007-08-13 15:10 @673

Ok, creo que "entendí" lo que quieres, aunque realmente soluciones así existen muchas, y para diferentes niveles... pero dices que apenas vas comenzando y supongo que por lo que muestras, la interfaz que quieres es algo estructurado por funciones "independientes", así que mis comentarios los haré utilizando dicho esquema:

danimera escribiste:makefile(“fichero.dat”, @campos) # Crea un fichero con ese nombre y crea los campos, automáticamente crea el campo ID, asi que no es necesario crearlo, quedan los ficheros creados de la forma ej:
ID||nombre||apellido||pais||edad
01||dagoberto||perez||chile||23

Mi primera recomendación para esta función es: si se llama "makefile", entonces que haga sólo eso... no la pongas a que agregue datos, para eso ya tienes a "swrite", no mezcles las tareas que debe realizar cada función.

Mi segunda recomendación es que retorne "algo" que guarde el estado. ¿A qué me refiero? Mira, en el código que muestras abres (y no siempre cierras, por cierto) el archivo cada vez que vas a realizar una operación, eso pega muy fuerte en el rendimiento de la aplicación, una llamada a open es costosa y más para múltiples llamadas, por lo tanto lo que puedes hacer es simplemente abrirlo una sola vez y dejar almacenado el filehandle en la variable que retorne dicha función, o retornarlo directamente, algo como esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub makefile {
    my ($file, @campos) = @_;
    open my $fh, ..
    #aquí va lo de mi siguiente comentario
    return $fh;
}

my $file = makefile('hola.txt');
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Mi tercera recomendación es que... la función verifique si el archivo existe, si no existe que lo cree, si ya existe que simplemente lo abra para utilizarlo. A su vez, si vas a trabajar con IDs, te recomiendo que el archivo tenga un "encabezado", dónde la primera línea sea el último índice que asignaste, de tal manera que podrás tener controlado el siguiente ID sin importar si ya eliminaste uno. Y eso lo puedes hacer en esta función.

danimera escribiste:swrite(“fichero.dat”,@campos) # Agrega campos auto incrementando el ID, los campos deben estar en orden como se ingreso en el makefile.


Para esta función, tomando en cuenta el código que te puse arriba, pasarías el valor de retorno de makefile como primer argumento, y ya ahora sí, el segundo argumento podrá ser la lista de elementos a insertar.

danimera escribiste:fwrite(“fichero.dat”,%campos) # más poderoso que el swrite, permite insertar registros por un hash, ingresa el valor donde el campo sea igual al nombre de la llave, En caso de que halla campos distintos a los campos del fichero, saldrá una advertencia, de lo contrario devolverá 1.


Esta función la verdad no la entendí mucho, lo siento.

danimera escribiste:fedit(“fichero.dat”,’$id’,%campos_valores) # lo que hace es editar el registro id los valores de los campos dados en el hash %campo_valores, %campos_valores={‘campo1’,’valor1’,’campo2’,’valor2’}; . Si el id indicado no existe se agregará uno nuevo # Esto puede hacer que cambie la consecutividad del id del fichero


Aquí no le veo mucha importancia que uses un hash, ya que en teoría en las funciones anteriores (como "swrite") insertas todo como un array, de tal forma que asumo que tu controlas el orden de los elementos, recuerda que un hash tampoco tiene orden alguno de las llaves. No me parece un buen diseño mezclar interfaces con arreglos y hashes, cuando realmente el orden no está definido.

La funcionalidad que provee fedit está correcta, pero la manera en la que está diseñado no. Apégate a una interfaz definida.

danimera escribiste:cfind($file, $campo, $valor) # busca un registro dentro de $file, donde el $campo sea igual al $valor esta búsqueda quedara dentro de un hash ej: %busqueda = cfind($file, $campo, $valor)

Multifind($file) # Aun no le he implementado es para hacer múltiples búsquedas, podría ser edades mayores a 18 o nacidos en Argentina cosas asi.


Para este par de funciones no tengo muchos comentarios, y más porque supongo comenzarás haciendo una búsqueda secuencial de todos los registros por medio de ese campo.


danimera escribiste:Kread($file,’orden’,’cantidad_registros’) # deja en un array la cantidad de registros que indiquemos en el orden deseado (1=desde el inicio, 0=desde el final)y la cantidad que le digamos también, si no ingresamos cantidad de registros nos devolverá 10 por defecto
Pero estos registros quedan de la forma : 02||juliana||perez||afiliada||1983
El primer campo es el ID


En esta función habrá que tener cuidado. Imagina que tienes 50 elementos, y de pronto jalas 10, luego de procesarlos tienes la necesidad de jalar los siguientes 10, si lo haces como lo tienes implementado, tendrás que jalar los primeros 20 (los 10 que ya habías leído, más los 10 que necesitas), de tal manera que nuevamente el rendimiento de la aplicación se va hacia abajo, sin contar que estarás procesando la misma información una y otra vez.

danimera escribiste:Espero que quede un poquito mas claro, la idea mía es aprender mas, y hacer algo aunque no sea la gran cosa pero algo lo mejor posible, Ya con esta idea lo que deseo es Que me guíen paso a paso y yo iré haciendo los arreglos hasta tener algo estable. OK Thanks


Queda claro lo que quieres hacer, y entiendo la necesidad que tienes, pero lo que yo te recomendaría es planear bien la interfaz de tu proyecto, una interfaz BIEN definida, y que sea amigable para ti por lo pronto, ya que serás tu mismo usuario.

Toma en cuenta mi recomendación del "encabezado" podría ayudarte a definir el orden de los campos por ejemplo, y así poder retornar valores como un hash, en vez de como un arreglo, pero eso lo decidirás tu en tu interfaz, piensa qué es lo que sería mas fácil para ti.

Hay muchas más recomendaciones, incluso de módulos que pueden ayudarte, pero también asumo que lo quieres hacer sin la ayuda de módulos, así que personalmente lo que yo exhorto que hagas es que plantees de nuevo el diseño, con los puntos que te hice arriba.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor danimera » 2007-08-14 08:58 @415

Mi primera recomendación para esta función es: si se llama "makefile", entonces que haga sólo eso... no la pongas a que agregue datos, para eso ya tienes a "swrite", no mezcles las tareas que debe realizar cada función.


Bueno de hecho, esa función solo hace eso, lo que coloqué abajo fue un ejemplo de cómo quedaban los registros, pero ya me entiendes.

Sobre la segunda recomendación lo haré así como dices, pero no sé si el fichero queda abierto por toda la sesión o solo por cuando se ejecuta el script ?¿?¿
______________________________

Tercera recomendación: la verificación del archivo es importante, no lo tuve en cuenta, así lo arreglaré.
Sobre recomendarme que el archivo tenga un encabezado, pues mira que el ID es todas las líneas agregadas al fichero menos una:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open (DATABASE, "$file") || die "No se pudo abrir el File";
        @registros = <DATABASE>;
       
    close (DATABASE) || die "No se puede cerrar el fichero";
shift (@registros); #borra la primera linea

$ultimo_registro = @registros; #ultimo registro es igual al numero de indices en el array
$ultimo_registro--;

($id,@basura) = split(/\|\|/, $registros[$ultimo_registro]);
$id++; # aumenta en 1 el id
$new_registro = $id;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Kid lo recomendó así, porque cada línea del fichero menos la primera es un registro y el ID lo importante es que sea único y aunque se borre el último ID del registro la función igual leerá ese registro esa línea y aunque esté vacía.

Para la función swrite tendré en cuenta también tu recomendación.

Función fwrite. Lo que pasa Perl User es que si uno quiere por ejemplo solo agregar la edad y el país al registro, así tenga más campos, que tal que tenga 20 campos y solo quieres agregar la edad y el país, con un array tocaría:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$datos[3] = "peru";
$datos[11] = "17"; # y uno no sabe el indice exacto pues larguito ^^
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y con el hash, usas los key
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
%campos = {'pais','peru','edad','17'};
fwrite(“fichero.dat”,%campos);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Él verifica que el campo exista, si uno de ellos no existe o está mal escrito, retornará un error [Necesito mucha ayuda en la comprobación de esos campos que no la se hacer muy bien Perl User OJO CON ESTE AUXILIO]

fedit también tengo problemas al comprobar los campos, no sé cómo hacer un break en la función si alguno no es correcto, AUXILIO

cfind la búsqueda es sencilla generalmente la búsqueda es por ID porque buscar por el campo edad que sea igual a 20 solo dejará el último. Me gustaría de pronto otra función multifind yo que se mejorada.

Sobre la recomendación para el Kread me parece importante, pero primero por pasos solucionaré las cosas de arriba, las recomendaciones y veo esto después.

Gracias Perl User,
Realmente para mi no es que sea la gran cosa la aplicación, pero sabes HACER ESTAS COSAS LO MOTIVA A UNO A CONTINUAR APRENDIENDO, porque son cosas útiles para uno.

Replantearé esas cosas y te mostraré de nuevo los arreglos, OK, y Gracias por no ser tan duro como KID.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia


Volver a Proyectos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron