Mejores Prácticas - Parte I Diplomado en Software Libre Ernesto Hernández-Novich <emhn@usb.ve> Universidad Simón Bolívar Copyright c 2010 Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 1 / 17
Almacenamiento de Datos Archivos de texto Simple. Delimitados (CSV). Estructurados (YAML). Bases de datos SQL PostgreSQL. SQLite. MySQL. Bases de datos no-sql BerkeleyDB. Mnesia. CouchDB. Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 2 / 17
Bases de datos SQL PostgreSQL Objeto-Relacional con un sistema extenso de tipos. Cliente-servidor. 100 % ACID desde el diseño. Integridad referencial. Lenguajes Procedurales del lado servidor. PL/pgSQL (parecido a Oracle PL/SQL). PL/perlSQL. PL/R. Replicación Maestro-Esclavos. Point In Time Recovery. Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 3 / 17
Bases de datos SQL SQLite Relacional con un sistema estándar de tipos. 100 % ACID desde el diseño. Embebible con cero-configuración. Un archivo de texto contiene toda la base de datos. Solamente ofrece acceso local. El archivo de texto es multiplataforma. Mínima concurrencia. Límites de almacenamiento similares a una base de datos completa. Disponible como librería independiente. Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 4 / 17
Object Relational Mapping OR/M o simplemente ORM Técnica para abstraer bases de datos relacionales cuando se usan desde un lenguaje orientado a objetos. Objetos persistentes generadores de resultados. Una clase equivale a una tabla. Los objetos generan filas de la tabla a través de iteradores. Los atributos del objeto corresponden a las columnas. Generación automática de SQL para CRUD. Operaciones complejas sin usar SQL explícito. Filtros sobre búsquedas. Agregadores. Procedimientos almacenados y vistas. Excepciones. Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 5 / 17
Caso de Estudio: Perl DBIx::Class Cada tabla es un objeto de clase DBIx::Class::ResultSource. El método search sobre un ResultSource es equivalente a un PREPARE SQL y produce un ResultSet. Los métodos iteradores first o next sobre un ResultSet son equivalentes al EXECUTE SQL. Consultas representadas usando SQL::Abstract. Claves primarias multicolumna. Páginación de resultados, usando cursores en servidor cuando aplique, generación de valores seriales.... Ejecuta la consulta en el último momento. Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 6 / 17
Caso de Estudio: Perl DBIx::Class Para cada tabla en la base de datos package Mi : : Base : : U s u a r i o ; use base qw( DBIx : : C l a s s ) ; PACKAGE >load_ components ( qw(pk : : Auto Core ) ) ; PACKAGE >t a b l e ( u s u a r i o ) ; PACKAGE >add_columns (qw( i d name p a s s ) ) ; PACKAGE >set_primary_key (qw( i d ) ) ; En la clase superior package Mi : : Base ; use base qw( DBIx : : C l a s s : : Schema ) ; PACKAGE >l o a d _ c l a s s e s ( ) : Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 7 / 17
Caso de Estudio: Perl DBIx::Class En el programa principal se establece conexión... use Mi : : Base ; my $dsn = d b i : Pg : d a t a b a s e=t e s t ; h o s t=l o c a l h o s t ; my $db = Mi : : Base >connect ( $dsn, $user, $ p a s s ) ; En lugar de SELECT * from TABLA WHERE id = 42... my $row = $db >r e s u l t s e t ( Tabla ) > f i n d ( 4 2 ) ; Búsquedas complejas con SQL::Abstract my $rows = $db >r e s u l t s e t ( Tabla ) > s e a r c h ( { name => { l i k e => Ern % }, edad => { > => 40 } } ) ; Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 8 / 17
Caso de Estudio: Perl DBIx::Class y herramientas relacionadas DBIx::Class::Schema::Loader descubre las tablas y sus relaciones generando todas las clases dinámicamente, posiblemente generando código en disco. SQL::Translator convierte la representación de bajo nivel entre bases de datos disímiles. Ideal para migraciones y documentación. DBIx::Class::QueryProfiler para perfilar la generación de instrucciones SQL y su desempeño. Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 9 / 17
Generación de Resultados Texto Simple. Delimitado (CSV). Estructurado Serialización (YAML, JSON, XML). Despliegue (HTML). Presentación final PDF o PostScript Herramientas de oficina. Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 10 / 17
Generación de Resultados La salida no se genera con print Use librerías para generar archivos CSV, YAML, XML... Use sistemas de plantillas para generar HTML, PDF.... Separación de preocupaciones Simplifica actividades de traducción y cambio de formato sin alterar la lógica de programación. Facilita el trabajo desacoplado de programador y diseñador. Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 11 / 17
Sistema de Plantillas La plantilla es un documento de texto simple, con marcas especiales para indicar las posiciones de sustitución Valores simples. Valores condicionados (selectores). Listas de valores (iteradores). Desde el punto de vista del diseñador de la salida, simplemente debe prepararse la maqueta colocando las marcas especiales en los sitios adecuados. Desde el punto de vista del programador Cargar la plantilla como un objeto. Suministrar los valores, condiciones y listas a sustituir dentro de la plantilla. Mostrar la plantilla sustituida. Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 12 / 17
Sistemas de Plantillas Evite las plantillas con lenguajes embebidos Violan el patrón MVC! El procesamiento suele ser más complejo y costoso que las meras sustituciones. Utilice el sistema de plantillas apropiado Sistema de plantillas para HTML integrado con un generador de formularios HTML (e.g. HTML::Template y CGI::FormBuilder en Perl). Sistema de plantillas con extensiones para múltiples formatos de salida (e.g. Template::Toolkit en Perl). Habilidades de inclusión y caching son esenciales para despliegues complejos. Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 13 / 17
Caso de Estudio: Perl HTML::Template Las plantillas se escriben en HTML con marcas especiales <h1><! tmpl_var name=t i t u l o ></h1> B ienvenido, <! tmpl_var name=u s u a r i o > El programador carga las plantillas y pega los valores use HTML : : Template ; my $t = HTML : : Template >new ( f i l e n a m e => t e s t. tmpl ) ; $t >param ( t i t u l o => El r e s u l t a d o ) ; $t >param ( u s u a r i o => Ernesto ) ; p r i n t $t >output ; La librería hace el resto <h1>el r e s u l t a d o </h1> B ienvenido, E r n e s t o Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 14 / 17
Caso de Estudio: Perl HTML::Template y CGI::FormBuilder Dentro de la plantilla se indica Donde incluir la magia JavaScript generada por CGI::FormBuilder. Donde incluir el formulario generado por CGI::FormBuilder. <! tmpl_ var name=j s head >... <! tmpl_ var name=form s t a r t >... <! tmpl_var name=f i e l d nombre >... <! tmpl_var name=f i e l d c l a v e > <! tmpl_ var name=form s u b m i t > <! tmpl_ var name=form end > El programador carga las plantillas a través de CGI::FormBuilder. my $t = CGI : : FromBuilder >new (... l o s campos y v a l i d a c i o n e s... t e m p l a t e => t e s t. tmpl ) ; Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 15 / 17
Caso de Estudio: Perl Template::Toolkit Sistema de plantillas generales susceptible de ser utilizado para generar cualquier tipo de contenido Texto simple, estructurado o HTML de forma natural. PDF, gráficos a través de plugins. Puede utilizarse separado del lenguaje de programación para la generación estática de contenido. Plugins apoyados en otros módulos Perl Gráficos a través de GD. YAML y XML. Generación de PostScript y PDF vía L A TEX... y otros 40 más. Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 16 / 17
Referencias PostgreSQL http://www.postgresql.org/ SQLite http://www.sqlite.org/ OR/M http://en.wikipedia.org/wiki/object-relational_mapping DBIx::Class http://search.cpan.org/perldoc?dbix::class Web Template System http://en.wikipedia.org/wiki/web_template_system Perl Template Toolkit http://template-toolkit.org Hernández-Novich (USB) Mejores Prácticas - Parte I 2010 17 / 17