Bloque II

Desarrollo colaborativo y arquitectura

Taller Integrador de Especialización

Facultad de Informática Culiacán
Universidad Autónoma de Sinaloa

UAS - Taller Integrador de Especialización

Al terminar este bloque vas a poder

RA2.1 Colaborar con Git

Utilizar ramas pull requests y revisión de código en equipo

RA2.2 Organizar con ramas

Trabajar en paralelo sin bloquear a tu equipo

RA2.3 Definir arquitectura

Documentar componentes interfaces y dependencias de tu proyecto

RA2.4 Aplicar patrones

Resolver un problema real de diseño con la solución correcta

RA2.5 Iterar el proyecto

Entregar el primer incremento funcional real

UAS - Taller Integrador de Especialización

Antes de empezar

Dos integrantes de tu equipo modifican el mismo archivo el mismo día

Uno sincroniza su cambio primero

El segundo intenta sincronizar el suyo

Git no lo permite

¿Qué hacen ahora?

UAS - Taller Integrador de Especialización

Dónde estamos dentro del taller

Bloque I    Del problema al producto
Bloque II   Colaboración y arquitectura      ← estás aquí
Bloque III  Construcción del sistema
Bloque IV   Contenedores despliegue y escalabilidad
Bloque V    Integración y presentación final
UAS - Taller Integrador de Especialización

Lo que ya tienen y lo que falta

Del Bloque I

Equipo conformado Product Backlog inicial repositorio Git básico esqueleto Laravel ejecutable

De este bloque

Ramas pull requests revisión de código arquitectura documentada un patrón de diseño aplicado

UAS - Taller Integrador de Especialización

2.1

Git y control de versiones

UAS - Taller Integrador de Especialización

¿Qué es Git?

Git es un sistema de control de versiones un programa que almacena el historial completo de los cambios de un proyecto.

Git permite

  • volver a cualquier punto anterior del historial
  • saber quién cambió qué y por qué
  • que varias personas trabajen en el mismo proyecto sin sobrescribirse
UAS - Taller Integrador de Especialización

¿Qué almacena realmente un commit?

Un error común es pensar que un commit almacena "solo lo que cambió" como si fuera un diff acumulado.

Un commit almacena una fotografía completa del proyecto en ese momento no una lista de diferencias.

Internamente Git es eficiente y no duplica archivos que no cambiaron pero conceptualmente cada commit es un punto en el tiempo completo al que siempre puedes volver.

Referencia — Pro Git capítulo 1 sección "What is Git" git-scm.com/book

UAS - Taller Integrador de Especialización

Centralizado vs distribuido

Centralizado

Un único servidor almacena el historial completo si el servidor cae nadie puede trabajar

Distribuido — Git

Cada copia local tiene el historial completo el servidor remoto es solo un punto de encuentro

Por eso pueden hacer commit sin conexión a internet y sincronizar después con push

UAS - Taller Integrador de Especialización

Git no es GitHub ni GitLab

Git

El programa de control de versiones que corre en tu computadora

GitHub o GitLab

Plataformas que alojan repositorios de Git y agregan pull requests issues y revisión de código

Este bloque necesita ambos Git para versionar y la plataforma para colaborar

UAS - Taller Integrador de Especialización

Para profundizar en Git

Esta lámina no es contenido de examen es una referencia para consultar cuando tengan dudas durante los laboratorios.

El libro Pro Git está disponible completo en español desde el mismo sitio

UAS - Taller Integrador de Especialización

El problema que Git resuelve

Comparación entre trabajar sin control de versiones con archivos como proyecto_final_v2_CORREGIDO_USAR_ESTE.zip y trabajar con Git con un historial único de commits

UAS - Taller Integrador de Especialización

Cuatro problemas que resuelve

Sin Git

Nadie sabe cuál copia es la más reciente

Sin Git

No se sabe qué cambió sin comparar todo a mano

Con Git

Un solo historial con autor y motivo de cada cambio

Con Git

Combinar el trabajo de varias personas de forma controlada

UAS - Taller Integrador de Especialización

Un dato de contexto

  • Se diseñó para que miles de programadores colaboraran sin un servidor central que se convirtiera en cuello de botella.

  • Por eso cada persona tiene una copia completa del historial en su propia computadora.

UAS - Taller Integrador de Especialización

Los tres estados de un archivo

Según Pro Git todo archivo de tu proyecto vive en uno de tres estados modificado preparado o confirmado.

Modificado

Cambiaste el archivo pero Git todavía no lo registró

Preparado

Marcaste esa versión exacta para entrar al próximo commit

Confirmado

El dato ya quedó guardado de forma segura en tu base de datos local

Referencia — Pro Git capítulo 1.3 "The Three States" git-scm.com/book

UAS - Taller Integrador de Especialización

De un estado a otro

Cada comando básico mueve un archivo de un estado al siguiente

edita el archivo        →  MODIFICADO
git add archivo          →  PREPARADO
git commit -m "..."      →  CONFIRMADO

Por eso es el primer comando que van a ejecutar antes de cualquier otro

UAS - Taller Integrador de Especialización

Las tres áreas de tu proyecto

A cada estado le corresponde un lugar físico en tu computadora

Directorio de trabajo

