Buenas Prácticas Flutter: De una idea a un MVP 💡📲 — Parte II (Estructura)
Hoy vamos a generar la estructura de carpetas del proyecto. Para ello vamos a basarnos en Domain Driven Design más conocido como DDD.
Antes de generar toda la estructura me gusta tener claro a rasgos genéricos qué posibles dependencias voy a usar.
Me ha gustado lo que he visto sobre GetX. Por eso quiero implementar la gestión de estados de toda la aplicación con GetX y aparcar a Provider por un tiempo.
De momento, la estructura final puede ser algo parecido a:
├── appController
├── data
│ └── datasource
├── domain
│ ├── exceptions
│ ├── models
│ ├── repositories
│ ├── requests
│ ├── responses
│ └── usecases
├── main.dart
├── presentation
│ ├── shared
│ └── splash
├── src
│ ├── config
│ │ └── styles.dart
│ └── routes
└── utils
📂 appController
Incluiremos los controladores globales de la aplicación y sus bindings.
📂 data
Todo lo relacionado con datos, tanto a nivel interno como externo.
📂 data > datasource
En esta carpeta incluiremos las implementaciones de los repositorios. Basicamente serán los archivos que interactuarán directamente con los datos en sí ( llamadas http, sockets, isolates…)
📂 domain
La carpeta domain contiene una carpeta llamada Models, que contiene las clases que representan los modelos de entidades de nuestro negocio.
Aquí es donde deberemos de introducir todo aquello que tiene relación con el negocio. Además he incluido otro tipo de carpetas para estructurar mejor los archivos.
📂 domain > exceptions
Colocaremos las excepciones específicas para cada caso.
📂 domain > models
Colocaremos todos los modelos necesarios. Internamente podemos separarlo por usos o necesidades.
📂 domain > repositories
Básicamente, los archivos incluidos hacen como una especie de puente. Solo los controladores pueden comunicarse con ellos. Si un controlador quiere recibir un User, entonces llamaría a un repository específico, que es el que se encargará de centralizar esas necesidades y se comunicará con su implementación de la carpeta data > datasource, que son los que finalmente realizan dicha necesidad (ejemplo: llamada a una API).
📂 domain > requests
Iremos añadiendo nuestras necesidades para cualquier tipo de request (login,register, getUser…).
📂 domain > reponses
Lo mismo que requests pero en este caso para las repuestas de esas peticiones.
📂 domain > usecases
Aquí tengo la duda de si usarla o no. En principio debería tener la lógica de los casos de uso de la aplicación tales como:
- registerUser
- loginUser
- recoveryPassword
- …
📂 presentation
Esta carpeta será una de las que más vaya creciendo y/o actualizándose. Incluiremos en ella todas las páginas/pantallas que necesitemos.
- SplashScreen
- LoginScreen
- RegisterScreen
- Profile
- …
📂 presentation > shared
Incluiremos y diseccionaremos por carpetas lo que vayamos a compartir a nivel genérico y visual.
La idea es que estos archivos puedan tener algo de lógica de comportamiento por sí solos, sin ser obligatorio.
- Widgets
- Themes
- …
📂 src
Aplicaremos todo tipo de archivos necesarios para la configuración de la aplicación y lo vamos a separar por necesidades o ambientes.
📂 src > config
Configuraciones específicas.
- Iconos personalizados
- Colores / Paleta de colores
- …
📂 src > routes
Reuniremos todas las rutas de nuestras páginas
- /login
- /register
- /article
- /profile
- …
📂 utils
Utils es la típica carpeta que en otros lenguages la suelen llamar helpers. La suelo usar para añadir o extender funcionalidades.
- countLetters
- capitalize
- verifyEmail
- …
Creo que no me dejo nada. Hay carpetas que suelen estar en otro tipo de proyectos como Infrastructure, pero en este caso la he obviado.
Ahora toca generar las carpetas.
Os he dejado el comando para que genere todo el scaffolding. Antes de lanzarlo hay que asegurarse de estar dentro de la carpeta lib.
# Antes de generar el scaffolding, asegúrese de estar en la carpeta lib.mkdir data domain appController presentation utils data/datasource domain/exceptions domain/models domain/repositories domain/requests domain/responses domain/usecases presentation/shared presentation/splash src/routes
Nos vemos, si tenéis cualquier duda, os leo en los comentarios.
Github repo: https://github.com/luiggibcn/bpf/tree/folder-structure-ddd