Permítanme presentar esto con el hecho de que no soy un experto en programación funcional. Soy más una persona OOP. Entonces, aunque estoy bastante seguro de que lo siguiente es cómo lograrías el mismo tipo de funcionalidad con FP, podría estar equivocado.
Esto está en mecanografiado (de ahí todas las anotaciones de tipo). El mecanografiado (como javascript) es un lenguaje multidominio.
export class Product extends Object {
name: string;
price: number;
category: string;
}
products: Product[] = [
new Product( { name: "Tablet", "price": 20.99, category: 'Electronics' } ),
new Product( { name: "Phone", "price": 500.00, category: 'Electronics' } ),
new Product( { name: "Car", "price": 13500.00, category: 'Auto' } )
];
// find all electronics and double their price
let newProducts = products
.filter( ( product: Product ) => product.category === 'Electronics' )
.map( ( product: Product ) => {
product.price *= 2;
return product;
} );
console.log( newProducts );
En detalle (y de nuevo, no es un experto en FP), lo que hay que entender es que no hay mucho comportamiento predefinido. No existe un método de "aumento de precio" que aplique un aumento de precio en toda la lista, porque, por supuesto, esto no es POO: no hay una clase en la que definir dicho comportamiento. En lugar de crear un objeto que almacene una lista de productos, simplemente cree una variedad de productos. A continuación, puede utilizar procedimientos FP estándar para manipular esta matriz de la forma que desee: filtrar para seleccionar elementos particulares, asignar para ajustar elementos internos, etc. Termina con un control más detallado sobre su lista de productos sin tener que estar limitado por el API que le proporciona SimpleProductManager. Esto puede ser considerado una ventaja por algunos. También es cierto que no No tiene que preocuparse por ningún equipaje asociado con la clase ProductManager. Finalmente, no hay que preocuparse por "SetProducts" o "GetProducts", porque no hay ningún objeto que oculte sus productos: en su lugar, solo tiene la lista de productos con los que está trabajando. Nuevamente, esto puede ser una ventaja o desventaja dependiendo de las circunstancias / persona con la que está hablando. Además, obviamente no hay una jerarquía de clases (que es de lo que se estaba quejando) porque no hay clases en primer lugar. Esto puede ser una ventaja o desventaja dependiendo de las circunstancias / persona con la que está hablando. Además, obviamente no hay una jerarquía de clases (que es de lo que se estaba quejando) porque no hay clases en primer lugar. Esto puede ser una ventaja o desventaja dependiendo de las circunstancias / persona con la que está hablando. Además, obviamente no hay una jerarquía de clases (que es de lo que se estaba quejando) porque no hay clases en primer lugar.
No me tomé el tiempo de leer toda su diatriba. Utilizo prácticas de FP cuando es conveniente, pero definitivamente soy más del tipo OOP. Así que pensé que desde que respondí tu pregunta, también haría algunos breves comentarios sobre sus opiniones. Creo que este es un ejemplo muy artificial que destaca los "inconvenientes" de la POO. En este caso en particular, para la funcionalidad que se muestra, OOP probablemente está sobre-asesinado, y FP probablemente sería una mejor opción. Por otra parte, si esto fuera por algo así como un carrito de compras, proteger su lista de productos y limitar el acceso a ella es (creo) un objetivo muy importante del programa, y FP no tiene forma de hacer cumplir tales cosas. De nuevo, puede ser que no soy un experto en FP, pero habiendo implementado carritos de compras para sistemas de comercio electrónico, preferiría usar OOP que FP.
Personalmente, me cuesta tomar en serio a cualquiera que tenga un argumento tan fuerte para "X es simplemente terrible. Siempre usa Y". La programación tiene una variedad de herramientas y paradigmas porque hay una gran variedad de problemas para resolver. FP tiene su lugar, OOP tiene su lugar, y nadie será un gran programador si no puede entender los inconvenientes y las ventajas de todas nuestras herramientas y cuándo usarlas.
** nota: Obviamente hay una clase en mi ejemplo: la clase de Producto. En este caso, aunque es simplemente un contenedor de datos tonto: no creo que mi uso viole los principios de FP. Es más útil para la verificación de tipos.
** nota: no recuerdo la parte superior de mi cabeza y no verifiqué si la forma en que utilicé la función de mapa modificaría los productos en el lugar, es decir, ¿doblé inadvertidamente el precio de los productos en los productos originales? formación. Obviamente, ese es el tipo de efecto secundario que FP intenta evitar, y con un poco más de código ciertamente podría asegurarme de que no suceda.