Дозвольте передмовити це тим, що я не фахівець з функціонального програмування. Я більше людина з ООП. Тому, хоча я впевнений, що нижче, як ви могли б виконати такий же функціонал з FP, я можу помилитися.
Це в 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 для маніпулювання цим масивом будь-яким способом: фільтрувати для вибору конкретних елементів, карту для коригування внутрішніх даних тощо. Ви закінчуєте більш детальний контроль над своїм списком продуктів, не обмежуючись цим API, який надає SimpleProductManager. Деякі можуть вважати це перевагою. Це також правда, що ви не ' не потрібно турбуватися про будь-який багаж, пов’язаний з класом ProductManager. Нарешті, про "SetProducts" або "GetProducts" не варто хвилюватися, оскільки немає жодного об'єкта, який би приховував ваші продукти: натомість у вас просто список продуктів, з якими ви працюєте. Знову ж таки, це може бути перевагою чи недоліком залежно від обставин / людини, з якою ви спілкуєтесь. Також очевидно немає ієрархії класів (на що він скаржився), оскільки в першу чергу немає занять. це може бути перевагою чи недоліком залежно від обставин / людини, з якою ви спілкуєтесь. Також очевидно немає ієрархії класів (на що він скаржився), оскільки в першу чергу немає занять. це може бути перевагою чи недоліком залежно від обставин / людини, з якою ви спілкуєтесь. Також очевидно немає ієрархії класів (на що він скаржився), оскільки в першу чергу немає занять.
Я не витрачав часу, щоб прочитати всю його тираж. Я використовую практику FP, коли це зручно, але я, безумовно, більше хлопець типу OOP. Тож я зрозумів, що коли я відповів на ваше запитання, я також зроблю кілька коротких коментарів щодо його думки. Я думаю, що це дуже надуманий приклад, який підкреслює "недоліки" ООП. У цьому конкретному випадку для показаної функціональності OOP, ймовірно, є надмірним вбивством, а FP, ймовірно, краще підходить. Знову ж таки, якби це було щось подібне до кошика для покупок, захист списку ваших товарів і обмеження доступу до нього - це (я думаю) дуже важлива мета програми, і FP не має можливості застосувати такі речі. Знову ж таки, може бути просто те, що я не фахівець з ПП, але впровадивши кошики для систем електронної комерції, я б швидше скористався OOP, ніж FP.
Особисто мені важко сприймати когось серйозно, що робить такий сильний аргумент для "X просто жахливо. Завжди використовуй Y". Програмування має різноманітні інструменти та парадигми, оскільки існує широкий спектр проблем для вирішення. FP має своє місце, OOP має своє місце, і ніхто не стане чудовим програмістом, якщо вони не можуть зрозуміти недоліки та переваги всіх наших інструментів і коли їх використовувати.
** Примітка. Очевидно, що в моєму прикладі є один клас: клас Product. У цьому випадку, хоча це просто тупий контейнер даних: я не думаю, що моє використання його порушує принципи FP. Це скоріше помічник для перевірки типу.
** Примітка: я не пам’ятаю верхньої частини голови і не перевіряв, чи спосіб, яким я користувався функцією карти, змінив продукти на місці, тобто чи ненароком подвоїв ціну на продукти в оригінальних продуктах масив. Очевидно, це такий побічний ефект, якого намагається уникнути FP, і, маючи трохи більше коду, я, безумовно, можу переконатися, що цього не відбудеться.