La carpeta del proyecto tal como la ves y editas

Área de preparación

También llamada índice una lista de lo que va a entrar al próximo commit

Directorio de Git

La base de datos donde vive el historial completo del proyecto

Pro Git describe exactamente estas tres áreas el repositorio remoto que ven en el siguiente diagrama es una cuarta capa que se agrega cuando trabajan en equipo con GitHub no forma parte del modelo original de tres áreas

UAS - Taller Integrador de Especialización

La carpeta .git — dónde vive todo esto

El directorio de Git de la lámina anterior tiene nombre y ubicación exactos

$ ls -a
.  ..  .git  app  composer.json  routes  ...

.git es una carpeta oculta que Git crea dentro de tu proyecto ahí adentro vive absolutamente todo el historial

git init la crea vacía git clone la crea ya llena con todo el historial descargado

UAS - Taller Integrador de Especialización

Qué contiene .git

$ ls .git
HEAD  config  objects/  refs/  hooks/  index
Elemento Para qué sirve
objects/ La base de datos con cada commit archivo y árbol de tu historial
refs/ Apunta a dónde está cada rama y cada etiqueta
HEAD Indica en qué rama o commit estás parado ahora mismo
config La configuración de este repositorio en particular
index El área de preparación ahí vive lo que marcaste con add

Referencia — Pro Git capítulo 1.3 y capítulo 10 "Git Internals" git-scm.com/book

UAS - Taller Integrador de Especialización

Qué pasa si borras .git

Tus archivos actuales siguen ahí la carpeta sigue existiendo pero deja de ser un repositorio de Git

Se pierde para siempre

  • todo el historial de commits
  • todas las ramas locales
  • toda la configuración de ese repositorio
UAS - Taller Integrador de Especialización

Antes del primer commit — configurar tu identidad

Antes de usar Git en una computadora nueva necesitas decir quién eres

Cada commit que hagas va a quedar firmado con este nombre y correo

$ git config --global user.name "Juan Pérez"
$ git config --global user.email "juan.perez@info.uas.edu.mx"

--global aplica esta configuración a todos los repositorios de tu computadora no solo a uno

UAS - Taller Integrador de Especialización

Verificar tu configuración

$ git config user.name
Juan Pérez

$ git config user.email
juan.perez@info.uas.edu.mx

$ git config --list
user.name=Juan Pérez
user.email=juan.perez@info.uas.edu.mx
core.editor=nano

Si el nombre o correo salen vacíos Git te lo va a recordar la primera vez que intentes hacer un commit

UAS - Taller Integrador de Especialización

Dos formas de empezar un repositorio

git init

Crea un repositorio nuevo en una carpeta que todavía no tiene historial

git clone

Descarga un repositorio que ya existe en GitHub junto con todo su historial

Para el proyecto del equipo casi siempre van a usar clone alguien ya creó el repositorio con init la primera vez

UAS - Taller Integrador de Especialización

Qué hace git clone exactamente

clone no es solo descargar archivos hace cuatro cosas en un solo paso

  1. Descarga el historial completo de commits no solo la última versión
  2. Crea la carpeta .git local con todo ese historial adentro
  3. Crea el directorio de trabajo con la última versión de cada archivo
  4. Configura automáticamente un remoto llamado origin apuntando de vuelta al repositorio de donde clonaste

Por eso después de clonar ya pueden ver todo el historial con git log sin haber descargado nada más

UAS - Taller Integrador de Especialización

Ejemplo guiado — init y clone

$ git init
Repositorio Git vacío inicializado en /home/juan/reservafic/.git/
$ git clone git@github.com:equipo/reservafic.git
Clonando en 'reservafic'...
remote: Enumerando objetos: 120, listo.
Receiving objects: 100% (120/120), 45.20 KiB | 2.10 MiB/s, listo.
$ cd reservafic
$ git remote -v
origin  git@github.com:equipo/reservafic.git (fetch)
origin  git@github.com:equipo/reservafic.git (push)

clone configuró origin sin que lo pidieran por eso git push y
git pull ya saben a dónde ir

UAS - Taller Integrador de Especialización

Comandos básicos

Comando Qué hace Estado que produce
git status Muestra en qué estado está cada archivo ahora mismo Consulta no cambia nada
git add archivo Marca el archivo para el próximo commit Modificado → Preparado
git commit -m "..." Guarda la fotografía de lo que está preparado Preparado → Confirmado
git log Muestra el historial de commits confirmados Consulta no cambia nada
git push / git pull Sincroniza commits confirmados con el remoto Repositorio local ↔ remoto

Ya configuraron su identidad y ya tienen un repositorio local estos son
los comandos que van a usar todos los días

UAS - Taller Integrador de Especialización

Qué no debe entrar al repositorio

No todo lo que existe en tu carpeta del proyecto debe versionarse

Laravel genera un .gitignore por defecto al crear el proyecto que ya
excluye lo esencial

