Traducción: ¿Por qué es FI importante incluso para los programadores de OOP?

Hola Habr! Te presento una traducción de un artículo de Roman Provaznik : ¿Por qué la FP es importante incluso para el desarrollador de OOP?

Una vez que estuve muy interesado en la programación funcional, comencé a estudiarla y a contarles a todos mis amigos lo maravillosa que es. Más tarde me encontré con un artículo sobre programación funcional desde el punto de vista de un programador de OOP y decidí traducirlo para usted. No juzgues estrictamente, esta es mi primera traducción.

Me pidieron que diera una opinión personal sobre la programación funcional desde un punto de vista orientado objetivamente. Incluso me vi obligado a crear una cuenta en el Medio. Como ex desarrollador de OOP y en este momento, algún día me convertiré en un verdadero programador de FP, creo que tengo algo que decir:

Bienvenido viajero


Si no ha pasado los últimos 60 años en otro planeta (si es así, bienvenido de nuevo, viajero), probablemente haya oído hablar de la programación funcional. Si sigue las tendencias actuales en la industria del software, escuchará términos como "programación funcional", "inmutabilidad", "funciones puras" y "composición" a diario. Todo esto suena genial, encantador y comprensible hasta que piensas: "Hola, soy un programador de OOP y no puedo (o no quiero) cambiar el paradigma. ¿Qué me puede dar la programación funcional? ¿Por qué debería molestarme? Como programador / entusiasta de FP que vino del mundo OOP, quiero compartir lo que a mí mismo me gustaría saber hace muchos años. Puedes hablar de esto durante horas, así que escojamos las tres cosas más importantes.

Inmutabilidad


La ventaja tradicional de FP es la palabra, que generalmente toma al menos dos diapositivas de cada presentación sobre programación funcional. Bala de plata FP, ¿verdad? En realidad no A pesar de que esta palabra se usa con mayor frecuencia principalmente por programadores funcionales, no es exclusiva de FP. Como desarrollador de OOP, puede lograr (casi) el mismo nivel de inmutabilidad que un desarrollador de FP. De hecho, esto es bastante fácil, solo necesita ver un poco diferente sus objetos y colecciones. Imagine que no está cambiando el original, sino que está creando una nueva versión. ¿Artículo agregado a la colección? Genial No ha cambiado la colección original, solo tiene una nueva colección que contiene el elemento agregado. Cambió la propiedad de un objeto? Wow! Ahora tiene un nuevo objeto con una propiedad modificada.

Lo sé, lo sé, suena extraño. Pero este pequeño cambio de conciencia te permitirá dormir más tranquilo. Tan pronto como comprenda que sus objetos no pueden cambiarse (solo copiarse), estará seguro de que nadie en el equipo podrá reasignarlos a otra parte. Es como pedir prestado su antiguo cassette de audio Pink Floyd favorito sin temor a volver a grabarlo con Justin Bieber. Y como beneficio adicional, su código tendrá métodos completamente rastreables en los que se producen cambios reales (donde se crean nuevos objetos basados ​​en los originales). Y casi se me olvida si eres un desarrollador de C # o Java, ya los usas llamando a "ToLower ()", "Trim ()" en líneas que inicialmente son inmutables. Eso no es esencialmente nada nuevo.

Funciones puras


Otra frase de moda erróneamente considerada exclusivamente FP. ¿Qué es una "función pura"? En pocas palabras, una función pura es una función que devuelve el mismo resultado con el mismo valor de entrada, sin comunicación con el "mundo exterior" (operaciones de E / S, estado general, etc.), también conocidos como "efectos secundarios". Un ejemplo típico de este tipo de función puede ser obtener la longitud de la cadena (¿no se conectará a la base de datos para contar el número de caracteres en una cadena?), Calcular el seno, etc. ¿Cuáles son los beneficios de esto para OOP? Igual que para FP. Si trabaja con funciones puras (o métodos), sabrá exactamente qué resultado obtendrá para cada valor de entrada. Y si su código no depende de algún estado oculto, es muy fácil probarlo y no se molestará en escribir una prueba unitaria. Todos sabemos que sin interactuar con el mundo exterior, nuestro software sería inútil, pero existe una diferencia notable entre el código puro (escrito con funciones / métodos puros) con entrada-salida solo en los límites del sistema y un sistema en el que cada método depende del estado interno, actualizado por otros métodos.

Una vez más, un pequeño replanteamiento del enfoque de E / S brinda todas las ventajas de la FP, además de que las pruebas se vuelven tan simples que finalmente comenzarán a brindar placer.

Declarativo VS Imperativo


Ya hemos cambiado el punto de vista de nuestro código: podemos escribir un código más seguro (inmutable) y comprobable (limpio). Ahora es el momento de ir un poco más allá y cambiar el enfoque para determinar qué debe hacer nuestro software. ¿Qué más hace que la POO sea tan diferente de la FA? En un mundo funcional, definimos "qué" debería suceder en lugar de determinar "cómo" debería suceder. Por supuesto, queda la parte del programa que realiza esa operación en particular, pero aquí es importante concentrarse en expresiones en lugar de enunciados. Y esto es lo que puedes hacer en tu idioma favorito de OOP.

Por ejemplo, si está familiarizado con cosas como LINQ (de C #), ya conoce los beneficios de las expresiones de consulta cuando puede leer su código como “Sí, aquí tomo 10 elementos de la colección, los ordeno alfabéticamente y los uso como parámetro para lo siguiente método ". Probablemente haya leído miles de expresiones similares a LINQ sin tener que pensar en lo que realmente sucede detrás de escena. Y lo más importante es concentrarse en lo que realmente importa.

Resumen


Creo que eso es suficiente por ahora. No quiero terminar vendiendo FP como una bala de plata. El mundo no es solo blanco y negro. La verdad es que FP es increíblemente difícil para mí. Casi tan complicado como la POO adecuada. Pero definitivamente vale la pena intentarlo. Desde mi punto de vista, OOP vs FP es, en general, la forma en que pienso sobre el código y su estructura. Cómo pienso en las dependencias, los efectos secundarios, el mundo entero de E / S y las pruebas. Para resumir con un pensamiento, "Un enfoque funcional ayudará, independientemente del idioma, el área temática y la plataforma".

Source: https://habr.com/ru/post/es415193/


All Articles