Lassen Sie mich dies mit der Tatsache vorwegnehmen, dass ich kein Experte für funktionale Programmierung bin. Ich bin eher eine OOP-Person. Obwohl ich mir ziemlich sicher bin, wie Sie mit FP die gleiche Funktionalität erreichen würden, könnte ich mich irren.
Dies ist In Typescript (daher alle Typanmerkungen). Typoskript (wie Javascript) ist eine Multi-Domain-Sprache.
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 );
Im Detail (und auch hier kein FP-Experte) ist zu verstehen, dass es nicht viele vordefinierte Verhaltensweisen gibt. Es gibt keine "Preiserhöhungsmethode", die eine Preiserhöhung auf die gesamte Liste anwendet, da dies natürlich keine OOP ist: Es gibt keine Klasse, in der ein solches Verhalten definiert werden kann. Anstatt ein Objekt zu erstellen, in dem eine Liste von Produkten gespeichert ist, erstellen Sie einfach ein Array von Produkten. Sie können dann Standard-FP-Prozeduren verwenden, um dieses Array nach Ihren Wünschen zu bearbeiten: Filtern, um bestimmte Elemente auszuwählen, Zuordnen, um Interna anzupassen usw. Sie haben am Ende eine detailliertere Kontrolle über Ihre Produktliste, ohne sich durch die einschränken zu müssen API, die Ihnen der SimpleProductManager bietet. Dies kann von einigen als Vorteil angesehen werden. Es ist auch wahr, dass Sie nicht ' Sie müssen sich keine Gedanken über Gepäck machen, das mit der ProductManager-Klasse verbunden ist. Schließlich müssen Sie sich keine Sorgen um "SetProducts" oder "GetProducts" machen, da es kein Objekt gibt, das Ihre Produkte verbirgt. Stattdessen haben Sie nur die Liste der Produkte, mit denen Sie arbeiten. Dies kann wiederum ein Vorteil oder ein Nachteil sein, abhängig von den Umständen / der Person, mit der Sie sprechen. Außerdem gibt es offensichtlich keine Klassenhierarchie (worüber er sich beschwert hat), da es überhaupt keine Klassen gibt. Dies kann je nach den Umständen / der Person, mit der Sie sprechen, ein Vorteil oder ein Nachteil sein. Außerdem gibt es offensichtlich keine Klassenhierarchie (worüber er sich beschwert hat), da es überhaupt keine Klassen gibt. Dies kann je nach den Umständen / der Person, mit der Sie sprechen, ein Vorteil oder ein Nachteil sein. Außerdem gibt es offensichtlich keine Klassenhierarchie (worüber er sich beschwert hat), da es überhaupt keine Klassen gibt.
Ich habe mir nicht die Zeit genommen, sein gesamtes Geschwätz zu lesen. Ich benutze FP-Praktiken, wenn es bequem ist, aber ich bin definitiv eher ein OOP-Typ. Da ich Ihre Frage beantwortet habe, dachte ich mir, ich würde auch einige kurze Kommentare zu seinen Meinungen abgeben. Ich denke, dies ist ein sehr ausgeklügeltes Beispiel, das die "Nachteile" von OOP hervorhebt. In diesem speziellen Fall ist OOP für die gezeigte Funktionalität wahrscheinlich übertrieben, und FP wäre wahrscheinlich besser geeignet. Andererseits, wenn dies für so etwas wie einen Einkaufswagen wäre, ist der Schutz Ihrer Produktliste und die Einschränkung des Zugriffs darauf (glaube ich) ein sehr wichtiges Ziel des Programms, und FP hat keine Möglichkeit, solche Dinge durchzusetzen. Auch hier kann es sein, dass ich kein FP-Experte bin, aber nachdem ich Einkaufswagen für E-Commerce-Systeme implementiert habe, würde ich lieber OOP als FP verwenden.
Persönlich fällt es mir schwer, jemanden ernst zu nehmen, der ein so starkes Argument für "X ist einfach schrecklich. Verwenden Sie immer Y" macht. Die Programmierung verfügt über eine Vielzahl von Werkzeugen und Paradigmen, da eine Vielzahl von Problemen zu lösen ist. FP hat seinen Platz, OOP hat seinen Platz, und niemand wird ein großartiger Programmierer sein, wenn er die Nachteile und Vorteile all unserer Tools nicht versteht und wann er sie verwenden soll.
** Hinweis: In meinem Beispiel gibt es natürlich eine Klasse: die Produktklasse. In diesem Fall ist es jedoch einfach ein dummer Datencontainer: Ich glaube nicht, dass meine Verwendung gegen die Prinzipien von FP verstößt. Es ist eher ein Helfer für die Typprüfung.
** Hinweis: Ich erinnere mich nicht auf Anhieb und habe nicht überprüft, ob die Art und Weise, wie ich die Kartenfunktion verwendet habe, die Produkte an Ort und Stelle modifizieren würde, dh ich habe versehentlich den Preis der Produkte in den Originalprodukten verdoppelt Array. Das ist offensichtlich die Art von Nebeneffekt, die FP zu vermeiden versucht, und mit etwas mehr Code könnte ich sichergehen, dass dies nicht geschieht.