Meta Description" name="description" />
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POE - Programación Orientada a Eventos</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Urbanist:wght@400;500;700&family=JetBrains+Mono&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
<style>
/* 1. CONFIGURACIÓN GENERAL (Setup) */
* { box-sizing: border-box; }
body {
background-color: #020617; /* Fondo ultra oscuro para contraste */
display: grid;
gap: 20px;
grid-template-columns: 1fr;
margin: 0;
min-height: 100vh;
padding: 20px 0;
place-items: center;
font-family: 'Urbanist', sans-serif;
}
.slide-container {
align-items: flex-start;
background-color: #0f172a; /* Navy profundo */
border-radius: 12px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.4);
display: flex;
flex-direction: column;
height: 720px;
justify-content: center;
overflow: hidden;
padding: 60px;
position: relative;
width: 1280px;
}
/* Efectos de fondo decorativos (Abstract Shapes) */
.slide-container::before {
content: '';
position: absolute;
width: 400px;
height: 400px;
background: radial-gradient(circle, rgba(34, 211, 238, 0.1) 0%, transparent 70%);
top: -100px;
right: -100px;
z-index: 0;
}
.slide-container::after {
content: '';
position: absolute;
width: 300px;
height: 300px;
background: radial-gradient(circle, rgba(132, 204, 22, 0.05) 0%, transparent 70%);
bottom: -50px;
left: -50px;
z-index: 0;
}
.slide-container > * { position: relative; z-index: 1; }
/* 2. TIPOGRAFÍA (Typography) */
h1, h2, h3 { color: #f8fafc; font-weight: 700; margin: 0; }
p, li, td, th { color: #cbd5e1; font-size: 20px; line-height: 1.5; }
.slide-title {
font-size: 48px;
margin-bottom: 40px;
text-align: left;
width: 100%;
border-left: 6px solid #22d3ee;
padding-left: 20px;
}
/* 3. LAYOUTS ESPECÍFICOS */
.content-area {
display: flex;
flex-direction: column;
flex-grow: 1;
justify-content: center;
width: 100%;
}
.title-layout { text-align: center; width: 100%; }
.title-layout h1 { font-size: 90px; color: #22d3ee; margin-bottom: 20px; }
.title-layout .subtitle { font-size: 32px; color: #94a3b8; font-weight: 400; }
.two-column { display: grid; grid-template-columns: 1fr 1fr; gap: 60px; width: 100%; align-items: center; }
.image-wrapper {
border-radius: 16px;
overflow: hidden;
border: 1px solid rgba(34, 211, 238, 0.3);
height: 400px;
box-shadow: 0 10px 25px rgba(0,0,0,0.3);
}
.image-wrapper img { width: 100%; height: 100%; object-fit: cover; }
.tile {
background: rgba(30, 41, 59, 0.5);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
padding: 30px;
text-align: center;
}
.tile .icon { font-size: 48px; color: #22d3ee; margin-bottom: 20px; }
.bullet-list ul { list-style: none; padding: 0; }
.bullet-list li { position: relative; padding-left: 40px; margin-bottom: 20px; }
.bullet-list i { position: absolute; left: 0; top: 5px; color: #84cc16; font-size: 24px; }
.table-layout table { width: 100%; border-collapse: collapse; background: rgba(15, 23, 42, 0.8); border-radius: 12px; overflow: hidden; }
.table-layout th, .table-layout td { padding: 20px; border-bottom: 1px solid rgba(255,255,255,0.1); text-align: left; }
.table-layout th { background: #1e293b; color: #22d3ee; text-transform: uppercase; letter-spacing: 1px; }
/* Bleed Image Right */
.slide-container.bleed-image-layout { display: grid; grid-template-columns: 1fr 1fr; align-items: start; padding: 0; }
.bleed-image-layout .content-container { padding: 60px; }
.bleed-image-layout img { height: 720px; width: 100%; object-fit: cover; }
/* Timeline */
.timeline-layout { display: flex; justify-content: space-between; position: relative; width: 100%; margin-top: 50px; }
.timeline-line { position: absolute; top: 50%; width: 100%; height: 4px; background: #334155; z-index: 0; }
.timeline-item { width: 45%; position: relative; z-index: 1; background: #1e293b; padding: 20px; border-radius: 12px; border: 1px solid #22d3ee; }
/* Custom Quote/Meme */
.meme-text { font-family: 'JetBrains Mono', monospace; color: #84cc16; font-size: 24px; background: rgba(0,0,0,0.5); padding: 10px; border-radius: 8px; }
</style>
</head>
<body>
<div class="slide-container" id="slide1">
<div class="title-layout">
<h1>POE</h1>
<p class="subtitle">Programación Orientada a Eventos</p>
<div style="margin-top: 40px; height: 4px; width: 200px; background: #22d3ee; margin-left: auto; margin-right: auto;"></div>
</div>
</div>
<div class="slide-container" id="slide2">
<h2 class="slide-title">¿Qué es un Evento?</h2>
<div class="content-area">
<div class="two-column">
<div>
<p>Un evento es cualquier <strong>acción o cambio</strong> detectado por el sistema que puede generar una reacción.</p>
<div class="bullet-list" style="margin-top: 20px;">
<ul>
<li><i class="fas fa-keyboard"></i> Alguien escribe en un documento.</li>
<li><i class="fas fa-mouse-pointer"></i> Un clic en un botón "Comprar".</li>
<li><i class="fas fa-clock"></i> Una notificación de estado de pedido.</li>
</ul>
</div>
</div>
<div class="image-wrapper">
<img src="http://googleusercontent.com/image_collection/image_retrieval/9828878923920273685" alt="Typing on keyboard">
</div>
</div>
</div>
</div>
<div class="slide-container" id="slide3">
<h2 class="slide-title">Definición Técnica</h2>
<div class="content-area">
<div class="bullet-list">
<ul>
<li><i class="fas fa-cube"></i> <strong>Objeto de Sistema:</strong> Es un objeto que recibe el sistema el cual puede generar algún cambio de estado.</li>
<li><i class="fas fa-random"></i> <strong>Impredecibilidad:</strong> A priori no conocemos cuándo van a llegar, pero sabemos cuáles pueden llegar.</li>
<li><i class="fas fa-code-branch"></i> <strong>Origen:</strong> Pueden ser definidos por el usuario, por hardware o por el propio sistema interno.</li>
</ul>
</div>
</div>
</div>
<div class="slide-container" id="slide4">
<h2 class="slide-title">Propiedades de los Eventos</h2>
<div class="content-area">
<div class="two-column">
<div class="image-wrapper">
<img src="http://googleusercontent.com/image_collection/image_retrieval/7434262556739455815" alt="Order status persistent timeline">
</div>
<div>
<div class="tile" style="margin-bottom: 20px;">
<div class="icon"><i class="fas fa-lock"></i></div>
<h3>Inmutables</h3>
<p>Una vez que el evento ocurre, no puede ser modificado. Es un hecho histórico.</p>
</div>
<div class="tile">
<div class="icon"><i class="fas fa-database"></i></div>
<h3>Persistentes</h3>
<p>Pueden ser almacenados indefinidamente para auditoría o procesamiento posterior.</p>
</div>
</div>
</div>
</div>
</div>
<div class="slide-container bleed-image-layout" id="slide5">
<div class="content-container">
<h2 class="slide-title" style="border:none; padding:0;">Hechos Históricos</h2>
<p>En POE, el evento representa el <strong>pasado</strong>. </p>
<div class="meme-text">"Changing the past doesn't change the future."</div>
<p style="margin-top: 20px;">Si un pedido fue "Cancelado", ese evento queda registrado para siempre. No borramos el evento, emitimos uno nuevo de "Corrección".</p>
</div>
<div class="image-container">
<img src="http://googleusercontent.com/image_collection/image_retrieval/1709114196799408028" alt="Avengers Endgame Hulk Meme">
</div>
</div>
<div class="slide-container" id="slide6">
<h2 class="slide-title">Secuencial vs. Orientada a Eventos</h2>
<div class="content-area">
<div class="two-column" style="align-items: stretch;">
<div class="tile">
<h3 style="color: #94a3b8;">Programación Secuencial (PS)</h3>
<hr style="border: 1px solid #334155; margin: 20px 0;">
<p><strong>El Programador</strong> maneja el flujo del sistema.</p>
<p style="font-size: 16px; font-style: italic;">"Haz A, luego B, si pasa X haz C."</p>
</div>
<div class="tile" style="border-color: #22d3ee;">
<h3 style="color: #22d3ee;">Prog. Orientada a Eventos (POE)</h3>
<hr style="border: 1px solid #22d3ee; margin: 20px 0;">
<p><strong>El Usuario o Sistema</strong> maneja el flujo.</p>
<p style="font-size: 16px; font-style: italic;">"Estoy esperando... cuando pase X, reacciono con Y."</p>
</div>
</div>
</div>
</div>
<div class="slide-container" id="slide7">
<h2 class="slide-title">¿Por qué usar POE?</h2>
<div class="content-area">
<div class="two-column">
<div>
<h3>El Problema del Acoplamiento</h3>
<p>En sistemas tradicionales, si el componente A llama al B y B falla, A también falla.</p>
<p><strong>Analogía Samsa:</strong> Las dependencias rígidas hacen que el sistema sea frágil. Si un receptor se "transforma" o desaparece, el emisor queda bloqueado.</p>
</div>
<div class="image-wrapper">
<img src="http://googleusercontent.com/image_collection/image_retrieval/14896519459818081480" alt="Tangled wires coupling">
</div>
</div>
</div>
</div>
<div class="slide-container" id="slide8" style="background-image: linear-gradient(rgba(15, 23, 42, 0.9), rgba(15, 23, 42, 0.9)), url('http://googleusercontent.com/image_collection/image_retrieval/1117826485362343358'); background-size: cover;">
<h2 class="slide-title">Arquitectura POE</h2>
<div class="content-area">
<div class="tiled-content" style="align-items: center;">
<div class="tile" style="background: #1e293b;"><h3>Emisor</h3><p>Detecta el cambio y emite el evento.</p></div>
<div class="icon"><i class="fas fa-arrow-right"></i></div>
<div class="tile" style="background: #0ea5e9; border: 2px solid #fff;"><h3>Broker</h3><p>Controlador que distribuye el evento.</p></div>
<div class="icon"><i class="fas fa-arrow-right"></i></div>
<div class="tile" style="background: #1e293b;"><h3>Suscriptores</h3><p>Reaccionan al evento de forma independiente.</p></div>
</div>
</div>
</div>
<div class="slide-container" id="slide9">
<h2 class="slide-title">Balance de la Arquitectura</h2>
<div class="content-area">
<div class="table-layout">
<table>
<thead>
<tr>
<th><i class="fas fa-plus-circle"></i> Ventajas</th>
<th><i class="fas fa-minus-circle"></i> Desventajas</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Desacoplamiento:</strong> Las entidades no necesitan conocerse entre sí.</td>
<td><strong>Performance:</strong> El intermediario (Broker) puede añadir latencia.</td>
</tr>
<tr>
<td><strong>Contexto:</strong> Evita entidades "Dios" que manejan todo.</td>
<td><strong>Consistencia Eventual:</strong> El cambio no es inmediato en todo el sistema.</td>
</tr>
<tr>
<td><strong>Escalabilidad:</strong> Es fácil añadir nuevos suscriptores sin tocar el código existente.</td>
<td><strong>Complejidad:</strong> Es más difícil seguir el flujo lógico del código.</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="slide-container" id="slide10">
<h2 class="slide-title">POE en la práctica: JavaFX</h2>
<div class="content-area">
<div class="tiled-content">
<div class="tile">
<div class="icon"><i class="fas fa-bullseye"></i></div>
<h3>Source</h3>
<p>El objeto donde se originó el evento (ej: un Button).</p>
</div>
<div class="tile">
<div class="icon"><i class="fas fa-fingerprint"></i></div>
<h3>TargetType</h3>
<p>Define la naturaleza del cambio (Mouse, Key, Action).</p>
</div>
<div class="tile">
<div class="icon"><i class="fas fa-check-double"></i></div>
<h3>Consumed</h3>
<p>Flag que indica si el evento ya fue procesado. Si es <code>true</code>, se detiene.</p>
</div>
</div>
</div>
</div>
<div class="slide-container" id="slide11">
<h2 class="slide-title">Jerarquía de Clases</h2>
<div class="content-area">
<div class="two-column">
<div class="bullet-list">
<ul>
<li><i class="fas fa-sitemap"></i> <strong>EventObject:</strong> La base de Java Core.</li>
<li><i class="fas fa-long-arrow-alt-down"></i> <strong>Event:</strong> La clase base de JavaFX.</li>
<li><i class="fas fa-share-alt"></i> <strong>Subtipos:</strong> InputEvent, WindowEvent, ActionEvent.</li>
<li><i class="fas fa-mouse"></i> <strong>Hojas:</strong> MouseEvent, KeyEvent, ScrollEvent...</li>
</ul>
</div>
<div class="image-wrapper">
<img src="http://googleusercontent.com/image_collection/image_retrieval/10427885148820325841" alt="JavaFX Event Hierarchy">
</div>
</div>
</div>
</div>
<div class="slide-container" id="slide12">
<h2 class="slide-title">¿Cómo se disparan?</h2>
<div class="content-area">
<div class="two-column">
<div class="image-wrapper">
<img src="http://googleusercontent.com/image_collection/image_retrieval/2317686888604813405" alt="Event Dispatch Chain">
</div>
<div>
<h3>Fases del Despacho</h3>
<div class="timeline-layout" style="flex-direction: column; gap: 20px; margin:0;">
<div class="timeline-item" style="width: 100%;">
<strong style="color: #22d3ee;">1. Capturing (Discovery):</strong> El evento viaja desde la Escena hacia abajo hasta el nodo objetivo.
</div>
<div class="timeline-item" style="width: 100%;">
<strong style="color: #84cc16;">2. Bubbling:</strong> El evento "rebota" y viaja desde el nodo objetivo hacia arriba por la jerarquía.
</div>
</div>
</div>
</div>
</div>
</div>
<div class="slide-container" id="slide13">
<div class="title-layout">
<h1>¿Preguntas?</h1>
<p class="subtitle">Lectura recomendada: "Metamorfosis Asincrónica" de Federico Brasburg.</p>
<p style="margin-top: 50px; color: #94a3b8;">Programación Orientada a Eventos - Conceptos Básicos</p>
</div>
</div>
</body>
</html>13
5
238KB
322KB
249.0ms
312.0ms
429.0ms