LeadFlow SaaS B2B — Módulo de gestión de leads refactorizado · CULTIVA IA
IDs tipados sin coste en runtime
Errores de dominio exhaustivos
Errores como valores, no excepciones
Concurrencia estructurada tolerante a fallos
Builders type-safe y autocomplete
Comportamiento sin herencia
| Patrón | Uso en LeadFlow | Beneficio |
|---|---|---|
| value class | LeadId, Email, QualificationScore | Type-safety sin overhead de runtime |
| data class (val) | Lead, EmailCampaign, LeadDashboard | Inmutabilidad — sin bugs de estado compartido |
| copy() | qualify(), contact(), addTag() | Actualizaciones seguras sin mutar el objeto original |
| sealed interface | LeadError + toHttpStatus() | when exhaustivo — el compilador detecta casos olvidados |
| ?. ?: | getLeadDisplayName(), isHot() | Null safety garantizada por el compilador — 0 NullPointerException |
| runCatching | createLead(), qualifyLead() | Errores como valores — Result<T> chaineable |
| supervisorScope | buildDashboard() | Paralelo tolerante a fallos — secundarios no cancelan el principal |
| @DslMarker | emailCampaign { ... } | API expresiva y type-safe — no acepta lambdas anidadas ilegales |
| extension fun | isHot(), hotLeads(), toShortString() | Comportamiento de dominio sin herencia ni modificar data class |
| asSequence() | processLeadsPipeline() | Evaluación lazy — sin listas intermedias en memoria |
| let/apply/also/run | scopeFunctionExamples() | Código expresivo sin variables temporales innecesarias |
| by lazy | allLeadsSummary | Inicialización diferida — solo se calcula cuando se necesita |
| Flow + debounce | searchLeads(), observeHotLeads() | Streams reactivos cold — sin RxJava ni callbacks anidados |