SlideShare una empresa de Scribd logo
1 de 51
Descargar para leer sin conexión
Hierarchical MVC
Transforma tu Monolito!
QUIÉN SOY!
• Luis Majano
• Ingeniero Eléctrico + Informatico
• El Salvador =>Texas
• Sandals => ESRI => Ortus
• CEO de Ortus Solutions
@lmajano
@ortussolutions
www.ortussolutions.com
Spanglish Ahead
Areas de Enfoque
Soporte
Y
Entrenamiento
Consultoria
Tutoria
Aumento de
Personal
Open Source
Desde 2006
OPEN SOURCE
hMVC CLI-PM-Server Cloud Directory Modular CMS
DI + AOP Logging Caching API
BDD/TDD
El Problema “Legacy”
Aplicaciones Monolíticas
Escuela de Arquitectura
HMVC
Microservicios
ColdBox HMVC
Demo
EL PROBLEMA “LEGACY”
LEGACY PROBLEM
• Da mal nombre a cualquier lenguaje
• Ruby, PHP, CFML, Java, etc.
• Lenguajes con mas de 10 años
• Problemas de Seguridad
• Problemas de Rendimiento
• Problemas de Empleados
• Problemas de Desarrollo
• Problemas de Motivación
Problemas deTodoTipo!
LEGACY PROBLEM
•Encuesta 500+ 2019
•>55% No MVC
•>50% No DI
•>50% No Testing
Refrescar el Navegador No Cuenta! https://teratech.com/state-of-the-CF-Union-2019-Results
LES GUSTA MY APP?
• MVC Framework or infierno de spaghetti?
• Orientation de Objectos o infierno de paginas?
• Pruebas Automaticas? Integración Continua?
• Agile/Scrum?
• Control de Fuente? (Zip files no cuentan!)
• Despliegue Continuo?
• Contendores? Microservicios?
Aplicaciones Legacy
Comentarios Graciosos!
<!—- Do not remove the following lines or things break —>
<!— Dont’ know what this variable does, but don’t touch it —->
<!—- Remove at your own risk —->
<!—- I have no idea where this variable is set —>
“El Software Siempre esta
Obligado a cambiar”
AVERGONZADO?
• Legacy no tiene que avergonzar
• Fue la fundación
• Es una deuda tecnica
• Es un problema que existirá SIEMPRE
• Software es organico, respira,
expande, contrae
• Hay que Mejorar Continuamente o
Moriras!
Motivación!
MODERNIZE 

OR 

DIE!™
ESCUELA DE ARQUITECTURA
1. COHESION - COUPLING
Cohesión Acoplamiento
2. MVC
• Patron de Arquitectura mas común
• Enfoque en Separación de lógica
• Modelos, Vistas, Controladores
• Ayuda a cumplir con O.O.
• Miembros de equipo especializados
• Metodologías comprobadas
• Mantenimiento lógico
• Increíbles Beneficios
• Pero todas las aplicaciones crecen….
2. MVC
• Las capas engordan!
• Dependencias crecen
• Requisitos crecen y cambian
• Cuidado con ocupar herencias
• Y si no te cuidas…
3. N-TIER - CHALUPA MEJICANA
• Muy rico!! Pero Indigestion segura
• Empiezas a seguir agregando capas y
mas capas….
• Acoplamiento al máximo
• TienesTests?Tienes Automatización?
Ocupas DI? Herencia?
• El Monolitico MVC
QUE HACEMOS?
4. HMVC = MVC JERÁRQUICO
4. HMVC
• Evolución de MVC
• MVCTriads Independientes
• Beneficios
• Alta Cohesion
• Bajo en Acoplamiento (y grasas)
• Modularización
• Mejor
• Organización
• Reuso
• Extensibilidad
• Testabilidad (Es una palabra!!)
4. HMVC FRAMEWORKS
• ColdFusion (CFML)
• ColdBox MVC
• www.coldbox.org
• PHP
• CodeIgniter
• www.codeigniter.com
• FuelPHP
• www.fuelphp.com
• Phpixie
• www.phpixie.com
• Any others? lmajano@ortussolutions.com
5. MICROSERVICES (MICROSERVICIOS)
AN APPROACH TO DEVELOPING A SINGLE
APPLICATION AS A SUITE OF SMALL SERVICES,
EACH RUNNING IN ITS OWN PROCESS AND
COMMUNICATING WITH LIGHTWEIGHT
MECHANISMS.
Martin Fowler
5. MICROSERVICES
M C
V
M C
V
M C
V
• Mejor Enfoque
• Menos intimidación a hacer cambios
• Tolerancia de Fallas
• Mantenimiento Reduce
• Mejora Continua
• Ciclos de “Release” Cortos!
• Independencia de Requisitos
• Monolito Evoluciona
5. MICROSERVICES
FORMULA DE MICROSERVICIOS
Identifica
Remueva
Escala
HMVC Microservicios
+
FORMULA DE MODERNIZACIÓN
NORMAS DE COMBATE
• Instala tu app HMVC moderno junto a tu app legacy (Folder)
• Modifica tus puntos de entrada para routing de URL: 

