Conceptos de Arquitectura
LET'S BUILD IT
¿Quién soy?
Full-stack LeanMind
Ex-alumno César Manrique
Adrián Ferrera
@AdrianFerrera91
adrian-afergon
@afergon
Una de las cosas que más nos gusta
Sentarnos a programar
Y hacer que las cosas funcionen
Pero no siempre es así...
La realidad es
LEER
DIÁLOGO
TRABAJO
Gran parte del día entendiendo código
Debatiendo, convenciendo y escuchando
Las aplicaciones deben mantenerse a lo largo del tiempo
ESTO NO ES MALO
La realidad es
LEER
DIÁLOGO
TRABAJO
Estaremos en contacto con la arquitectura
¿Qué es la arquitectura?
Estructura
Comunicación
¿Para que?
-
Entender
-
Mantener
-
Dialogar
-
Evolucionar
¿Cómo?
Separando funciones distintas
Delegando responsabilidades
Haciendo que no sepan unas de otras
¿Dónde?
¿Como alumno que me aporta?
Es una puerta necesaria para crecer profesionalmente
¿Cuál es la diferencia?
¿Cuál es la diferencia?
const postSection = document.getElementById('posts-section');
const http = new XMLHttpRequest();
const url = 'https://jsonplaceholder.typicode.com/posts';
let posts = [];
http.open('GET', url);
http.send();
http.onreadystatechange = (e) => {
posts = JSON.parse(http.responseText);
postSection.innerHTML = '';
posts.map((post) => {
const newPost = document.createElement('div');
newPost.innerHTML = `
<div id="post-${post.id}" class="post-item">
<h3>${post.title}</h3>
<p>${post.body}</p>
</div>
`;
postSection.appendChild(newPost);
})
}
¿Qué pasaría si filtramos?
¿Qué pasaría si filtramos?
function filter(value) {
postSection.innerHTML = '';
posts
.filter((post) =>
post.title.includes(value) || post.body.includes(value))
.map((post) => {
const newPost = document.createElement('div');
newPost.innerHTML = `
<div id="post-${post.id}" class="post-item">
<h3>${post.title}</h3>
<p>${post.body}</p>
</div>
`;
postSection.appendChild(newPost);
});
}
Vamos a limpiarlo
function renderPosts(posts) {
posts.map((post) => {
const newPost = document.createElement('div');
newPost.innerHTML = `
<div id="post-${post.id}" class="post-item">
<h3>${post.title}</h3>
<p>${post.body}</p>
</div>
`;
postSection.appendChild(newPost);
});
}
function filter(value) {
postSection.innerHTML = '';
const filteredPosts = posts
.filter((post) =>
post.title.includes(value) || post.body.includes(value));
renderPosts(filteredPosts);
}
http.onreadystatechange = (e) => {
posts = JSON.parse(http.responseText);
postSection.innerHTML = '';
renderPosts(posts);
}
MEDITEMOS UN POCO
¿QUÉ HACEMOS?
Recuperar datos
Filtrar la información
Pintar en pantalla
¿Por que está en el mismo fichero?
¿Cómo podríamos agruparlo?
Acceso a datos
Cálculos y operaciones
Representación
Recibe los siguientes términos
Acceso a datos
Cálculos y operaciones
Representación
Repository
Service
View
Veámoslo en código
Repository
const PostRepository = function () {
const http = new XMLHttpRequest();
const url = 'https://jsonplaceholder.typicode.com/posts';
function getPosts() {
http.open('GET', url);
http.send();
return new Promise((resolve, rejected) => {
http.onreadystatechange = (e) => {
if (http.status >= 200 && http.status < 300) {
// If successful
resolve(JSON.parse(http.responseText));
} else {
// If failed
reject({
status: http.status,
statusText: http.statusText
});
}
}
})
}
return {
getPosts
}
}
Service
const PostService = function () {
const postRepository = new PostRepository();
async function getPosts() {
return postRepository.getPosts()
}
function filterBy(text, posts) {
return posts
.filter((post) =>
post.title.includes(text) ||
post.body.includes(text))
}
return {
getPosts,
filterBy
}
}
View
const PostView = function() {
let posts = [];
const postSection = document.getElementById('posts-section');
const postService = new PostService();
function render (post) {
const newPost = document.createElement('div');
newPost.innerHTML = `
<div id="post-${post.id}" class="post-item">
<h3>${post.title}</h3>
<p>${post.body}</p>
</div>
`;
postSection.appendChild(newPost);
}
async function mount () {
posts = await postService.getPosts();
posts.map(render);
}
function filter(value) {
postSection.innerHTML = '';
const filteredPosts = postService.filterBy(value, posts);
filteredPosts.map(render);
}
return { mount, filter }
}
App
// App.js
PostView().mount();
<!DOCTYPE html>
<html>
<head>
<title>Post examples</title>
<meta name="viewport" content="width=device-width, user-scalable=no">
<link href="https://fonts.googleapis.com/css?family=Roboto&display=swap" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<h1>Post list</h1>
<section id="filter-section group">
<input type="text" placeholder="Filter" onkeyup="postView.filter(this.value)"/>
</section>
<section id="posts-section"></section>
<script src="post-reposioty.js" type="text/javascript"></script>
<script src="post-service.js" type="text/javascript"></script>
<script src="post-view.js" type="text/javascript"></script>
<script src="app.js" type="text/javascript"></script>
</body>
</html>
Las capas conforman un puzle
- ¿Y si leemos los datos de una BD?
+ Solo tenemos que crear un nuevo Repository
- ¿Y si cambian las reglas de filtrado?
+ Podemos actualizar la lógica sin que la vista se entere del cambio
- ¿Y si no me resulta sencillo pintar la vista de esta forma?
+ Simplemente puedes visualizarlo de otra forma: React, Vue, Angular, ember, jQuery...
Ya que la lógica no va en esta capa
ESTA ES LA BASE
PERO EXISTEN MUCHOS OTROS CONCEPTOS
Es la puerta para entender
otras tecnologías más complejas
y mejorar cada día en nuestro trabajo
CONCLUSIÓN
LA ARQUITECTURA NOS AYUDA A:
Comunicarnos con el equipo
Tener un código homogéneo
Simplificarnos el trabajo
Garantizar la calidad
¿Preguntas?
GRACIAS
Adrián Ferrera
@AdrianFerrera91
César Manrique 2k19 Arquitectura
By afergon
César Manrique 2k19 Arquitectura
- 429