5 zu vermeidende Anti-Muster beim Arbeiten mit Sammlungen in JavaScript

Bloggen

5 zu vermeidende Anti-Muster beim Arbeiten mit Sammlungen in JavaScript

Das Arbeiten mit Sammlungen in JavaScript kann zu einer entsetzlichen Aufgabe werden, insbesondere wenn in einem Funktionsblock viel los ist.



Haben Sie sich jemals gefragt wie Einige Projekte im Code sehen viel schöner aus als andere? Oder wenn ein scheinbar schwieriges Projekt so klein wird, dass Ihr Verstand einfach in eine wilde Fahrt verfällt und sich fragt, wie sie es gleichzeitig einfach und robust halten konnten?






Wenn ein Projekt leicht lesbar ist und gleichzeitig eine gute Leistung beibehält, können Sie sicher sein, dass wahrscheinlich ziemlich gute Praktiken auf den Code angewendet werden.



Was ist Lagerfeuer-Krypto

Es kann leicht zum Gegenteil werden, wenn Code wie ein Durcheinander geschrieben wird. An diesem Punkt ist es leicht, in eine Situation zu geraten, in der das Ändern kleiner Code-Bits zu katastrophalen Problemen für Ihre Anwendung führt – mit anderen Worten, zu einem Fehler, der eine Webseite zum Absturz bringt, damit sie nicht weiter fortgesetzt werden kann. Beim Iterieren über Sammlungen kann es beängstigend werden, wenn schlechter Code ausgeführt wird.



Bei der Durchsetzung besserer Praktiken geht es darum, sich selbst daran zu hindern, kurze Anweisungen zu geben, was wiederum dazu beiträgt, Garantien zu sichern. Das heißt, es kommt darauf an Sie um Ihren Code langfristig so wartbar wie möglich zu machen.






Dieser Artikel geht auf 5 Anti-Muster ein, die Sie vermeiden sollten, wenn Sie mit Sammlungen in JavaScript arbeiten

Viele der Codebeispiele in diesem Artikel verkörpern ein Programmierparadigma namens Funktionale Programmierung . Funktionale Programmierung, wie Erich Elliot erklärt es, ist der Prozess des Erstellens von Software durch das Komponieren reiner Funktionen, das Vermeiden von gemeinsamem Zustand, veränderlichen Daten und Nebeneffekten. . Wir werden in diesem Beitrag häufig Nebenwirkungen und Mutationen erwähnen.

Hier sind ___ Anti-Patterns in JavaScript, die Sie beim Arbeiten mit Sammlungen vermeiden sollten:

1. Vorzeitiges Übergeben von Funktionen als direkte Argumente

Das erste Anti-Pattern, das wir besprechen werden, ist das vorzeitige Übergeben von Funktionen als direktes Argument an Array-Methoden, die Sammlungen durchlaufen.

Hier ist ein einfaches Beispiel dafür:

|_+_|

Warum ist das also ein Anti-Pattern?

Die meisten Entwickler, insbesondere diejenigen, die sich mehr für funktionale Programmierung interessieren, finden dies möglicherweise sauber, prägnant und leistungsfähig. Ich meine, schau es dir einfach an. Anstatt dies tun zu müssen:

|_+_|

Es scheint viel schöner zu sein, einfach den Namen der Funktion einzugeben und Schluss zu machen:

|_+_|

In einer perfekten Welt wäre dies die perfekte Lösung, um mit all unseren Funktionen in JavaScript zu arbeiten, ohne jemals ins Schwitzen zu geraten.

Es stellt sich jedoch heraus, dass ein vorzeitiges Übergeben Ihrer Handler auf diese Weise zu unerwarteten Fehlern führen kann. Lassen Sie uns zum Beispiel weitermachen und auf unser vorheriges Beispiel zurückblicken:

|_+_|

Unser |_+_| Die Funktion erwartet ein Array, in dem der erste und der zweite Index Zahlen sind, fügt sie hinzu und prüft, ob ein Callback vorhanden ist, und ruft ihn auf, falls vorhanden. Das Problem hier ist, dass |_+_| könnte am Ende als |_+_| aufgerufen werden und führt zu einem Fehler:

