Позвольте мне предвосхитить это тем фактом, что я не специалист по функциональному программированию. Я больше ООП человек. Так что, хотя я почти уверен, что ниже приведен пример того, как вы могли бы реализовать такую же функциональность с FP, я могу ошибаться.
Это In Typescript (отсюда и все аннотации типов). Typescript (например, javascript) является многодоменным языком.
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 );
Подробно (и опять же, не эксперт по FP), нужно понимать, что здесь не так много предопределенного поведения. Не существует метода «повышения цены», который бы применял повышение цены по всему списку, потому что, конечно, это не ООП: нет класса, в котором можно было бы определить такое поведение. Вместо создания объекта, в котором хранится список товаров, вы просто создаете массив товаров. Затем вы можете использовать стандартные процедуры FP для манипулирования этим массивом любым удобным для вас способом: фильтр для выбора определенных элементов, сопоставление для настройки внутренних элементов и т. Д. Вы получаете более подробный контроль над списком продуктов, не ограничиваясь API, который предоставляет вам SimpleProductManager. Некоторые могут считать это преимуществом. Также верно, что вы не Не нужно беспокоиться о багаже, связанном с классом ProductManager. Наконец, не стоит беспокоиться о «SetProducts» или «GetProducts», потому что нет объектов, скрывающих ваши продукты: вместо этого у вас есть только список продуктов, с которыми вы работаете. Опять же, это может быть преимуществом или недостатком в зависимости от обстоятельств / человека, с которым вы разговариваете. Кроме того, очевидно, что нет иерархии классов (на что он жаловался), потому что в первую очередь нет классов. это может быть преимуществом или недостатком в зависимости от обстоятельств / человека, с которым вы разговариваете. Кроме того, очевидно, что нет иерархии классов (на что он жаловался), потому что в первую очередь нет классов. это может быть преимуществом или недостатком в зависимости от обстоятельств / человека, с которым вы разговариваете. Кроме того, очевидно, что нет иерархии классов (на что он жаловался), потому что в первую очередь нет классов.
Я не нашел время, чтобы прочитать всю его напыщенную речь. Я использую практики FP, когда это удобно, но я определенно больше похож на ООП. Так что я решил, что, так как я ответил на ваш вопрос, я бы также сделал несколько кратких комментариев по поводу его мнения. Я думаю, что это очень надуманный пример, который подчеркивает "недостатки" ООП. В данном конкретном случае для показанной функциональности ООП, вероятно, является чрезмерным, и ФП, вероятно, подойдет лучше. Опять же, если бы это было для чего-то вроде корзины для покупок, защита списка ваших товаров и ограничение доступа к нему - это (я думаю) очень важная цель программы, и у FP нет никакого способа обеспечить такие вещи. Опять же, возможно, я просто не эксперт по FP, но, внедрив корзины для систем электронной коммерции, я бы предпочел использовать ООП, а не FP.
Лично мне трудно воспринимать кого-либо всерьез, который приводит такой веский аргумент в пользу «X просто ужасен. Всегда используйте Y». Программирование имеет множество инструментов и парадигм, потому что существует множество проблем, которые необходимо решить. У FP есть свое место, у OOP есть свое место, и никто не станет великим программистом, если они не смогут понять недостатки и преимущества всех наших инструментов и когда их использовать.
** примечание: очевидно, в моем примере есть один класс: класс Product. В этом случае, хотя это просто тупой контейнер данных: я не думаю, что его использование нарушает принципы FP. Это скорее помощник для проверки типов.
** примечание: я не помню, как на макушке головы, и не проверял, изменит ли я то, как я использовал функцию карты, изменение продуктов на месте, т. е. случайно ли я удвоил цену продуктов в исходных продуктах массив. Это, очевидно, тот побочный эффект, которого FP пытается избежать, и с немного большим количеством кода я, безусловно, смог бы убедиться, что этого не произойдет.