legacy y moderno
• Identifica requisitos a modernizar:
• Construye como triads HMVC ó
• Refactorización a micro servicios
• Nuevos requisitos van al HMVC como triads
• Nuevos requisitos tienen pruebas BDD
• JUST DO IT!
Identifica Remueva Escala
CAMBIO DE
PARADIGMA
MODERNIZAR…
No hay Hacks
No hay Atajos
Trabajo
Disciplina
• Incremento en conversiones
• Decremento de carga de paginas
• Agilidad
• Menos Mantenimiento
• Mucho mas visibilidad total
• Emoción de los equipos
• Moral Renovada
• Mas enfoque en inovar y no solventar
BENEFICIOS
Lanzamientos los viernes? 

Claro que si!
Una implementación…
ColdFusion (CFML)
COLDFUSION (CFML)
COLDFUSION (CFML)
• Lenguaje Maduro (22+ años)
• Lenguaje Dinámico encima del JVM (JSR-223)
• Dos Sabores
• Adobe ColdFusion
• Paid
• Lucee CFML (lucee.org)
• Gratis & Open Source
• Compilación directa a Java Byte-Code
• Moderno, Funcional y Orientado a Objetos
• Script oTags
• Eco systema maduro
• Cuando fue la ultima vez que lo viste?
COLDBOX MODULES = SUPER PODERES
• MVC desde 2006, HMVC desde 2011
• MVC triads => Modules
• Direccionables
• Compuestos (Inception)
• Dependencias
• En Ejecución:
• Instalados
• Recargados
• Eliminados
• ForgeBox 400+
• www.forgebox.io
COLDBOX MODULES
• MVC por Convenciones
• Manejo de Objetos
• Manejo de URL Routers
• Manejo de Eventos
• Variables de Entorno
• Detección de Entorno
• Dependencias
• Muchisimo mas!
App

Router
Module

Router
Module

Router
Module

Router
Module

Router
Module

Router
Module

Router
Module

Router
Module

Router
Module

Router
ColdBox MVC
handlers
layouts
models
modules
views
box.json
modules_app
Dependencias
Tus Modulos
Descriptor
Anatomia de Modulo
ModuleConfig.cfc
handlers
layouts
models
modules
modules_app
Nombre Del
Modulo
box.json
views
Incepción
{
"name":"cbSwagger-shell",
"version":"1.1.0",
"slug":"cbSwagger-shell",
"private":false,
"dependencies":{
“coldbox":"^5.0.0",
“workbench":"git+https://github.com/ortus/unified-workbench.git",
"cbjavaloader":">1.0.0",
"swagger-sdk":">0.0.9"
},
"devDependencies":{
"testbox":"^2.8.0"
},
"installPaths":{
"coldbox":"coldbox/",
"testbox":"testbox/",
"cbjavaloader":"modules/cbjavaloader/",
"swagger-sdk":"modules/swagger-sdk/",
"workbench":"workbench"
},
"testbox":{
"runner":"http://localhost:49616"
},
"scripts":{
"postVersion":"recipe workbench/bump.boxr"
}
}
box.json
MODULECONFIG.CFC
• Unico requisito para un modulo
• Objeto Descriptor
• 1 función de configuración: configure()
• Debe de existir en la raíz de tu modulo
• Tiene propiedades
• Funciones de devolución
• Detecta tu entorno
• Es un “event listener”
PROPIEDADES
component{
this.activate = true;
this.disabled = false;
this.title = "My Test Module";
this.author = "Luis Majano";
this.webURL = "http://www.coldbox.org";
this.description = "A funky test module";
this.version = "1.0.0";
this.viewParentLookup = true;
this.layoutParentLookup = true;
this.entryPoint = "/testing";
this.inheritEntryPoint = true;
this.autoMapModels = true;
this.modelNamespace = "cbstore";
this.cfmapping = "cbstore";
this.aliases = [ "store", "ecommerce", "shop" ];
this.dependencies = [ "JavaLoader", "CFCouchbase" ];
}
FUNCIONES DE DEVOLUCIÓN
MODULECONFIG.CFCCONFIGURE
function configure(){
        settings = {
            caching = false,
            mailTo = "lmajano@ortussolutions.com"
        };
        layoutSettings = { defaultLayout = "relax.cfm" };
        i18n = {
            resourceBundles = {
                "cbcore" = "#moduleMapping#/i18n/cbcore"
            },
            defaultLocale = "en_US",
            localeStorage = "cookie"
        };
        interceptorSettings = {
            // ContentBox Custom Events
            customInterceptionPoints = [
                // Code Rendering
                "cb_onContentRendering", "cb_onContentStoreRendering"
            ]
        };
router.
route( “/“ ).to( “Main.index” )
route( “/:handler/:action” ).end();
    }