2. Sich auf die Reihenfolge von Iteratorfunktionen wie |_+_| verlassen und |_+_|

Die grundlegenden Funktionen von JavaScript verarbeiten Elemente in Sammlungen in der Reihenfolge, in der sie sich gerade im Array befinden. Ihr Code sollte jedoch nicht hängen davon ab.

Erstens ist die Reihenfolge der Iterationen niemals in jeder Sprache oder Bibliothek zu 100 % stabil. Es empfiehlt sich, jede iterierte Funktion so zu behandeln, als ob sie gleichzeitig in mehreren Prozessen ausgeführt wird.

Ich habe Code gesehen, der so etwas macht:

|_+_|

Im die meisten Situationen ist dies völlig in Ordnung, aber wenn wir genau hinsehen, ist es nicht der sicherste Ansatz, da alles im globalen Bereich |_+_| aktualisieren kann. Wenn dies passiert und |_+_| versehentlich irgendwo im Code dekrementiert wird, dann |_+_| Wille noch nie laufen können!

Es kann noch schlimmer werden, wenn Sie in asynchronen Operationen arbeiten:

|_+_|

Das Ergebnis:

Diejenigen unter Ihnen, die mehr Erfahrung mit JavaScript haben, werden wahrscheinlich wissen, warum wir bekommen vier Nummer |_+_| ist an der Konsole angemeldet und nicht |_+_|. Der Punkt ist, dass es besser ist, das zweite Argument (allgemein als das aktuelle |_+_| bezeichnet) zu verwenden, das die meisten Funktionen erhalten, wenn sie über Sammlungen iterieren, um Parallelität zu vermeiden:

|_+_|

Das Ergebnis:

3. Vorzeitige Optimierung

Wenn Sie optimieren möchten, liegt normalerweise Ihre Entscheidung dazwischen, ob Sie Lesbarkeit oder Geschwindigkeit bevorzugen. Manchmal kann es werden Ja wirklich Es ist verlockend, mehr Aufmerksamkeit auf die Optimierung der Geschwindigkeit Ihrer App zu richten, anstatt die Lesbarkeit Ihres Codes zu verbessern. Schließlich ist es eine weithin akzeptierte Wahrheit, dass Geschwindigkeit auf Websites wichtig ist. Aber das ist eigentlich ein schlechte Praxis .

Zum einen sind Sammlungen in JavaScript normalerweise kleiner als Sie denken, und die Zeit, die für die Verarbeitung jeder Operation benötigt wird, ist auch schneller als Sie denken. Eine gute Regel, die Sie hier befolgen sollten, lautet: Es sei denn, Sie kennt Etwas wird langsam sein, versuchen Sie nicht, es schneller zu machen. Das nennt man Vorzeitige Optimierung , oder mit anderen Worten, der Versuch, Code zu optimieren, der möglicherweise bereits in Bezug auf die Geschwindigkeit am optimalsten ist.

Wie Donald Knut bringt es auf den Punkt: Das eigentliche Problem besteht darin, dass Programmierer viel zu viel Zeit damit verbracht haben, sich an den falschen Stellen und zur falschen Zeit Gedanken über die Effizienz zu machen; vorzeitige Optimierung ist die Wurzel allen Übels (oder zumindest das meiste davon) in der Programmierung ..

In vielen Situationen ist es einfacher, eine höhere Geschwindigkeit anzuwenden, wenn der Code am Ende etwas langsamer ist, als die Aufrechterhaltung eines schnell funktionierenden Codes in einem Wirrwarr zu stressen.

Ich empfehle, die Lesbarkeit zu bevorzugen und dann mit dem Messen fortzufahren. Wenn Sie einen Profiler verwenden und dieser einen Engpass in Ihrer Anwendung meldet, optimieren Sie dieses Bit nur, weil Sie es jetzt tun kennt es ist eigentlich ein langsamer Code, im Gegensatz zu versuchen Code zu optimieren, wo Sie denken es könnte langsam werden.

