Mejores Prácticas - Parte I
Diplomado en Software Libre
Ernesto Hernández-Novich
<emhn@usb.ve>
Universidad Simón Bolívar
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.
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.
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.
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 sinusar SQL explícito. • Filtros sobre búsquedas.
• Agregadores.
• Procedimientos almacenados y vistas. • Excepciones.
Caso de Estudio: Perl
DBIx::Class• Cada tabla es un objeto de claseDBIx::Class::ResultSource. • El métodosearchsobre un ResultSourcees equivalente a un
PREPARE SQLy produce un ResultSet.
• Los métodos iteradoresfirst onext sobre unResultSet son equivalentes alEXECUTE 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 . . . .
Caso de Estudio: Perl
DBIx::Class• Para cada tabla en la base de datos
p a c k a g e Mi : : Base : : U s u a r i o ; u s e b a s e qw ( DBIx : : C l a s s ) ;
__PACKAGE__−>l o a d _ c o m p o n e n t s ( qw (PK : : Auto C o r e ) ) ; __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__−>s e t _ p r i m a r y _ k e y ( qw ( i d ) ) ;
• En la clase superior
p a c k a g e Mi : : Base ;
u s e b a s e qw ( DBIx : : C l a s s : : Schema ) ; __PACKAGE__−>l o a d _ c l a s s e s ( ) :
Caso de Estudio: Perl
DBIx::Class• En el programa principal se establece conexión . . .
u s e Mi : : Base ;
my $ d s n = ’ 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−>c o n n e c t ( $dsn , $ u s e r , $ 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 ( ’ Tabl a ’)−> f i n d ( 4 2 ) ;
• Búsquedas complejas conSQL::Abstract
my $ r o w s = $db−> r e s u l t s e t ( ’ Tabl a ’)−> s e a r c h ( {
name => { l i k e => ’ Ern %’ } , e d a d => { ’ > ’ => 40 } } ) ;
Caso de Estudio: Perl
DBIx::Classy 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::Translatorconvierte 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
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.
Generación de Resultados
La salida no se genera con
• 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.
Sistema de Plantillas
• Laplantilla 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.
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::TemplateyCGI::FormBuilderen Perl).
• Sistema de plantillas con extensiones para múltiples formatos de salida (e.g.Template::Toolkiten Perl).
• Habilidades de inclusión ycachingson esenciales para despliegues complejos.
Caso de Estudio: Perl
HTML::Template• Las plantillas se escriben en HTML con marcas especiales
<h1><!−− t m p l _ v a r name= t i t u l o −−></h1> B i e n v e n i d o , <!−− t m p l _ v a r name=u s u a r i o −−>
• El programador carga las plantillas y pega los valores
u s e HTML : : T e m p l a t e ;
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 => ’ E l r e s u l t a d o ’ ) ;
$t−>param ( u s u a r i o => ’ E r n e s t o ’ ) ; p r i n t $t−>o u t p u t ;
• La librería hace el resto
<h1>E l r e s u l t a d o </h1> B i e n v e n i d o , E r n e s t o
Caso de Estudio: Perl
HTML::TemplateyCGI::FormBuilder• Dentro de la plantilla se indica
• Donde incluir la “magia JavaScript” generada porCGI::FormBuilder. • Donde incluir el formulario generado porCGI::FormBuilder.
<!−− t m p l _ v a r name=j s−h e a d −−> . . . <!−− t m p l _ v a r name=form−s t a r t −−> . . . <!−− t m p l _ v a r name= f i e l d−nombre −−> . . . <!−− t m p l _ v a r name= f i e l d−c l a v e −−> <!−− t m p l _ v a r name=form−s u b m i t −−> <!−− t m p l _ v a r name=form−end −−>
• El programador carga las plantillas a través deCGI::FormBuilder.
my $ t = CGI : : F r o m B u i l d e r−>new ( . . . l o s campos y v a l i d a c i o n e s . . .
Caso de Estudio: Perl
Template::Toolkit• Sistema de plantillas generales susceptible de ser utilizado para generar cualquiertipo de contenido
• Texto simple, estructurado o HTML de forma natural. • PDF, gráficos a través deplugins.
• Puede utilizarse separado del lenguaje de programación para la generación estática de contenido.
• Pluginsapoyados en otros módulos Perl • Gráficos a través deGD.
• YAML y XML.
• Generación de PostScript y PDF vía LATEX
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