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í...
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
LEER
DIÁLOGO
TRABAJO
Estructura
Comunicación
Separando funciones distintas
Delegando responsabilidades
Haciendo que no sepan unas de otras
Es una puerta necesaria para crecer profesionalmente
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);
})
}
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);
});
}
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);
}
¿QUÉ HACEMOS?
Recuperar datos
Filtrar la información
Pintar en pantalla
Acceso a datos
Cálculos y operaciones
Representación
Acceso a datos
Cálculos y operaciones
Representación
Repository
Service
View
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
}
}
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
}
}
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.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>
- ¿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
PERO EXISTEN MUCHOS OTROS CONCEPTOS
Es la puerta para entender
otras tecnologías más complejas
y mejorar cada día en nuestro trabajo
LA ARQUITECTURA NOS AYUDA A:
Comunicarnos con el equipo
Tener un código homogéneo
Simplificarnos el trabajo
Garantizar la calidad
Adrián Ferrera
@AdrianFerrera91