1/10: Consejos y trucos para migrar a Scala 3. ¡Un aplauso! Importante: lee detenidamente la guía de migración y aprovecha Scalafix para actualizar la sintaxis. ¡Te ahorrará horas de trabajo manual!
2/10: ¡No te apresures a reemplazar todo con la nueva sintaxis! Primero compila tu código base con la sintaxis anterior, pero usando el compilador de Scala 3. La nueva sintaxis tiene sus propias reglas y puede causar errores confusos si no estás familiarizado con ella, especialmente al combinarla con la anterior.
3/10 Al reemplazar parámetros implícitos con `using`, recuerde que todos los parámetros explícitos que pasan en los sitios de llamada también necesitan la palabra clave `using`. getUserInfo(userId)(using Tracing.noop) // correcto
4/10: Olvidar la palabra clave "using" genera errores crípticos. El compilador podría resaltar una parte completamente diferente del código, lo que frustra la depuración. Perdí mucho tiempo intentando averiguar qué estaba pasando.
5/10: Advertencia sobre circe: Al migrar de una derivación semiautomática como `deriveConfiguredCodec` a `Codec.derived`, ¡tenga cuidado! `Decoder.derived` no acepta `Configuration` como parámetro implícito; utilice `Decoder.derivedConfigured` en su lugar.
6/10: Puedes evitar el problema de circe por completo con la nueva sintaxis de derivaciones: case class MyClass(...) derives ConfiguredCodec. Casi envié un error a producción porque creía que Decoder.derived se comportaría igual. Gracias a otro problema, pude detectarlo con suficiente antelación.
7/10: Usuarios de Doobie: tengan cuidado con los mensajes de error gigantescos sobre instancias Get/Put faltantes. En mi caso, las clases AnyVal fueron las culpables: el compilador no pudo derivar instancias como antes.
8/10: Solución para el problema de doobie: convertir las clases AnyVal en tipos opacos y proporcionar instancias dadas en el objeto complementario.
9/10: Se enfrentó un desafío con código heredado que usaba la sintaxis de tuplas sin forma (eliminada en Scala 3). Necesitaba una forma de añadir elementos de tupla y convertirlos a clases de caso. Primero probé la sintaxis de tuplas nativa de Scala 3, pero era incompatible con CaseClass.tupled.
10/10: Después de probar extensiones personalizadas para tuplas (que presentaban riesgos de fallos en tiempo de ejecución), descubrí que la biblioteca Chimney era la mejor solución para unir tuplas con valores adicionales. Además: ¡Incluso encontré un error en la última versión de Chimney!
¿Qué consejos de migración has descubierto? ¡Compártelos abajo! #Scala #Scala3
Bono n.° 1: puede reemplazar someContextualResource.flatMap { implicit tracing => ... } con someContextualResource.flatMap { case given TracingCtx => ... } no es perfecto pero funciona, mejor que mezclar datos con implícitos en el mismo archivo y código base.