Permitam-me que comece com o fato de que eu não sou especialista em programação funcional. Eu sou mais uma pessoa OOP. Portanto, embora eu tenha certeza de que o seguinte é como você realizaria o mesmo tipo de funcionalidade com o FP, eu posso estar errado.
Isso está em Texto datilografado (daí todas as anotações de tipo). Texto datilografado (como javascript) é uma linguagem de vários domínios.
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 );
Em detalhes (e novamente, não um especialista em FP), o importante é entender que não há muito comportamento predefinido. Não existe um método de "aumento de preço" que aplique um aumento de preço em toda a lista, porque é claro que isso não é POO: não há classe para definir esse comportamento. Em vez de criar um objeto que armazena uma lista de produtos, você apenas cria uma matriz de produtos. Você pode usar procedimentos FP padrão para manipular essa matriz da maneira que desejar: filtrar para selecionar itens específicos, mapear para ajustar internos, etc. API que o SimpleProductManager fornece a você. Isso pode ser considerado uma vantagem por alguns. Também é verdade que você não não precisa se preocupar com nenhuma bagagem associada à classe ProductManager. Por fim, não há preocupação com "SetProducts" ou "GetProducts", porque não há nenhum objeto que oculte seus produtos: você apenas possui a lista de produtos com os quais está trabalhando. Novamente, isso pode ser uma vantagem ou desvantagem, dependendo das circunstâncias / pessoa com quem você está falando. Além disso, obviamente não há hierarquia de classes (do que ele estava reclamando), porque não existem classes em primeiro lugar. isso pode ser uma vantagem ou desvantagem, dependendo das circunstâncias / pessoa com quem você está falando. Além disso, obviamente não há hierarquia de classes (do que ele estava reclamando), porque não existem classes em primeiro lugar. isso pode ser uma vantagem ou desvantagem, dependendo das circunstâncias / pessoa com quem você está falando. Além disso, obviamente não há hierarquia de classes (do que ele estava reclamando), porque não existem classes em primeiro lugar.
Não tive tempo para ler todo o seu discurso. Uso práticas de FP quando é conveniente, mas definitivamente sou mais do tipo OOP. Então, pensei que, desde que respondesse sua pergunta, também faria alguns breves comentários sobre as opiniões dele. Eu acho que este é um exemplo muito artificial que destaca as "desvantagens" do POO. Nesse caso em particular, para a funcionalidade mostrada, o OOP provavelmente está exagerado e o FP provavelmente seria um ajuste melhor. Por outro lado, se isso fosse algo como um carrinho de compras, proteger sua lista de produtos e limitar o acesso a ela é (acho) um objetivo muito importante do programa, e a FP não tem como impor essas coisas. Novamente, pode ser que eu não seja um especialista em FP, mas tendo implementado carrinhos de compras para sistemas de comércio eletrônico, eu preferiria usar OOP do que FP.
Pessoalmente, tenho dificuldade em levar alguém a sério que faça um argumento tão forte para "X é simplesmente terrível. Sempre use Y". A programação tem uma variedade de ferramentas e paradigmas, porque há uma grande variedade de problemas a serem resolvidos. O FP tem o seu lugar, o OOP tem o seu lugar, e ninguém será um grande programador se não conseguir entender as desvantagens e vantagens de todas as nossas ferramentas e quando usá-las.
** nota: Obviamente, há uma classe no meu exemplo: a classe Product. Neste caso, embora seja simplesmente um contêiner de dados estúpido: não acho que meu uso viole os princípios do FP. É mais um auxiliar para verificação de tipo.
** observação: não me lembro de cima da cabeça e não verifiquei se a maneira como usei a função de mapa modificaria os produtos no local, ou seja, eu inadvertidamente dobrei o preço dos produtos nos produtos originais array. Obviamente, esse é o tipo de efeito colateral que a FP tenta evitar e, com um pouco mais de código, eu certamente poderia garantir que isso não aconteça.