TFM Javier Alonso Saz
TFM Javier Alonso Saz
2017
“We're not just our failures. As much as they hurt, we learn from them. Then we
go out there and do our best to make up for them. Even though we never will”
"A hungry stomach, an empty pocket and a broken heart can teach you the best
lessons of life."
- Anónimo
2
3
4
Resumen
El objetivo de este trabajo de fin de máster es el desarrollo de una aplicación
como trabajo de fin de grado el año anterior. Esta plataforma estaba dotada de una
cualidades que se esperan de cualquier software de calidad como puede ser una gran
legibilidad.
5
6
Abstract
The purpose of this final master’s degree project is the development of an
Android native application for the creative collaborative writing platform developed
as final degree project the previous year. This platform provides an API REST, which
the architecture “Clean Architecture”, which will give to the developed code
cohesion and low coupling, as well as ease for scaling and code legibility.
7
8
Agradecimientos
Un año más tarde toca volver a agradecer a la gente que ha hecho posible que
un día como hoy esté escribiendo este documento y cerrando una etapa más en mi
vida.
Gracias infinitas a mi familia, al final son aquellos que me aguantan día tras
día y años tras años. Supongo que alguien como yo tiene muchas excentricidades al
final del día. Digamos excentricidades por ser un documento oficial. Por lo que
gracias en todos los idiomas posibles, sé que soy difícil, así que tenéis que ser mejores
que no hay que recurrir a ningún libro cómic o película para saber que los
las heridas del camino, espero estar siempre que lo necesitéis igual que habéis estado
durante estos años ahí. Gracias. Mención especial a Héctor y Alan, por haber
recorrido una buena parte de este camino de la mano, seguid así chicos, sois
increíbles.
9
10
Tabla de contenidos
Resumen 5
Abstract 7
Agradecimientos 9
Tabla de contenidos 11
Tabla de ilustraciones 17
1. Introducción 19
1.1. Motivación 19
1.2. Objetivos 19
2. Metodología 21
2.1.1. Kanban 21
2.3.1.1. Autenticación 23
2.3.1.2. Sistema 24
2.3.2. Análisis 24
2.3.2.1. Modelos 25
11
2.3.2.2. Vistas 26
2.3.2.3. Controladores 27
2.3.3. Diseño 28
2.3.3.2. Paquetes 30
2.3.3.3. Vistas 31
2.3.3.4. Presentadores 31
2.3.3.6. Repositorios 33
2.3.3.7. Modelos 34
2.3.4. Implementación 34
2.3.5. Pruebas 35
2.3.6. Planificación 36
2.3.6.2. Iteración 1 38
2.3.6.3. Iteración 2 39
2.3.6.4. Iteración 3 39
2.3.6.5. Iteración 4 40
2.4. Arquitectura 41
12
2.4.2. Aproximación con MVP y Managers 45
2.4.3.2. Entidades 48
2.4.3.4. Interfaces 48
2.4.3.5. Frameworks 49
3. Tecnologías y herramientas 51
3.1. Frameworks 51
3.1.1. Android 51
3.2.1. Kotlin 53
3.2.2. XML 54
3.2.3. JSON 54
3.3.2. Dagger 2 56
3.3.3. ButterKnife 56
3.3.4. Retrofit 57
13
3.3.5. GSON 58
3.3.6. OkHttp 58
3.4. Herramientas 59
3.4.2. Genymotion 59
3.4.3. Git 60
4. Conclusión 61
5. Futuros proyectos 63
6. Glosario 65
7. Bibliografía 67
8. Anexo 71
8.1.1. LoginUseCase 71
8.1.2. RegisterUseCase 72
8.1.3. ProfileUseCase 73
8.1.4. LogoutUseCase 74
8.1.5. CreateHistoriaUseCase 75
8.1.6. HistoriaListUseCase 76
8.1.7. HistoriaDetailUseCase 77
8.1.8. ValidateAportesUseCase 78
14
8.1.9. NavigateAportesUseCase 79
8.1.10. CreateAporteUseCase 80
8.1.11. ShowOwnAportesUseCase 81
8.1.12. ShowOwnHistoriasUseCase 81
8.1.13. PuntuarHistoriaUseCase 82
8.1.14. PuntuarAporteUseCase 83
8.1.15. ShowPuntMediaAportesUseCase 84
8.1.16. ShowPuntMediaHistoriasUseCase 84
8.1.17. ShowHistoriasPuntuadasUseCase 85
8.1.18. ShowAportesPuntuadosUseCase 85
15
16
Tabla de ilustraciones
17
Ilustración 26. Caso de uso detallado. Iniciar sesión. ......................................... 71
aportes. .............................................................................................................................. 84
historias. ............................................................................................................................ 84
Ilustración 42. Caso de uso detallado. Mostrar historias puntuadas por mí. .... 85
Ilustración 43. Caso de uso detallado. Mostrar aportes puntuados por mí. ...... 85
18
1. Introducción
1.1. Motivación
de una aplicación web completa, tanto la parte del cliente como la del servidor, en la
cual se estableció una solución adoptando el estándar de las API Rest, surge este
hace un año hace que la aproximación a este nuevo proyecto sea totalmente
diferente. La incertidumbre es menor puesto que la idea está clara, pero entra en
diseñada en el pasado con vistas al problema actual de verdad estaba preparada para
él.
1.2. Objetivos
consuma la API Rest diseñada previamente como trabajo de fin de grado, aplicando
19
presentación en Android usaremos otro patrón arquitectónico, Modelo - Vista -
junto a XML para desarrollo de interfaz. Y contando con que nuestro sistema
20
2. Metodología
2.1.1. Kanban
comenzaron a usar este método para señalar los pasos efectuados en su proceso de
respecto al estado del proyecto (aquello que estaba hecho, que se estaba realizando y
muchísimo más rápido que la información textual. Para ello una de sus
columnas, usualmente tres (To do, doing, y done) que permiten visualizar de manera
de que no podrás llegar a donde quieres llegar sin saber dónde te encuentras.
● Visualizar trabajo: Creando una representación visual del trabajo y del flujo
del mismo, la comunicación del estado del proyecto es mucho más sencilla y
21
actualmente en proceso se dé por finalizado. Además de reducir aspectos como
optimizar el sistema Kanban para el equipo, recogiendo datos sobre las tareas
para analizar los puntos débiles del equipo, pudiendo prevenir futuros
problemas en el proyecto.
seguimiento del flujo de trabajo, la calidad o el tiempo empleado. Con los datos
del proyecto. Por un lado, el ser una sóla persona desarrollando, lo cual hace que
Kanban sea lo suficientemente sencillo con respecto a alternativas como SCRUM, cuyo
adelante en este documento, hace que la rapidez para tener una visión general del
estado del proyecto sea casi inmediata una vez planteadas todas las iteraciones.
22
2.3. Metodología de desarrollo
grado sobre el que se apoya este proyecto, los requisitos estaban definidos
real que el usuario debería tener con la aplicación, por lo que podría considerarse
en sí.
2.3.1.1. Autenticación
23
2.3.1.2. Sistema
2.3.2. Análisis
Dados los casos de uso anteriores, se procede al análisis de los mismos para
24
esqueleto de la arquitectura MVC. Aunque más adelante se observará que la
2.3.2.1. Modelos
25
2.3.2.2. Vistas
26
2.3.2.3. Controladores
27
2.3.3. Diseño
Una vez establecidos los cimientos tanto del dominio con los casos de uso como
de la arquitectura con el análisis ajeno a las tecnologías, y todo ello en conjunto con
siguiente. Como podemos observar, el flujo de Clean Architecture queda bastante bien
representado con el uso que tiene cada paquete sobre el siguiente. Destacar que todos
usan los modelos, puesto que como comentaremos más adelante y como se especifíca
cliente Android, el cual se comunicará a un servidor web para consumir la API Rest
aplicaciones que se puede encontrar en otro nodo físico, y este último podría estar
28
A continuación, se muestran los componentes correspondientes a cada nodo de
29
2.3.3.2. Paquetes
30
2.3.3.3. Vistas
2.3.3.4. Presentadores
por caso de uso. Se puede contemplar que existen menos presentadores que
controladores en la fase de análisis. Esto es debido a que los casos de uso que
dependen de otros casos de uso deben ser unificados en cierto punto por un caso de
uso mayor que se encargue de gestionar las llamadas a los diferentes casos de uso,
aplicación Android, si no que dado el desarrollo previo del backend, se unificaron los
casos de uso en la aplicación web, por lo que el cliente Android realmente solo
31
Ilustración 10. Presentadores. Diseño.
apartado anterior, de que existen menos que en el análisis debido a las unificaciones.
Se puede observar que existe uno más que presentadores, esto es debido a que otra de
las alternativas frente al “caso de uso director” es el presentador con varios casos de
uso, que ha sido la decisión tomada en este proyecto ya que al ser un caso aislado la
32
Ilustración 11. Casos de uso. Diseño.
2.3.3.6. Repositorios
datos. Estos representan interfaces que, en el caso del proyecto, serán implementadas
33
2.3.3.7. Modelos
entidades, que estarían en el backend, realmente todo serían ViewModel, pero por
en cuanto a “objeto que representa una entidad del mundo real”, evidentemente se
observa que para una entidad existen varias representaciones en el diagrama situado
a continuación.
2.3.4. Implementación
caso de uso completo, el cual a su vez podrá ser dividido en las subtareas necesarias.
adelante.
34
2.3.5. Pruebas
criterios de aceptación, en las que se debería validar que el caso de uso cumple con lo
establecer los requisitos y los casos de uso del proyecto de manera autónoma, no es
deseados.
ejecutadas ya que para el correcto funcionamiento de los casos de uso se requiere que
35
2.3.6. Planificación
posible a un MVP (Minimum Product Viable) será requerida una priorización de todos
estos casos de uso con elementos tales como la duración estimada, los puntos de
incertidumbre en cuanto a los requisitos todos los valores serán mínimos o bastante
de grado.
priorización servirá como guía para empezar a completar el tablero Kanban con
debido a que al ser un sólo desarrollador, la cantidad de actividades que estas poseen
sobrepasa las necesidades, puesto que una gran parte de ellas se dirige a la
organización del equipo de desarrollo. Por ello se han tomado elementos como el
36
Ilustración 14. Priorización de casos de uso. Planificación.
37
Como se puede observar, la entrega de valor de negocio se va reduciendo a
la iteración tres y la cuatro. Esto es debido a un caso de uso del cual se hablará más
adelante.
2.3.6.2. Iteración 1
primera versión de producto mínimo viable. Para ello se priorizaron casos de uso
necesarios como el inicio de sesión, y otros casos cuya relación entre valor de negocio
38
2.3.6.3. Iteración 2
2.3.6.4. Iteración 3
39
De nuevo, se intenta mantener un equilibrio entre el valor de negocio y la
duración de los casos de uso. Sería por lo tanto la tercera versión del producto.
2.3.6.5. Iteración 4
obstante, todo sería parte de un conjunto más grande en el que se podría englobar los
proyectos futuros.
40
2.4. Arquitectura
es necesario comprender que uno de los antipatrones más recurrentes en este sistema
operativo es la God Class, donde aquí hace acto de presencia como Activity o
que actualice sus elementos de visuales, realice operaciones con modelos, tanto a
semántico, ya que sin una correcta arquitectura, el mirar un proyecto Android nos
puede llevar a preguntas como ¿De qué trata el proyecto? Lo cual nos lleva a uno de
los principios sobre los que se basará Clean Architecture. La arquitectura debe ser
41
capaz de transmitir el propósito de la aplicación, debe ser un elemento esclarecedor y
no ofuscador.
considerar:
datos. Lo importante son las reglas de negocio, son las que deben definir
la aplicación.
42
2.4.1. Aproximación con MVP
toda la lógica.
43
La vista en este caso será pasiva, ya que su función será la de representar los
El modelo es similar a cualquier otro modelo, será una entidad del mundo real
aplicación de la lógica del propio framework de Android, dejando que los fragments o
separación más clara de conceptos, las vistas suelen tener responsabilidades únicas,
al igual que los modelos, pero aquí llegamos de nuevo a la God Class, esta vez en los
44
con bases de datos, peticiones HTTP, usar servicios del dispositivo, tendrá también la
lógica del negocio, puesto que debe estar en algún lado y si las vistas solo representan
y los modelos solo tienen datos… Por lo que se añade un nivel extra para llegar a una
tercera iteración.
por el mundo real ya sea una base de datos, internet u otros elementos del sistema,
son manejados por managers, a los cuales el presentador solicitará aquello que
desglosar estos mánager en dos conceptos diferentes que separen la lógica de negocio
de Android.
45
2.4.3. Clean Architecture
surge de un artículo de Robert Martin (Uncle Bob) a nivel general, pero que por
dependencia de estos.
46
● Independencia de UI. Gracias a esta distribución en capas, la UI se
también será algo que esté aislado, gracias al patrón repositorio, será
en caché, etc.
mismo.
software. Se puede distinguir que cuanto más se aleja del centro más se refiere a
mecanismos del software, mientras que cuanto más se adentra, más se refiere a
dependencias entre estos elementos sólo pueden apuntar hacia dentro. Es decir, las
47
capas externas pueden tener dependencias con respecto a las capas internas y
nunca al revés. Nada que esté en un círculo interior podrá saber nada sobre algo que
2.4.3.2. Entidades
Las entidades encapsulan reglas de negocio. Podrán ser objetos con métodos
implementarán, como el nombre indica, los casos de uso del sistema. Estos casos de
uso serán los que controlan el flujo de datos desde y hacia las entidades y harán uso
Los cambios en esta capa no deberán afectar a las entidades, y los cambios en
capas externas, como la UI, base de datos, peticiones, etc tampoco afectarán a esta
2.4.3.4. Interfaces
En esta capa existen adaptadores que convertirán los datos obtenidos los casos
de uso y las entidades al formato más conveniente para agentes externos como puede
48
de comunicarse con los casos de uso y posteriormente con la vista o los modelos en
2.4.3.5. Frameworks
Esta será la capa más externa y será donde se ubicarán los aspectos
Los cambios en esta capa no afectarán a nada interno, por lo que transformar
esto:
1. Un evento es capturado por Android, el fragment hará uso del presentador que
posee
hacer uso de librerías como Retrofit para recuperar datos desde el backend y
49
Para realizar todo esto sin generar dependencias externas en los círculos más
forma que este tiene para comunicarse con los círculos externos sin romper la regla
nuestra aplicación. El presentador tendrá una referencia a una interfaz que deberá
repositorios tendrán que implementar la misma interfaz, que será a la cual tenga
50
3. Tecnologías y herramientas
3.1. Frameworks
3.1.1. Android
Actualmente está desarrollado por Google, pero en sus orígenes (2005) estaba
desarrollado por Android Inc. Hoy en día está unido con la Open Handset Alliance,
abierta.
manipulación directa por parte del usuario, con acciones que tienen una
correspondencia con el mundo real, como puede ser un toque, arrastrar y “pellizcar”
que ya sea de forma propia por parte de Google, o por cuenta ajena como pueden ser
desarrolladores propios o las empresas que emplean el software de Google para sus
común, Play Store, que es una plataforma de Google en la cual los desarrolladores
pueden subir sus aplicaciones y el usuario podrá hacer búsquedas sobre aquello que
necesite.
consumo de CPU y memoria. Desde Android 6.0 se incluye Doze, que es un sistema
51
interno que permitirá que el dispositivo, cuando no se esté usando directamente,
52
3.2. Lenguajes de programación
3.2.1. Kotlin
cargo del desarrollo de IDEs como IntelliJ, CLion y la base de Android Studio. Surge en
el 2011 como una alternativa a Java puesto que se ejecutará sobre la Java Virtual
simple. Por destacar algunas de sus características que lo hacen tan legible mencionar
existencia del operador safe (?) para evitar las NullPointerException, la existencia de
Un aspecto interesante es que Kotlin puede ser compilado junto a código Java,
encontrase alguna limitación que impidiese el uso de Kotlin, como pueden ser
librerías de terceros.
53
3.2.2. XML
servidas en internet hasta la llegada de JSON. Fue desplazado y criticado por aspectos
como su complejidad, que por otro lado quedaba justificada por aquellos que lo
3.2.3. JSON
datos, viene a suplir y solucionar las carencias existentes en XML. Una de sus ventajas
54
3.3. Librerías externas
instancia eso puede parecer similar a la programación por eventos clásica, puesto que
son también asíncronos. La programación reactiva es esta idea pero potenciada. Con
la creación de estos flujos, que pueden ser de todo tipo, como variables, estructuras de
con ellos. Herramientas como filtros, combinaciones, mapeos, etc. Estos flujos
completo.
Con todo esto, podemos hablar de qué son RxJava, RxKotlin y RxAndroid. No
son más que librerías que implementan estos flujos, herramientas y patrones en el
55
3.3.2. Dagger 2
de tests.
3.3.3. ButterKnife
de hoy Android tiene una manera para realizar esta tarea que requiere más código
del que en principio podría ser deseado, como una simple declaración de tu vista o tu
recurso dentro de tu Fragment o Activity. Por ejemplo, esta sería una de sus formas
de uso:
En lugar de:
56
Y también, a la hora de asociar eventos a dichas vistas, en lugar de la creación
@OnClick(R.id.submit)
...
3.3.4. Retrofit
Retrofit es una librería que nos permite la creación de clientes REST de manera
57
3.3.5. GSON
interoperabilidad entre lenguajes, podemos hacer uso de la librería, que junto a las
clases data de Kotlin, nos permitirá una gran flexibilidad en la conversión de JSON y
objetos Java/Kotlin. Gracias a las anotaciones de las que dispone podremos adaptar
3.3.6. OkHttp
OkHttp es una librería para Android que construye un cliente HTTP con
latencia reducida y maneja los errores típicos en conexiones HTTP de manera cómoda
58
3.4. Herramientas
dependencias externas.
simultánea.
3.4.2. Genymotion
proveer las imágenes más comunes, como pueden ser dispositivos Nexus.
59
3.4.3. Git
desarrollador dispone de una copia del repositorio en todo momento de manera local.
La entidad básica de este sistema es el commit, que representa los cambios, tanto
commit. Git permite el trabajo en diferentes ramas sin que dichos commits
Un proceso habitual de trabajo suele ser la creación de una rama para cada
liberan todas las versiones estables, es la rama principal del proyecto. Esta sólo es una
60
4. Conclusión
proyecto en una primera instancia. Es decir, considerar que iba a existir una versión
que hay que tener en cuenta, ya que, en este caso concreto, el desarrollo de la API se
con Clean Architecture, como a nivel tecnológico, con tecnologías como Kotlin,
máster, pero ninguno en gran profundidad en caso de que se hayan visto, por lo que
aplicación, como a nivel personal, puesto que estos proyectos de tamaño más
61
considerable siempre suponen un reto, y el cómo los afrontas supone un desafío a
nivel personal.
62
5. Futuros proyectos
En una fase avanzada del desarrollo, como podría ser esta, se plantean
proyectos futuros:
del usuario.
63
64
6. Glosario
transferencia de datos.
65
66
7. Bibliografía
Brighina, S. (Junio de 2017). Quiero ser Ágil: ¿mejor Scrum o Kanban? Obtenido de
IebSchool: http://comunidad.iebschool.com/universoagile/2015/01/05/quiero-
ser-agil-mejor-scrum-o-kanban/
GitHub.com: https://github.com/android10/Android-CleanArchitecture
clean-way/
evolution/
https://martinfowler.com/eaaDev/uiArchs.html
https://martinfowler.com/articles/injection.html
https://martinfowler.com/eaaCatalog/repository.html
http://five.agency/android-architecture-part-4-applying-clean-architecture-on-
android-hands-on/
67
https://medium.com/@yoelglusc/android-and-clean-architecture-the-use-case-
interface-8716512f29a1
https://developer.android.com/index.html
https://github.com/google/dagger
https://material.io/guidelines/
Hernández, H. (Julio de 2017). La historia de Android: de Apple Pie 1.0 a Nougat 7.0 |
historia-de-android
Homan, T. (Julio de 2017). Android Architecture: Part 1 – every new beginning is hard.
beginning-is-hard/
architecture/
applying-clean-architecture-android/
https://kotlinlang.org
Leiva, A. (Junio de 2017). Cómo usar Dagger 2 en Android con Kotlin (KDA 20).
kotlin/
68
Martin, R. C. (2008). Clean Code. Financial Times Prentice Hall.
blog.: https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-
architecture.html
Miličić, D. (Junio de 2017). A detailed guide on developing Android apps using the Clean
https://medium.com/@dmilicic/a-detailed-guide-on-developing-android-apps-
using-the-clean-architecture-pattern-d38d71e94029
https://github.com/dmilicic/Android-Clean-Boilerplate
https://github.com/r7v/Tweetz
https://github.com/ReactiveX/RxAndroid
https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxKotlin
https://github.com/erikcaffrey/Clean-Architecture-Android
http://square.github.io/retrofit/
https://stackoverflow.com
Thornsby, J. (2017 de Junio). Java vs. Kotlin: Should You Be Using Kotlin for Android
69
https://code.tutsplus.com/articles/java-vs-kotlin-should-you-be-using-kotlin-for-
android-development--cms-27846
http://jakewharton.github.io/butterknife/
70
8. Anexo
8.1.1. LoginUseCase
71
8.1.2. RegisterUseCase
72
8.1.3. ProfileUseCase
73
8.1.4. LogoutUseCase
74
8.1.5. CreateHistoriaUseCase
75
8.1.6. HistoriaListUseCase
76
8.1.7. HistoriaDetailUseCase
77
8.1.8. ValidateAportesUseCase
78
8.1.9. NavigateAportesUseCase
79
8.1.10. CreateAporteUseCase
80
8.1.11. ShowOwnAportesUseCase
8.1.12. ShowOwnHistoriasUseCase
81
8.1.13. PuntuarHistoriaUseCase
82
8.1.14. PuntuarAporteUseCase
83
8.1.15. ShowPuntMediaAportesUseCase
Ilustración 40. Caso de uso detallado. Visualizar puntuación media de mis aportes.
8.1.16. ShowPuntMediaHistoriasUseCase
Ilustración 41. Caso de uso detallado. Visualizar puntuación media de mis historias.
84
8.1.17. ShowHistoriasPuntuadasUseCase
Ilustración 42. Caso de uso detallado. Mostrar historias puntuadas por mí.
8.1.18. ShowAportesPuntuadosUseCase
Ilustración 43. Caso de uso detallado. Mostrar aportes puntuados por mí.
85
8.2. Repositorio del proyecto
https://github.com/Alfondoo/pecc.
86
87