Ejemplo:
box install cors
MANEJO DE OBJETOS
• Cada module tiene un namespace de modelos
• Se ocupa para injections y devoluciones de modelos:
• {modelName}@{moduleName}
• property name=“builder” inject=“builder@qb”
• getInstance( “builder@qb” )
EJECUCIONES INTERNAS
#runEvent( ‘module:users.dashboard' )#
#runRoute( “photos.data“ )#
DemoTime!
modules
v1 v2 vx
modules_app
API
handlers models
Requirements
modules
v1 v2 vx
modules_app
API
handlers models
• API de Contactos
• /contactos - Todos los contactos
• /contactos/:id - Un contacto
• Versiones
• Sin base de datos
• Con documentación (openApi)
• Con pruebas BDD
• Micro servicio!
<10 minutes
QUESTIONS?
Go Modularize!
www.ortussolutions.com
@ortussolutions

Más contenido relacionado

Similar a Transforma tu Monolito con HMVC

Html5 y otras yerbas
Html5 y otras yerbasHtml5 y otras yerbas
Html5 y otras yerbas
Avanet
 
DESARROLLO RAPIDO DE APLICACIONES WEB
DESARROLLO RAPIDO DE APLICACIONES WEBDESARROLLO RAPIDO DE APLICACIONES WEB
DESARROLLO RAPIDO DE APLICACIONES WEB
Javier Condori Flores
 
Implementación de una estrategia digital en WordPress - WordCamp Bogotá 2018
Implementación de una estrategia digital en WordPress - WordCamp Bogotá 2018Implementación de una estrategia digital en WordPress - WordCamp Bogotá 2018
Implementación de una estrategia digital en WordPress - WordCamp Bogotá 2018
Juan Buitrago
 
CURSO APLICACIONES WEB
CURSO APLICACIONES WEBCURSO APLICACIONES WEB
CURSO APLICACIONES WEB
Skynet Erp
 

Similar a Transforma tu Monolito con HMVC (20)

"Al rico" PHP
"Al rico" PHP"Al rico" PHP
"Al rico" PHP
 
Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2
 
Java script para desarrolladores SharePoint
Java script para desarrolladores SharePointJava script para desarrolladores SharePoint
Java script para desarrolladores SharePoint
 
Html5 y otras yerbas
Html5 y otras yerbasHtml5 y otras yerbas
Html5 y otras yerbas
 
Html5 y otras yerbas
Html5 y otras yerbasHtml5 y otras yerbas
Html5 y otras yerbas
 
VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain ...
VLCTechFest -  Simplificando Controladores: Una introducción a Action-Domain ...VLCTechFest -  Simplificando Controladores: Una introducción a Action-Domain ...
VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain ...
 
Frameworks y administracion de contenidos
Frameworks y administracion de contenidosFrameworks y administracion de contenidos
Frameworks y administracion de contenidos
 
SharePoint Saturday Barcelona. La importancia de JavaScript en nuestros desar...
SharePoint Saturday Barcelona. La importancia de JavaScript en nuestros desar...SharePoint Saturday Barcelona. La importancia de JavaScript en nuestros desar...
SharePoint Saturday Barcelona. La importancia de JavaScript en nuestros desar...
 
