Puede que hayas oído hablar de los beneficios de los objetos inmutables, especialmente de los programadores funcionales. Pero crear y trabajar con objetos inmutables en un lenguaje como el C# puede ser complicado.
Enfoque tradicional
La forma habitual de hacerlo es crear un constructor que tome todos los datos y los asigne a propiedades de sólo lectura. Por suerte, hacer que nuestras propiedades sean realmente de sólo lectura es ahora más fácil en el C# 6 y ya no requiere un campo de respaldo. Así que empezamos con algo como esto:
publicclassPerson{publicstringFirstName{get;}publicstringLastName{get;}publicstringEmail{get;}publicPerson(stringfirstName,stringlastName,stringemail){FirstName=nombre;Apellido=apellido;Email=email;}}
Luego, cuando necesitamos cambiar una propiedad, creamos un nuevo objeto, pasando los valores actuales para las cosas que no están cambiando:
varperson=newPerson("nombre", "apellido", "correo electrónico");varupdatedEmail=newPerson(persona.nombre,persona.apellido, "newEmail");
Esto funciona, pero como puedes imaginar, rápidamente se vuelve difícil de manejar a medida que el número de propiedades crece.
Al final, es mucho código para escribir y mantener, y es torpe crear nuevos objetos a partir de los existentes. Nuestras intenciones son buenas, pero el lenguaje no nos ayuda mucho.
Introduzca F#
Lo que realmente queremos es algo como F# records. Esos nos dan la inmutabilidad de forma gratuita, junto con una útil función llamada Copiar y Actualizar Expresiones:
typePerson={Nombre:stringApellido:stringEmail:string}letperson={Nombre="nombre";Apellido="apellido";Email="email"}letupdatedEmail={personwithEmail="newEmail"}//CopyandUpdateExpression
Bonito, ¿verdad? actualizadoEmail obtiene todas las propiedades de la persona, pero con un nuevo valor para el Email.
C# + F# = ?
He aquí una idea loca: ¿qué pasaría si escribiéramos nuestro objeto de dominio en F# y lo usáramos en el resto de nuestro código C#? Ya que ambos lenguajes apuntan al CLR, la interoperación es bastante fácil. El único requisito es que el código F# tiene que vivir en un ensamblaje separado.
Probémoslo. En el lado de la F#, lo hemos hecho:
escribaPerson={Nombre:cadenaApellido:cadenaCorreo electrónico:cadena}con esto.ConEmailActualizado={esto conEmail=correo electrónico}
La sintaxis del miembro con adjunta un método a nuestro registro llamado WithUpdatedEmail, que toma un nuevo correo electrónico y utiliza la sintaxis de copia y actualización para crear un nuevo objeto. Así es como lo usamos en el lado C#:
varperson=newPerson("first", "last", "email");varupdatedEmail=person.WithUpdatedEmail("newEmail");
Conclusión
Fue un experimento divertido, y espero que te dé una idea de algunas cosas que puedes hacer. Siempre es bueno mirar a la vuelta de la esquina y ver cómo otros idiomas están haciendo las cosas. Puede que no sea factible reescribir una base de código C# entera en F#, pero siempre se pueden incorporar ideas de F#, ¡y quizás también un poco de código!
Categorías: technicalTags: c sharp, functional programming, getting started