/vendor
/node_modules
.env
/storage/*.key
/public/hot

Referencia — documentación oficial de Laravel sección de instalación laravel.com/docs/installation

UAS - Taller Integrador de Especialización

Por qué importa cada exclusión

.env

Contiene credenciales de base de datos y claves cada integrante tiene su propio .env local

vendor y node_modules

Se generan con composer install y npm install no se versionan porque se reconstruyen

Si git status muestra cambios dentro de vendor/ algo está mal
configurado en el .gitignore

UAS - Taller Integrador de Especialización

Ejemplo guiado — status y add

$ git status
  modificado:  app/Models/Prestamo.php
$ git add app/Models/Prestamo.php
$ git status
  Cambios a ser confirmados:
  modificado:  app/Models/Prestamo.php

El archivo pasó de directorio de trabajo a área de preparación mismo
cambio distinta área

UAS - Taller Integrador de Especialización

Ejemplo guiado — ver qué cambió con diff

Antes de hacer add conviene revisar exactamente qué se modificó

$ git diff app/Models/Equipo.php
diff --git a/app/Models/Equipo.php b/app/Models/Equipo.php
index 3f2a1b0..8c9d2e1 100644
--- a/app/Models/Equipo.php
+++ b/app/Models/Equipo.php
@@ -10,6 +10,7 @@ class Equipo extends Model
     protected $fillable = [
         'nombre',
         'ubicacion',
+        'numero_serie',
     ];

Las líneas con + son nuevas las líneas con - se eliminaron

UAS - Taller Integrador de Especialización

Ejemplo guiado — commit y log

$ git commit -m "feat: agregar numero_serie al modelo Equipo"
[main a1b2c3d] feat: agregar numero_serie al modelo Equipo
 1 file changed, 3 insertions(+)
$ git log --oneline
a1b2c3d feat: agregar numero_serie al modelo Equipo
9f8e7d6 feat: crear cuenta con validación de correo
3c2b1a0 commit inicial del proyecto

El commit ya quedó en el historial local con un identificador propio

UAS - Taller Integrador de Especialización

Ejemplo guiado — crear tu primera rama

$ git branch
* main
$ git checkout -b feature/numero-serie-equipo
Cambiado a nueva rama 'feature/numero-serie-equipo'
$ git branch
* feature/numero-serie-equipo
  main

El asterisco muestra en qué rama estás parado ahora mismo

UAS - Taller Integrador de Especialización

Ejemplo guiado — sincronizar con el remoto

$ git push origin feature/numero-serie-equipo
Enumerando objetos: 5, listo.
To github.com:equipo/reservafic.git
 * [new branch]      feature/numero-serie-equipo -> feature/numero-serie-equipo
$ git pull origin main
De github.com:equipo/reservafic.git
Ya está actualizado.

push sincroniza tus commits hacia el remoto pull sincroniza los commits nuevos del equipo hacia tu copia local

UAS - Taller Integrador de Especialización

Una rama es trabajo aislado

Una rama permite que alguien trabaje sin afectar el trabajo de los demás hasta que decida integrarlo.

Técnicamente una rama es solo un puntero a un commit crearla es instantánea y barata

main
 └── feature/nombre-corto-de-la-funcionalidad
UAS - Taller Integrador de Especialización

Modelo con ReservaFIC

Integrante A

feature/numero-serie-equipo

Integrante B

feature/validar-doble-reserva

Ambos parten de main

Ambos trabajan en paralelo

Ninguno bloquea al otro

UAS - Taller Integrador de Especialización

De una rama suelta a una estrategia

Ese acuerdo del equipo se llama una estrategia de ramificación no es
una regla de Git es una regla del equipo

UAS - Taller Integrador de Especialización

Tres estrategias comunes

Comparación de GitHub Flow con una rama principal y ramas cortas Git Flow con ramas main develop feature release y hotfix y Trunk-Based Development con commits pequeños y frecuentes casi directo a main

UAS - Taller Integrador de Especialización

Comparativa

Estrategia Ramas involucradas Complejidad Conviene cuando
GitHub Flow main y ramas cortas Baja Equipo pequeño entregas continuas
Git Flow main develop feature release hotfix Alta Releases planeados con versiones formales
Trunk-Based prácticamente solo main Media Equipo maduro con integración continua

Referencias — Driessen "A successful Git branching model" nvie.com — GitHub Flow docs.github.com — Trunk-Based Development trunkbaseddevelopment.com

UAS - Taller Integrador de Especialización

Cuál usa ReservaFIC

Este taller usa GitHub Flow

  • Su equipo es pequeño
  • No hay releases formales con número de versión que coordinar entre
    clientes distintos
  • main siempre debe quedar en un estado funcional

Git Flow tiene sentido cuando existen varias versiones en producción al
mismo tiempo algo que este proyecto académico no tiene

UAS - Taller Integrador de Especialización

Ejemplo guiado — ciclo de vida completo de una rama

Ciclo de vida de una rama de característica desde checkout -b pasando por commits push pull request y merge hasta branch -d

UAS - Taller Integrador de Especialización

Paso 1 y 2 — crear la rama y trabajar

$ git checkout -b feature/numero-serie-equipo
Cambiado a nueva rama 'feature/numero-serie-equipo'

$ git add app/Models/Equipo.php database/migrations/2026_09_13_000000_add_numero_serie_to_equipos_table.php
$ git commit -m "feat: agregar numero_serie al modelo Equipo"
[feature/numero-serie-equipo 4f5e6d7] feat: agregar numero_serie al modelo Equipo
 2 files changed, 12 insertions(+)
UAS - Taller Integrador de Especialización

Paso 3 — sincronizar la rama

$ git push origin feature/numero-serie-equipo
Enumerando objetos: 7, listo.
To github.com:equipo/reservafic.git
 * [new branch]      feature/numero-serie-equipo -> feature/numero-serie-equipo

La rama ya existe en GitHub lista para abrir un pull request

UAS - Taller Integrador de Especialización

Paso 4 y 5 — integrar y cerrar

Desde GitHub abren el pull request el equipo revisa y aprueban el merge

$ git checkout main
$ git pull origin main
From github.com:equipo/reservafic.git
 * branch            main       -> FETCH_HEAD
Actualizando a1b2c3d..9e8f7d6
Fast-forward
 app/Models/Equipo.php | 4 ++++
 1 file changed, 4 insertions(+)

$ git branch -d feature/numero-serie-equipo
Eliminada la rama feature/numero-serie-equipo (era 4f5e6d7)

git branch -d solo borra la rama local la rama remota se borra desde
GitHub al cerrar el pull request

UAS - Taller Integrador de Especialización

Pull request y code review

Pull request

Solicitud formal de integrar una rama a otra

Code review

Revisión real del código antes de integrarlo no un trámite

Si tu plataforma es GitLab el mismo concepto se llama merge request

UAS - Taller Integrador de Especialización

Estrategias de fusión

Git elige automáticamente cómo fusionar no es algo que decidan ustedes
manualmente cada vez

Fast-forward

main no tiene commits propios desde que creaste la rama Git solo mueve el puntero

Three-way merge (ort)

Ambas ramas avanzaron por separado Git compara el ancestro común contra las dos puntas y combina lo que no se toca

Referencia — Pro Git capítulo 3.2 sección "Basic Merging" git-scm.com/book

UAS - Taller Integrador de Especialización

Ejemplo guiado — merge sin conflicto

Antes de ver un conflicto observa cómo se ve un merge que sale bien

$ git checkout main
$ git merge feature/validar-doble-reserva
Actualizando 9e8f7d6..2c1b0a9
Fast-forward
 app/Services/ReservaService.php | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

Fast-forward significa que main no tenía commits nuevos propios
Git simplemente movió el puntero hacia adelante

Cuando ambas ramas cambiaron en paralelo el resultado dice Merge
made by the 'ort' strategy
en vez de Fast-forward y ahí es donde
puede aparecer un conflicto

UAS - Taller Integrador de Especialización

Qué es una auto-fusión

Dos integrantes cambiaron el mismo archivo pero en partes distintas
Git no necesita ayuda para combinarlas

$ git merge feature/agregar-reporte
Auto-fusionando app/Http/Controllers/ReporteController.php
Merge made by the 'ort' strategy.
 app/Http/Controllers/ReporteController.php | 12 ++++++++++++
 1 file changed, 12 insertions(+)

Auto-fusionando significa que Git combinó cambios del
mismo archivo por su cuenta sin pedirte nada no es un conflicto es el
three-way merge funcionando correctamente

UAS - Taller Integrador de Especialización

La ventana que se abre para el mensaje de fusión

Un merge que no es fast-forward crea un commit nuevo y ese commit
necesita un mensaje

Merge branch 'feature/agregar-reporte' into main

# Escribe un mensaje para explicar por qué es necesaria esta fusión
# especialmente si fusiona una rama actualizada dentro de una rama
# de tema

Git abre tu editor configurado con este mensaje ya escrito

Lo dejas tal cual

Guardas y cierras el editor el mensaje por defecto es válido

Lo editas

Agregas contexto de por qué se integró en ese momento

Si su editor es nano guardan con Ctrl+O Enter y cierran con Ctrl+X

Para saltarse la ventana y aceptar el mensaje por defecto directamente git merge rama --no-edit

UAS - Taller Integrador de Especialización

Conflicto de fusión

Ocurre cuando dos ramas modificaron la misma parte del mismo archivo de
formas distintas

Git no puede decidir cuál versión conservar

Alguien del equipo tiene que decidirlo

Un conflicto no es un error del sistema

Es Git pidiendo que una persona decida

Referencia — Pro Git capítulo 3.2 "Basic Branching and Merging" sección de conflictos git-scm.com/book

UAS - Taller Integrador de Especialización

Cómo se ve un conflicto real

Dos integrantes modificaron la misma validación en ReservaService.php
uno cambió el límite de días el otro cambió el mensaje de error

$ git merge feature/validar-limite-dias
Auto-fusionando app/Services/ReservaService.php
CONFLICTO (contenido): Conflicto de fusión en app/Services/ReservaService.php
La fusión automática falló arregla los conflictos y confirma el resultado
$ git status
Tienes rutas no fusionadas
  ambos modificados:  app/Services/ReservaService.php

Git se detuvo a la mitad del merge y está esperando que decidan

UAS - Taller Integrador de Especialización

Los marcadores de conflicto

Al abrir el archivo Git marcó exactamente dónde chocan las dos versiones

public function validarLimite($dias)
{
<<<<<<< HEAD
    if ($dias > 7) {
        throw new Exception('Máximo 7 días de préstamo');
    }
=======
    if ($dias > 5) {
        throw new Exception('El límite de préstamo fue excedido');
    }
>>>>>>> feature/validar-limite-dias
}
<<<<<<< HEAD

Empieza tu versión la rama en la que estás parado

=======

Separa las dos versiones que chocan

>>>>>>> rama

Termina la versión de la otra rama

UAS - Taller Integrador de Especialización

Técnicas para resolver un conflicto

Hablar antes de decidir

Pregunta a quien hizo el otro cambio por qué lo hizo así una decisión apurada puede borrar trabajo válido

Leer ambas versiones completas

No te quedes solo con lo que ves entre marcadores revisa el archivo completo para entender el contexto

Usar un editor con soporte visual

VS Code y otros editores muestran botones Accept Current Accept Incoming o Accept Both sobre cada bloque

Probar antes de confirmar

Ejecuta el proyecto o las pruebas después de resolver un conflicto que compila no siempre es un conflicto bien resuelto

UAS - Taller Integrador de Especialización

Más técnicas y cuándo abortar

git mergetool

Abre una herramienta visual de tres paneles tuyo incoming y resultado para conflictos complejos

Conservar lo necesario de ambas

No siempre hay que elegir una versión completa a veces la solución correcta combina fragmentos de las dos

Si el conflicto es grande y no están seguros existe una salida segura

git merge --abort

Regresa todo al estado de antes de intentar el merge sin perder nada
pueden respirar y volver a intentarlo con calma

UAS - Taller Integrador de Especialización

Ejemplo guiado — resolver el conflicto paso a paso

Paso 1 — decidir juntos y editar el archivo

Después de hablar con el equipo deciden conservar el límite de 7 días
pero con el mensaje más claro

public function validarLimite($dias)
{
    if ($dias > 7) {
        throw new Exception('El límite de préstamo fue excedido');
    }
}

Los marcadores <<<<<<< ======= y >>>>>>> ya no están en el archivo

UAS - Taller Integrador de Especialización

Paso 2 — marcar como resuelto y confirmar

$ git add app/Services/ReservaService.php
$ git status
Todos los conflictos arreglados pero seguimos en fusión

$ git commit
[main 7d6c5b4] Merge branch 'feature/validar-limite-dias'

add le dice a Git que ya decidiste commit sin -m abre el editor
con un mensaje de merge ya escrito que pueden dejar tal cual

UAS - Taller Integrador de Especialización

Paso 3 — confirmar que quedó limpio

$ git status
En la rama main
nada para hacer commit el árbol de trabajo está limpio

$ git log --oneline -3
7d6c5b4 Merge branch 'feature/validar-limite-dias'
2c1b0a9 feat: agregar validación de límite de días
4f5e6d7 feat: cambiar mensaje de error de límite
UAS - Taller Integrador de Especialización

Comandos que van a necesitar pronto

UAS - Taller Integrador de Especialización

git stash — guardar trabajo sin terminar

Cambiar de rama con cambios a medias sin hacer commit puede fallar Git
te va a pedir que resuelvas eso primero

$ git stash
Guardado el directorio de trabajo y el estado del índice WIP on
feature/numero-serie-equipo: 4f5e6d7 feat: agregar numero_serie

$ git status
nada para hacer commit el árbol de trabajo está limpio

$ git stash pop
Cambios no en el área de stage para el commit:
  modificado: app/Models/Equipo.php

stash guarda tus cambios a un lado pop los regresa

UAS - Taller Integrador de Especialización

git reset vs git revert — dos formas de deshacer

git reset

Reescribe el historial úsalo solo en commits que todavía no subiste con push

git revert

Crea un commit nuevo que deshace uno anterior seguro para ramas ya compartidas

$ git revert a1b2c3d
[main f3e2d1c] Revert "feat: agregar numero_serie al modelo Equipo"
 1 file changed, 3 deletions(-)
UAS - Taller Integrador de Especialización

git log --graph — visualizar el árbol de commits

$ git log --oneline --graph --all
* 9e8f7d6 (HEAD -> main, origin/main) merge pull request #12
|\
| * 4f5e6d7 (origin/feature/numero-serie-equipo) feat: agregar numero_serie
|/
* a1b2c3d commit inicial

Este es el mismo dibujo que las estrategias de ramificación solo que
generado directamente desde tu historial real

UAS - Taller Integrador de Especialización

Ampliación — más allá del temario oficial

UAS - Taller Integrador de Especialización

Conventional Commits

Especificación pública versión 1.0.0 conventionalcommits.org

<tipo>[ámbito opcional]: <descripción>
feat: nueva funcionalidad
fix: corrección de un error
docs: cambios de documentación
refactor: cambio interno sin alterar el comportamiento
UAS - Taller Integrador de Especialización

Ámbito y cambios incompatibles

feat(prestamos): agregar validación de fecha de devolución

Un cambio que rompe algo que ya funcionaba se marca con !

feat!: cambiar el formato de respuesta de la API de préstamos

o con un pie BREAKING CHANGE en el cuerpo del commit

UAS - Taller Integrador de Especialización

Versionado semántico — SemVer

Especificación pública versión 2.0.0 semver.org creada por Tom Preston-Werner cofundador de GitHub

MAYOR . MENOR . PARCHE
MAYOR

Cambios incompatibles

MENOR

Funcionalidad nueva compatible

PARCHE

Corrección de errores compatible

UAS - Taller Integrador de Especialización

Conventional Commits y SemVer combinados

Un commit fix: normalmente sube el número de PARCHE

Un commit feat: normalmente sube el número MENOR

Un commit feat!: o con BREAKING CHANGE sube el número MAYOR

No es casualidad ambas especificaciones se diseñaron para combinarse

UAS - Taller Integrador de Especialización

Del historial a un changelog

Un changelog es un documento legible por humanos que
resume qué cambió versión con versión sin tener que leer commit por
commit

Como ya escriben feat: fix: docs: de forma consistente ese mismo
historial se puede agrupar automáticamente en un changelog

## [0.2.0] - 2026-09-16
### Added
- Validación de límite de días en préstamos

### Fixed
- Mensaje de error poco claro en validación de límite

Formato de referencia — Keep a Changelog keepachangelog.com

UAS - Taller Integrador de Especialización

Un changelog se escribe para quien lo lee no para quien lo escribió

Mal changelog

fix bug arreglos varios cambios menores

Buen changelog

Corregido el mensaje de error cuando el préstamo excede el límite de días

Herramientas como conventional-changelog o standard-version generan
este documento leyendo directamente sus mensajes de commit siempre que
sigan la convención

UAS - Taller Integrador de Especialización

Etiquetas (tags) en Git

Una etiqueta marca de forma permanente un commit específico como un
punto importante del historial normalmente una versión publicada

git tag -a v0.1.0 -m "Primer incremento funcional del Bloque II"
git push origin v0.1.0

-a crea una etiqueta anotada almacena autor fecha y mensaje

UAS - Taller Integrador de Especialización

Ejemplo guiado — anotada vs ligera

$ git tag prueba-ligera
$ git tag -a prueba-anotada -m "Etiqueta de prueba"
$ git show prueba-ligera
commit a1b2c3d...
$ git show prueba-anotada
tag prueba-anotada
Tagger: Equipo ReservaFIC
Date:   Sat Sep 13 2026
Etiqueta de prueba

commit a1b2c3d...

La anotada almacena quién y cuándo la ligera solo apunta al commit

UAS - Taller Integrador de Especialización

Actividad — Laboratorio 1

Creen ramas de característica abran un pull request hagan code review
real provoquen y resuelvan un conflicto de fusión de verdad usen
Conventional Commits y etiqueten su primer incremento con SemVer

Guía completa: bloque02_lab01_git_colaborativo.md

UAS - Taller Integrador de Especialización

2.2

Integración del trabajo

UAS - Taller Integrador de Especialización

Integrar con frecuencia reduce el riesgo

Una rama que vive semanas sin integrarse acumula diferencias con main

Cambios pequeños

Revisión constante

Integración frecuente

Menos probabilidad de un conflicto grande y difícil de resolver

UAS - Taller Integrador de Especialización

Fuente oficial — Clean Code sobre cambios pequeños

Robert C Martin en Clean Code (REF-B2-04) insiste en que un cambio
pequeño y con un solo propósito es más fácil de revisar y de revertir
que un cambio grande y mezclado

Es la razón técnica detrás de la convención de mensajes de commit
feat: fix: docs: refactor: del Laboratorio 1

UAS - Taller Integrador de Especialización

Más buenas prácticas de Clean Code

Nombres que revelan intención

diasLimitePrestamo comunica más que d o x

Funciones que hacen una sola cosa

Si necesitas la palabra "y" para describir qué hace probablemente son dos funciones

Evitar duplicación

La misma regla de negocio escrita en dos lugares tarde o temprano queda desincronizada

Comentarios que explican el por qué

El código ya dice qué hace un buen comentario explica por qué se decidió así

Referencia — Martin Robert C Clean Code (REF-B2-04) capítulos 2 3 y 4

UAS - Taller Integrador de Especialización

Issues gestión de incidencias

Funcionalidad

Trabajo nuevo por hacer

Bug

Algo que no funciona como debería

Tarea

Trabajo técnico sin ser un error

Mejora

Algo que ya funciona pero puede ser mejor

Un repositorio sin issues obliga al equipo a recordar de memoria qué falta

UAS - Taller Integrador de Especialización

Definition of Done

Este bloque retoma la DoD simple del Bloque I y la vuelve exigente de
verdad

UAS - Taller Integrador de Especialización

Propuesta de Definition of Done para este bloque

Un incremento está terminado cuando se puede marcar cada punto

Código

Sigue Clean Code nombres claros funciones pequeñas sin duplicación

Historial

Usa Conventional Commits y no mezcla propósitos en un mismo commit

Colaboración

Pasó por pull request con code review real no autoaprobado

Arquitectura

Respeta la separación documentada FormRequest Service Controlador

Este es un punto de partida cada equipo puede ampliarlo según su proyecto no reduzcan estos cuatro puntos

UAS - Taller Integrador de Especialización

2.3

Arquitectura de software

UAS - Taller Integrador de Especialización

Cuatro principios

Separación

Cada componente una sola razón para cambiar

Cohesión

Lo que vive junto pertenece junto

Acoplamiento

Cambiar uno sin romper los demás

Escalabilidad

El diseño permite crecer sin reescribir todo

UAS - Taller Integrador de Especialización

Fuente oficial — Clean Architecture y la regla de dependencia

Robert C Martin en Clean Architecture (REF-B2-03) propone que las
dependencias del código siempre apunten hacia adentro las reglas de
negocio no deben depender del framework la base de datos ni la interfaz
de usuario

En Laravel esto significa que el Service no debería depender de detalles
de Eloquent más de lo necesario es la idea que van a aplicar en el
Laboratorio 2 y en el Laboratorio 3 con Repository

UAS - Taller Integrador de Especialización

Arquitecturas comunes

Arquitectura Idea central
Monolítica Toda la aplicación es un solo proyecto
Multicapa El monolito se organiza en capas
Cliente-servidor El cliente consume servicios del servidor
Orientada a servicios El sistema se divide en servicios independientes

Su proyecto sigue siendo un monolito multicapa este bloque no lo convierte en microservicios

UAS - Taller Integrador de Especialización

Antes del refactor con ReservaFIC

public function store(Request $request)
{
    $request->validate([...]);
    $conflicto = Prestamo::where(...)->exists();
    if ($conflicto) { return back()->withErrors('...'); }
    Prestamo::create($request->all());
    return redirect()->route('prestamos.index');
}

Validación regla de negocio y persistencia mezcladas en un solo lugar

UAS - Taller Integrador de Especialización

Después del refactor con ReservaFIC

FormRequest   valida la forma de los datos
Service       decide la regla de negocio
Controlador   coordina no decide
UAS - Taller Integrador de Especialización

Actividad — Laboratorio 2

Diagnostiquen su controlador con más lógica mezclada sepárenlo en Form
Request Service y Controlador delgado y documenten la arquitectura
resultante

Guía completa: bloque02_lab02_arquitectura.md

UAS - Taller Integrador de Especialización

2.4

Patrones de diseño

UAS - Taller Integrador de Especialización

Un patrón tiene tres partes

01 PROBLEMA

Qué situación lo
provoca

02 CONTEXTO

Bajo qué condiciones
aplica

03 SOLUCIÓN

Cómo se resuelve de
forma general

UAS - Taller Integrador de Especialización

Fuente oficial — el catálogo original

Gamma Helm Johnson y Vlissides publicaron en 1994 un catálogo de 23
patrones (REF-B2-01) organizados en las tres familias de esta sección
se les conoce como la Banda de los Cuatro (Gang of Four)

No van a aprender los 23 en este bloque solo el que resuelve un problema
real de su proyecto

UAS - Taller Integrador de Especialización

Tres familias

Creacional

Cómo se crean objetos — Factory Singleton

Estructural

Cómo se organizan clases y objetos — Repository Adapter

De comportamiento

Cómo se comunican los objetos — Strategy Observer

UAS - Taller Integrador de Especialización

La pregunta correcta

No es qué patrón puedo usar

Es qué problema tengo y qué patrón lo resuelve

Un patrón donde no hace falta agrega complejidad sin beneficio

UAS - Taller Integrador de Especialización

Modelo con ReservaFIC — Repository

El problema

El Service llama directamente a Eloquent

Si cambian de motor de base de datos hay que tocar el Service

El patrón

Repository separa el Service de los detalles de acceso a datos

UAS - Taller Integrador de Especialización

Actividad — Laboratorio 3

Identifiquen un problema real de su proyecto elijan el patrón que lo
resuelve impleméntenlo sobre el Service del Laboratorio 2 y documenten
la decisión

Guía completa: bloque02_lab03_patrones_diseno.md

UAS - Taller Integrador de Especialización

Cierre — volviendo al problema inicial

Retoma la situación del inicio

Dos integrantes modifican el mismo archivo y uno no sabe qué hacer con
el conflicto

Con ramas de característica ese problema no habría bloqueado a ninguno

El conflicto es Git pidiendo que alguien decida

Un pull request con revisión real lo hubiera detectado antes

UAS - Taller Integrador de Especialización

En síntesis

  • Git almacena un historial único y permite combinar trabajo en
    paralelo de forma controlada
  • Las ramas de característica permiten trabajar en paralelo según
    la estrategia de ramificación que elija el equipo
  • Un pull request con code review real evita código sin revisar
  • Un conflicto de fusión se resuelve decidiendo no evitando
  • Conventional Commits y SemVer dan estructura y significado al
    historial y a las etiquetas de versión
  • Separación de responsabilidades cohesión y acoplamiento organizan
    el código antes de que crecer sea un problema
  • Un patrón de diseño resuelve un problema real identificado primero
UAS - Taller Integrador de Especialización

Lo que sigue

En el Bloque III van a construir componentes APIs persistencia de
datos y pruebas automatizadas sobre la arquitectura que documentaron
aquí

UAS - Taller Integrador de Especialización

Referencias

  • Gamma Helm Johnson y Vlissides — Design Patterns (1994)
  • Freeman y Robson — Head First Design Patterns (2020)
  • Martin Robert C — Clean Architecture (2017)
  • Martin Robert C — Clean Code (2008)
  • Hunt y Thomas — The Pragmatic Programmer (2019)
  • Documentación oficial de Git — git-scm.com/doc
  • Conventional Commits — especificación v1.0.0 (ampliación) — conventionalcommits.org
  • Semantic Versioning — especificación v2.0.0 (ampliación) — semver.org
  • Driessen — A successful Git branching model (ampliación) — nvie.com
  • GitHub Flow — documentación oficial (ampliación) — docs.github.com
  • Trunk-Based Development (ampliación) — trunkbaseddevelopment.com

Ficha completa de cada fuente con relevancia por contenido: bloque02_materiales_referencias.md (REF-B2-01 a REF-B2-T07)

UAS - Taller Integrador de Especialización

estado: BORRADOR v2 fuentes: - bloque02/CONTEXTO_UNIDAD.md - bloque02/material/bloque02_manual_estudiante.md - bloque02/material/bloque02_actividades.md - bloque02/laboratorios/bloque02_lab01_git_colaborativo.md - bloque02/laboratorios/bloque02_lab02_arquitectura.md - bloque02/laboratorios/bloque02_lab03_patrones_diseno.md - bloque02/referencias/bloque02_materiales_referencias.md - bloque01/material/bloque01_presentacion.md (continuidad de estilo y de ReservaFIC) propósito: Presentación de apoyo docente y estudiante del Bloque II criterios: - lenguaje humano y directo - sin punto final ni comas en el cuerpo de las diapositivas - no introducir contenidos técnicos propios de Bloques III a V - el proyecto del estudiante es el centro del bloque - ReservaFIC es únicamente un ejemplo ilustrativo continuado desde el Bloque I - Git se explica desde cero antes de llegar a ramas (solicitud explícita del usuario 2026-09-13) - Design Patterns de Gamma et al (REF-B2-01) es la fuente principal para patrones - Clean Architecture (REF-B2-03) aporta la regla de dependencia para arquitectura - Clean Code (REF-B2-04) aporta el criterio de cambios pequeños para integración - Laravel aparece como contexto de los laboratorios igual que en el Bloque I - no asignar ponderaciones de evaluación no validadas - revisión 2026-09-13: se agregaron 2 imágenes propias (SVG) y se profundizó el desarrollo de los cuatro contenidos, a solicitud explícita del usuario ("estaba muy superficial") cambios v2 (2026-09-16): - Se agregó una explicación más profunda de qué es Git incluyendo qué almacena realmente un commit los tres estados de un archivo (Pro Git cap 1.3) la carpeta .git su contenido y qué pasa si se borra y la diferencia entre control de versiones centralizado y distribuido - Se profundizó git clone explicando las cuatro cosas que hace en un solo paso incluyendo la configuración automática del remoto origin - Se unificó terminología "guarda" se cambió por "almacenar" en prosa referida a persistencia real (commits repositorio etiquetas) se conservó "guardar" únicamente para git stash por ser un concepto distinto (apartar temporalmente no almacenar) "subir cambios" se cambió por "sincronizar" en toda la prosa - Se agregó un ejemplo real de conflicto de fusión con los marcadores <<<<<<< ======= y >>>>>>> técnicas de buena práctica para resolverlo (hablar antes de decidir git mergetool git merge --abort) y un ejemplo guiado paso a paso completo desde el conflicto hasta el commit de merge resuelto - Se agregaron las estrategias de fusión de Git (fast-forward vs three-way merge/ort) qué es una auto-fusión y por qué se abre el editor con el mensaje de fusión en un merge que no es fast-forward - Se agregó una sección sobre changelog como salida natural de usar Conventional Commits y SemVer con referencia a Keep a Changelog - Se ampliaron las buenas prácticas de Clean Code más allá de cambios pequeños (nombres funciones pequeñas duplicación comentarios) - Se convirtió Definition of Done de dos líneas sueltas a una propuesta completa de cuatro criterios verificables - Se agregó una sección de configuración inicial desde cero (git config user.name user.email git init git clone) asumiendo que el estudiante no tiene conocimiento previo de Git en este punto - Se agregó git diff como ejemplo guiado - Se agregó una sección de comandos intermedios (git stash git reset vs git revert git log --graph) antes de la ampliación de Conventional Commits y SemVer - Se agregó la subsección "Estrategias de ramificación" con dos imágenes propias (SVG) comparando GitHub Flow Git Flow y Trunk-Based Development más un ejemplo guiado del ciclo de vida completo de una rama y la recomendación de estrategia para ReservaFIC - Se agregó un ejemplo Laravel de .gitignore explicando qué no debe versionarse y por qué - Se agregó un ejemplo guiado de merge sin conflicto para contrastar con el conflicto de fusión - Se agregaron enlaces de referencia junto a los conceptos de Git Conventional Commits SemVer GitHub Flow Git Flow y Trunk-Based Development nota técnica de compilación: las imágenes locales (recursos/imagenes/*.svg) requieren compilar con `marp --allow-local-files` — sin esa bandera Marp CLI bloquea la carga de archivos locales y las diapositivas que usan <img> quedan sin imagen imágenes nuevas en esta revisión: - recursos/imagenes/git_estrategias_ramificacion.svg - recursos/imagenes/git_ciclo_vida_rama.svg