DESARROLLO RAPIDO DE APLICACIONES WEB
DESARROLLO RAPIDO DE APLICACIONES WEBDESARROLLO RAPIDO DE APLICACIONES WEB
DESARROLLO RAPIDO DE APLICACIONES WEB
 
Webinar Arquitectura de Microservicios
Webinar Arquitectura de MicroserviciosWebinar Arquitectura de Microservicios
Webinar Arquitectura de Microservicios
 
Novedades de ASP.NET MVC6
Novedades de ASP.NET MVC6Novedades de ASP.NET MVC6
Novedades de ASP.NET MVC6
 
LenguajeJavaSpringBootDesarrolloweb.pptx
LenguajeJavaSpringBootDesarrolloweb.pptxLenguajeJavaSpringBootDesarrolloweb.pptx
LenguajeJavaSpringBootDesarrolloweb.pptx
 
Implementación de una estrategia digital en WordPress - WordCamp Bogotá 2018
Implementación de una estrategia digital en WordPress - WordCamp Bogotá 2018Implementación de una estrategia digital en WordPress - WordCamp Bogotá 2018
Implementación de una estrategia digital en WordPress - WordCamp Bogotá 2018
 
Introducción a microservicios
Introducción a microserviciosIntroducción a microservicios
Introducción a microservicios
 
Symfony-Community: Introducción a Symfony Framework
Symfony-Community: Introducción a Symfony FrameworkSymfony-Community: Introducción a Symfony Framework
Symfony-Community: Introducción a Symfony Framework
 
Panel Magmaconf
Panel MagmaconfPanel Magmaconf
Panel Magmaconf
 
Desarrollo modermo de aplicaciones web
Desarrollo modermo de aplicaciones webDesarrollo modermo de aplicaciones web
Desarrollo modermo de aplicaciones web
 
CURSO APLICACIONES WEB
CURSO APLICACIONES WEBCURSO APLICACIONES WEB
CURSO APLICACIONES WEB
 
SpringIO 2012 Madrid-Escalabilidad con Grails
SpringIO 2012 Madrid-Escalabilidad con GrailsSpringIO 2012 Madrid-Escalabilidad con Grails
SpringIO 2012 Madrid-Escalabilidad con Grails
 
SGCE 2014 micro services
SGCE 2014 micro servicesSGCE 2014 micro services
SGCE 2014 micro services
 

Más de Ortus Solutions, Corp

Más de Ortus Solutions, Corp (20)

BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 
Ortus Government.pdf
Ortus Government.pdfOrtus Government.pdf
Ortus Government.pdf
 
Luis Majano The Battlefield ORM
Luis Majano The Battlefield ORMLuis Majano The Battlefield ORM
Luis Majano The Battlefield ORM
 
Brad Wood - CommandBox CLI
Brad Wood - CommandBox CLI Brad Wood - CommandBox CLI
Brad Wood - CommandBox CLI
 
Secure your Secrets and Settings in ColdFusion
Secure your Secrets and Settings in ColdFusionSecure your Secrets and Settings in ColdFusion
Secure your Secrets and Settings in ColdFusion
 
Daniel Garcia ContentBox: CFSummit 2023
Daniel Garcia ContentBox: CFSummit 2023Daniel Garcia ContentBox: CFSummit 2023
Daniel Garcia ContentBox: CFSummit 2023
 
ITB_2023_Human-Friendly_Scheduled_Tasks_Giancarlo_Gomez.pdf
ITB_2023_Human-Friendly_Scheduled_Tasks_Giancarlo_Gomez.pdfITB_2023_Human-Friendly_Scheduled_Tasks_Giancarlo_Gomez.pdf
ITB_2023_Human-Friendly_Scheduled_Tasks_Giancarlo_Gomez.pdf
 
ITB_2023_CommandBox_Multi-Server_-_Brad_Wood.pdf
ITB_2023_CommandBox_Multi-Server_-_Brad_Wood.pdfITB_2023_CommandBox_Multi-Server_-_Brad_Wood.pdf
ITB_2023_CommandBox_Multi-Server_-_Brad_Wood.pdf
 
ITB_2023_The_Many_Layers_of_OAuth_Keith_Casey_.pdf
ITB_2023_The_Many_Layers_of_OAuth_Keith_Casey_.pdfITB_2023_The_Many_Layers_of_OAuth_Keith_Casey_.pdf
ITB_2023_The_Many_Layers_of_OAuth_Keith_Casey_.pdf
 
