Paul Leger pleger@pleger.cl http://pleger.cl Programación Modular, Orientación a Aspectos y Sistemas Sensibles al Contexto Paul Leger pleger@pleger.cl http://pleger.cl
Construcción de un Software Ingeniero de Software Trato: Un «buen» software Cliente Resultado: Un cliente que sufre por un mal software
Caso Real: Administrar la Seguridad en Dynamics AX (ERP) Error de seguridad al ingresar una transacción Edición manual de la seguridad ¿Son malos los ingenieros de software? ¿Es difícil construir un «buen» software?
Objetivo de la Presentación Sistemas que se adaptan al contexto Aspectos ¿Cómo construir un «buen» software?
“Cada código debe ser escrito en un solo lugar” Programación Modular “Cada código debe ser escrito en un solo lugar”
Sumando Matrices //dada una matriz m1 //dada una matriz m2 //m3 = m1 + m2 for (i = 0; i < 2; ++i) for (j = 0; j < 2; ++j) m3[j][i] = m1[i][j] + m2[i][j]; //m3 = m3 + m2 for (i = 0; i < 2; ++i) for (j = 0; j < 2; ++j) m3[j][i] = m3[i][j] + m2[i][j]; //m4 = m2 + m3 for (i = 0; i < 2; ++i) for (j = 0; j < 2; ++j) m4[j][i] = m2[i][j] + m3[i][j]; ¿Un error? ¿Una modificación? (ej. 2x2 → 5x5) Moraleja: Copiar & Pegar no es una buena idea - Modularity is good - Crosscutting concerns… (logging) - General procedures paradigms are insufficient - AOP improves modularity
Sumando Matrices en un Software Grande Software complejo y largo ¿un error o modificación? El bug podría ser un: protocolo de seguridad, acceso a cuenta corriente, etc Moraleja: Copiar & Pegar no es una buena idea
Programación Modular En 1972, David Parnas dijo: «Cada interés (concern) deber ser implementado en solo lugar, llamado módulo» function sumar (mA, mB) { for (j = 0; j < mA.largoFila; ++j) for (j = 0; j < mA.largoColumna; ++j) mC[i][j] = mA[i][j] + mB[i][j]; return mC; } m3 = sumar(m1,m2); m3 = sumar(m3,m1); m4 = sumar(m2,m3); Módulo
Beneficios de la Programación Modular Desarrollando un sistema Software creado a través de la composición de módulos Cada modulo puede ser reemplazado/actualizado fácilmente Mantención del software resulta más sencilla
¿Es Siempre Posible La Programación Modular? Hay diversas técnicas/metodologías que ayudan a la programación modular (ej. Arquitectura de software) function IngresarNotas (notas) { verificarAcceso(); //código para ingresar notas } function cambiarNotas (notas) { verificarAcceso(); //código para cambiar notas ¿Es modular la implementación la seguridad? Por ejemplo: verificar el acceso de un usuario cada vez que se ejecuta una función Hay concerns que no pueden ser implementados de manera modular (ej. Seguridad y depuración) Estos concerns son conocidos como crosscutting concerns
Caso Real: Implementación de la Seguridad en un Servidor Web La manchas rojas indican la implementación de la seguridad en el servidor Web Si usted quisiera cambiar el protocolo de seguridad ¿Cómo y dónde comienza a modificar el software?
Orientación a Aspectos “De vuelta a la programación modular”
Programación Orientada a Aspectos En 1996, Gregor Kiczales dijo: «Un aspecto puede implementar modularmente los crosscutting concerns (e.g. seguridad)» Identifica ASPECTO Acción
Implementando Seguridad con Aspectos Solución sin aspectos Solución con aspectos function ingresarNotas(notas) { verificarAcceso(); //código para ingresar notas } function cambiarNotas (notas) { verificarAcceso(); //código para cambiar notas aspectoDepurador = { identifica: //llamadas a funciones accion: verificarAcceso(); } function ingresarNotas (notas) { //código para ingresar notas } function cambiarNotas (notas) { //código para cambiar notas Lenguajes de Aspectos conocidos: http://pleiad.cl/aspectscript
Terminología de Aspectos Join Point: Es un punto en la ejecución del programa sumar() restar() Pointcut: Es la identificación de un join point Advice: Acción a tomar cuando el pointcut identifica un join point print (“Ejecutando sumar”); Poincut ASPECTO Join Point Advice
¿Es suficiente Aspectos para volver a la programación modular? ¿Cómo detecto que intruso desea entrar a nuestro Facebook probando contraseña? Necesitamos observar 3 intentos de login login Aspectos solo puede identificar un solo punto de ejecución, y no una traza de ejecución
Programación Orientada a Aspectos En 2004, Remi Douence dijo: «Un stateful aspect puede identificar y reaccionar a trazas de ejecución» Stateful Aspect Identifica y reacciona
Implementando un detector de intrusos dectectorIntruso = { identifica: login → login → login accion: print(“INTRUSO”); } login(); login(); login(); login Lenguajes de Stateful Aspects conocidos: http://pleiad.cl/otm
Sistemas Sensibles al Contexto “Cambiando la conducta del programa”
Aplicaciones de Stateful Aspects: Sistemas Sensibles al Contexto (1/4) «Un sistema sensible al contexto cambia su conducta de acuerdo al contexto (ejecución del programa) » Aplicaciones para tablets Arriba Abajo Secuencia Enviar un correo a Karla Soria Acción
Aplicaciones de Stateful Aspects: Sistemas Sensibles al Contexto (2/4) Smart Home para gente ancianas Entrar al baño Δt > 3 horas No salió del baño Secuencia Avisar a una ambulancia Acción
Aplicaciones de Stateful Aspects: Sistemas Sensibles al Contexto (3/4) Adaptivo software para enseñar a sumar a alumnos de básicos secuencia errónea de pasos al resolver una suma Secuencia Mostrar un tutorial Acción
Aplicaciones de Stateful Aspects: Sistemas Sensibles al Contexto (4/4) Agentes inteligentes Acción Feedback
NO OLVIDE, ¡TENGA CUIDADO CUANDO «COPIA & PEGA»! Conclusiones Programación/Diseño Modular es esencial para desarrollar «buen» software Programación Orientada a Aspectos permite observar la ejecución de un programa Stateful Aspects permite cambiar la conducta del programa de acuerdo a la historia de su ejecución NO OLVIDE, ¡TENGA CUIDADO CUANDO «COPIA & PEGA»! http://pleger.cl/ucn (presentación) http://pleiad.cl/otm (tesis doctoral)