4. Sich auf den Staat verlassen

Bundesland ist ein sehr wichtiges Konzept in der Programmierung, da es ein Konzept ist, das es uns ermöglicht, robuste Anwendungen zu erstellen, es aber auch kann Unterbrechung unsere Anwendungen, wenn wir nicht genug auf uns selbst achten.

Hier ist ein Beispiel für ein Anti-Pattern beim Arbeiten mit Status in Sammlungen:

|_+_|

Dies ist ein Beispiel für eine Nebeneffekt , etwas, auf das Sie unbedingt achten sollten, da es Probleme verursachen kann wie:

  • Unerwartete Nebenwirkungen hervorrufen ( Wirklich gefährlich!)
  • Speicherauslastung erhöhen
  • Reduzieren der Leistung Ihrer App
  • Machen Sie Ihren Code schwerer lesbar / verständlich
  • Erschweren Sie das Testen Ihres Codes

Was ist also ein besserer Weg, dies zu schreiben, ohne eine Nebenwirkung zu verursachen? Oder wie können wir dies mit einer besseren Praxis umschreiben?

Wenn Sie mit Sammlungen arbeiten und während der Operation mit dem Status arbeiten müssen, denken Sie daran, dass wir bestimmte Methoden verwenden können bieten Ihnen eine frische neue Referenz von etwas (wie Objekten).

Ein Beispiel ist die Verwendung von |_+_| Methode:

|_+_|

Was hier also passiert, ist, dass wir mit einem Staat interagieren innerhalb seines Blocks aber wir verwenden auch das zweite Argument für |_+_| wobei der Wert bei der Initialisierung neu erstellt werden kann. Dies verwendet einen besseren Ansatz als das vorherige Snippet, da wir nichts mutieren außerhalb des Geltungsbereichs . Das macht unser |_+_| ein Beispiel für die Arbeit mit unveränderlichen Sammlungen und Nebenwirkungen vermeiden .

5. Verändernde Argumente

Zu mutieren etwas bedeutet, sich in der Form oder in der Natur zu ändern. Dies ist ein wichtiges Konzept, dem man in JavaScript besonders im Kontext der funktionalen Programmierung besondere Aufmerksamkeit widmen sollte. Etwas, das veränderlich ist, kann geändert werden, während etwas, das unveränderlich ist kann nicht (oder sollte nicht ) verändert sein.

Google Sheets API Nodejs

Hier ist ein Beispiel:

|_+_|

Wir erwarten den Wert von |_+_| um ein neues Array von |_+_| zurückzugeben die alle durch Umdrehen ihrer |_+_| in Kröten umgewandelt wurden Eigenschaft zu |_+_|.

Aber hier wird es ein wenig schaurig: Als wir einige der |_+_| mutierten Objekte, indem Sie Folgendes tun: |_+_|, wir auch ungewollt mutiert sie innerhalb der |_+_| Anordnung!

Wir können sehen, dass |_+_| sind jetzt alle Kröten weil es mutiert ist:

Dies geschieht, weil Objekte in JavaScript werden alle durch Referenzen übergeben ! Was wäre, wenn wir die zuweisen würden gleich Objekt an 10 verschiedenen Stellen im Code herum?

Wenn wir diese Referenz zum Beispiel 10 verschiedenen Variablen in unserem Code zuweisen, dann mutierte Variable 7 irgendwann später im Code, alle der anderen Variablen, die einen Verweis auf denselben Zeiger im Speicher enthalten auch mutiert werden :

|_+_|

Ergebnis:

Stattdessen können wir jedes Mal neue Referenzen erstellen, wenn wir sie mutieren möchten:

|_+_|

Ergebnis:

Fazit

Und damit ist das Ende dieses Beitrags abgeschlossen! Ich fand, dass Sie dies wertvoll fanden und halten Sie in Zukunft Ausschau nach mehr!