ITB_2023_Relationships_are_Hard_Data_modeling_with_NoSQL_Curt_Gratz.pdf
ITB_2023_Relationships_are_Hard_Data_modeling_with_NoSQL_Curt_Gratz.pdfITB_2023_Relationships_are_Hard_Data_modeling_with_NoSQL_Curt_Gratz.pdf
ITB_2023_Relationships_are_Hard_Data_modeling_with_NoSQL_Curt_Gratz.pdf
 
ITB_2023_Extend_your_contentbox_apps_with_custom_modules_Javier_Quintero.pdf
ITB_2023_Extend_your_contentbox_apps_with_custom_modules_Javier_Quintero.pdfITB_2023_Extend_your_contentbox_apps_with_custom_modules_Javier_Quintero.pdf
ITB_2023_Extend_your_contentbox_apps_with_custom_modules_Javier_Quintero.pdf
 
ITB_2023_25_Most_Dangerous_Software_Weaknesses_Pete_Freitag.pdf
ITB_2023_25_Most_Dangerous_Software_Weaknesses_Pete_Freitag.pdfITB_2023_25_Most_Dangerous_Software_Weaknesses_Pete_Freitag.pdf
ITB_2023_25_Most_Dangerous_Software_Weaknesses_Pete_Freitag.pdf
 
ITB_2023_CBWire_v3_Grant_Copley.pdf
ITB_2023_CBWire_v3_Grant_Copley.pdfITB_2023_CBWire_v3_Grant_Copley.pdf
ITB_2023_CBWire_v3_Grant_Copley.pdf
 
ITB_2023_Practical_AI_with_OpenAI_-_Grant_Copley_.pdf
ITB_2023_Practical_AI_with_OpenAI_-_Grant_Copley_.pdfITB_2023_Practical_AI_with_OpenAI_-_Grant_Copley_.pdf
ITB_2023_Practical_AI_with_OpenAI_-_Grant_Copley_.pdf
 
ITB_2023_When_Your_Applications_Work_As_a_Team_Nathaniel_Francis.pdf
ITB_2023_When_Your_Applications_Work_As_a_Team_Nathaniel_Francis.pdfITB_2023_When_Your_Applications_Work_As_a_Team_Nathaniel_Francis.pdf
ITB_2023_When_Your_Applications_Work_As_a_Team_Nathaniel_Francis.pdf
 
ITB_2023_Faster_Apps_That_Wont_Get_Crushed_Brian_Klaas.pdf
ITB_2023_Faster_Apps_That_Wont_Get_Crushed_Brian_Klaas.pdfITB_2023_Faster_Apps_That_Wont_Get_Crushed_Brian_Klaas.pdf
ITB_2023_Faster_Apps_That_Wont_Get_Crushed_Brian_Klaas.pdf
 
ITB_2023_Chatgpt_Box_Scott_Steinbeck.pdf
ITB_2023_Chatgpt_Box_Scott_Steinbeck.pdfITB_2023_Chatgpt_Box_Scott_Steinbeck.pdf
ITB_2023_Chatgpt_Box_Scott_Steinbeck.pdf
 
ITB_2023_CommandBox_Task_Runners_Brad_Wood.pdf
ITB_2023_CommandBox_Task_Runners_Brad_Wood.pdfITB_2023_CommandBox_Task_Runners_Brad_Wood.pdf
ITB_2023_CommandBox_Task_Runners_Brad_Wood.pdf
 
ITB_2023_Create_as_many_web_sites_or_web_apps_as_you_want_George_Murphy.pdf
ITB_2023_Create_as_many_web_sites_or_web_apps_as_you_want_George_Murphy.pdfITB_2023_Create_as_many_web_sites_or_web_apps_as_you_want_George_Murphy.pdf
ITB_2023_Create_as_many_web_sites_or_web_apps_as_you_want_George_Murphy.pdf
 
ITB2023 Developing for Performance - Denard Springle.pdf
ITB2023 Developing for Performance - Denard Springle.pdfITB2023 Developing for Performance - Denard Springle.pdf
ITB2023 Developing for Performance - Denard Springle.pdf
 

Último

Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 

Último (11)

Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 

Transforma tu Monolito con HMVC