Ein Artikel bringt Ihnen bei, sauberen JavaScript-Code zu schreiben

Ein Artikel bringt Ihnen bei, sauberen JavaScript-Code zu schreiben

Ein sauberer Code lässt sich leicht lesen, wiederverwenden und umgestalten. Das Schreiben von sauberem Code ist sehr wichtig, da Sie in unserer täglichen Arbeit nicht nur Code für sich selbst schreiben. In Wirklichkeit müssen Sie auch eine Gruppe von Kollegen berücksichtigen, die Ihren Code verstehen, bearbeiten und erstellen müssen.

1. Variablen

Verwenden Sie aussagekräftige Namen

Variablennamen sollten beschreibend und aussagekräftig sein. JavaScript-Variablen sollten in CamelCase benannt werden.

// Nicht ❌
const foo = "[email protected]";
const bar = "John";
konstantes Alter = 23;
Konstanten qux = true;

// Tun ✅
const email = "[email protected]";
const Vorname = "John";
konstantes Alter = 23;
const istAktiv = true

Boolesche Variablen werden oft benötigt, um bestimmte Fragen zu beantworten, wie zum Beispiel:

istAktiv
hat abonniert
hatLinkedAccount

Vermeiden Sie das Hinzufügen unnötigen Kontexts

Fügen Sie Variablennamen keinen redundanten Kontext hinzu, wenn das Objekt oder die Klasse den Benennungskontext bereits enthält.

// Nicht ❌
const Benutzer = {
  Benutzer-ID: "296e2589-7b33-400a-b762-007b730c8e6d",
  Benutzer-E-Mail: "[email protected]",
  BenutzerVorname: "John",
  BenutzerNachname: "Doe",
  BenutzerAlter: 23,
};

Benutzer.Benutzer-ID;

// Tun ✅
const Benutzer = {
  ID: "296e2589-7b33-400a-b762-007b730c8e6d",
  E-Mail: "[email protected]",
  Vorname: "John",
  Nachname: "Doe",
  Alter: 23,
};

Benutzer-ID;

Vermeiden Sie hartcodierte Werte

Achten Sie darauf, aussagekräftige und durchsuchbare Konstanten zu deklarieren, anstatt einen konstanten Wert direkt einzufügen. Globale Konstanten können im Stil SCREAMING_SNAKE_CASE benannt werden.

// Nicht ❌
setTimeout(clearSessionData, 900000);

// Tun ✅
const SESSION_DURATION_MS = 15 * 60 * 1000;

setTimeout(clearSessionData, SESSION_DURATION_MS);

2. Funktionen

Verwenden Sie aussagekräftige Namen

Funktionsnamen müssen beschreiben, was die Funktion tatsächlich tut, auch wenn sie lang sind. In Funktionsnamen werden normalerweise Verben verwendet. Eine Funktion, die einen Booleschen Wert zurückgibt, kann jedoch eine Ausnahme darstellen. Sie kann die Form einer Ja- oder Nein-Frage haben und der Funktionsname sollte außerdem Camel Case verwenden.

// Nicht ❌
Funktion umschalten() {
  // ...
}

Funktion vereinbart (Benutzer) {
  // ...
}

// Tun ✅
Funktion toggleThemeSwitcher() {
  // ...
}

Funktion didAgreeToAllTerms(Benutzer) {
  // ...
}

Verwenden von Standardparametern

Standardparameter sind sauberer als && || oder die Verwendung zusätzlicher Bedingungen innerhalb des Funktionskörpers.

// Nicht ❌
Funktion printAllFilesInDirectory(dir) {
  const directory = dir || "./";
  // ...
}

// Tun ✅
Funktion printAllFilesInDirectory(dir = "./") {
  // ...
}

Begrenzen Sie die Anzahl der Parameter

Obwohl diese Regel umstritten sein kann, ist es am besten, Funktionen mit 3 oder weniger Parametern zu haben. Wenn viele Parameter vorhanden sind, kann eine der folgenden beiden Situationen vorliegen:

  • Diese Funktion hat zu viel zu tun und sollte aufgeteilt werden.
  • An eine in irgendeiner Weise verwandte Funktion übergebene Daten können als spezialisierte Datenstruktur übergeben werden.
// Nicht ❌
Funktion sendPushNotification(Titel, Nachricht, Bild, isSilent, delayMs) {
  // ...
}

sendPushNotification("Neue Nachricht", "...", "http://...", false, 1000);

// Tun ✅
Funktion sendPushNotification({ Titel, Nachricht, Bild, isSilent, delayMs }) {
  // ...
}

const Benachrichtigungskonfiguration = {
  Titel: "Neue Nachricht",
  Nachricht: "...",
  Bild: "http://...",
  isSilent: false,
  VerzögerungMs: 1000,
};

sendPushNotification(Benachrichtigungskonfiguration);

Vermeiden Sie, zu viele Aufgaben in einer Funktion auszuführen

Eine Funktion sollte immer nur eine Sache auf einmal tun. Dadurch werden Größe und Komplexität der Funktion reduziert und das Testen, Debuggen und Refactoring vereinfacht.

/ Nicht ❌
Funktion pingUsers(Benutzer) {
  Benutzer.fürJeden((Benutzer) => {
    const userRecord = Datenbank.lookup(Benutzer);
    wenn (!userRecord.isActive()) {
      ping(Benutzer);
    }
  });
}

// Tun ✅
Funktion pingInactiveUsers(Benutzer) {
  Benutzer.filter(!isUserActive).forEach(ping);
}

Funktion isUserActive(Benutzer) {
  const userRecord = Datenbank.lookup(Benutzer);
  gibt userRecord.isActive() zurück;
}

Vermeiden Sie die Verwendung von Booleschen Flags als Parameter

Funktionen mit Booleschen Flags als Parameter bedeuten, dass die Funktion vereinfacht werden kann.

// Nicht ❌
Funktion Dateierstelle(Name, istÖffentlich) {
  if (istÖffentlich) {
    fs.create(`./public/${name}`);
  } anders {
    fs.create(Name);
  }
}

// Tun ✅
Funktion Datei erstellen(Name) {
  fs.erstellen(Name);
}

Funktion erstelleÖffentlicheDatei(Name) {
  Datei erstellen(`./public/${name}`);
}

Vermeiden Sie das Schreiben von doppeltem Code

Wenn Sie doppelten Code schreiben, müssen Sie bei jeder Änderung der Logik mehrere Stellen ändern.

// Nicht ❌
Funktion renderCarsList(Autos) {
  Autos.fürJedes((Auto) => {
    const Preis = Auto.getPrice();
    const make = car.getMake();
    const Marke = Auto.getBrand();
    const nbOfDoors = car.getNbOfDoors();

    render({ Preis, Marke, Hersteller, Anzahl Türen });
  });
}

Funktion renderMotorcyclesList(Motorräder) {
  Motorräder.fürJedes((Motorrad) => {
    const Preis = Motorrad.getPrice();
    const make = Motorrad.getMake();
    const Marke = Motorrad.getBrand();
    const seatHeight = Motorrad.getSeatHeight();

    render({ Preis, Marke, Hersteller, Anzahl Türen });
  });
}

// Tun ✅
Funktion renderVehiclesList(Fahrzeuge) {
  Fahrzeuge.fürJedes((Fahrzeug) => {
    const Preis = Fahrzeug.getPrice();
    const make = Fahrzeug.getMake();
    const Marke = Fahrzeug.getBrand();

    const data = { Preis, Marke, Marke };

    Schalter (Fahrzeugtyp) {
      Fall "Auto":
        Daten.AnzahlTüren = Fahrzeug.getNbTüren();
        brechen;
      Fall „Motorrad“:
        Daten.Sitzhöhe = Fahrzeug.getSeatHeight();
        brechen;
    }

    rendern(Daten);
  });
}

Vermeiden Sie Nebenwirkungen

In JavaScript sollten Sie das funktionale Paradigma dem imperativen Paradigma vorziehen. Mit anderen Worten, wir sollten die Funktionen in den meisten Fällen rein halten. Nebenwirkungen können den gemeinsam genutzten Status und die Ressourcen ändern und seltsame Probleme verursachen. Alle Nebeneffekte sollten zentral verwaltet werden. Wenn Sie beispielsweise globale Variablen ändern oder Dateien modifizieren müssen, können Sie ein spezielles Dienstprogramm zu diesem Zweck schreiben.

// Nicht ❌
let Datum = "21.08.2021";

Funktion splitIntoDayMonthYear() {
  Datum = Datum.split("-");
}

splitInTagMonatJahr();

// Eine andere Funktion könnte ein Datum als Zeichenfolge erwarten
konsole.log(Datum); // ['21', '8', '2021'];

// Tun ✅
Funktion splitIntoDayMonthYear(Datum) {
  Rückgabedatum.Split("-");
}

konstantes Datum = "21.08.2021";
const newDate = splitIntoDayMonthYear(Datum);

// Originalwert bleibt erhalten
console.log(Datum); // '21.08.2021';
console.log(neuesDatum); // ['21', '8', '2021'];

Wenn Sie einer Funktion einen veränderbaren Wert übergeben, sollten Sie den Wert außerdem immer klonen und zurückgeben, anstatt ihn zu verändern.

// Nicht ❌
Funktion enrollStudentInCourse(Kurs, Student) {
  course.push({ Student, Einschreibungsdatum: Datum.jetzt() });
}

// Tun ✅
Funktion enrollStudentInCourse(Kurs, Student) {
  return [...Kurs, {Student,Einschreibungsdatum: Datum.jetzt()}];
}

3. Bedingte Anweisungen

Verwenden nicht-negativer Bedingungen

// Nicht ❌
Funktion isUserNotVerified(Benutzer) {
  // ...
}

if (!isUserNotVerified(Benutzer)) {
  // ...
}

// Tun ✅
Funktion isUserVerified(Benutzer) {
  // ...
}

if (isUserVerified(Benutzer)) {
  // ...
}

Verwenden Sie nach Möglichkeit Abkürzungen

// Nicht ❌
wenn (istAktiv === wahr) {
  // ...
}

if (Vorname !== "" && Vorname !== null && Vorname !== undefiniert) {
  // ...
}

const isUserEligible = user.isVerified() und user.didSubscribe() ? true : false;

// Tun ✅
wenn (istAktiv) {
  // ...
}

if (!!Vorname) {
  // ...
}

const isUserEligible = user.isVerified() und user.didSubscribe();

Vermeiden Sie zu viele Verzweigungen

Durch eine frühzeitige Rückgabe wird Ihr Code linearer, lesbarer und weniger komplex.

// Nicht ❌
Funktion addUserService(db, Benutzer) {
  wenn (!db) {
    wenn (!db.isConnected()) {
      wenn (!Benutzer) {
        return db.insert("Benutzer", Benutzer);
      } anders {
        throw new Error("Kein Benutzer");
      }
    } anders {
      throw new Error("Keine Datenbankverbindung");
    }
  } anders {
    throw new Error("Keine Datenbank");
  }
}

// Tun ✅
Funktion addUserService(db, Benutzer) {
  if (!db) throw new Error("Keine Datenbank");
  if (!db.isConnected()) throw new Error("Keine Datenbankverbindung");
  if (!user) throw new Error("Kein Benutzer");

  return db.insert("Benutzer", Benutzer);
}

Bevorzugen Sie Map-Anweisungen gegenüber Switch-Anweisungen

Es kann die Komplexität reduzieren und die Leistung verbessern.

// Nicht ❌
const getColorByStatus = (status) => {
  Schalter (Status) {
    Fall „Erfolg“:
      "grün" zurückgeben;
    Fall „Misserfolg“:
      gib "rot" zurück;
    Fall „Warnung“:
      gebe "gelb" zurück;
    Fall „Laden“:
    Standard:
      gebe "blau" zurück;
  }
};

// Tun ✅
const statusColors = {
  Erfolg: "grün",
  Fehler: "rot",
  Warnung: "gelb",
  Laden: "blau",
};

const getColorByStatus = (status) => statusColors[status] || "blau";

Verwenden optionaler Verkettung

const Benutzer = {
  E-Mail: "[email protected]",
  Abrechnung:
    iban: "...",
    schnell: "...",
    Adresse:
      Straße: "Ein Straßenname",
      Staat: "CA",
    },
  },
};

// Nicht ❌
const email = (Benutzer && Benutzer.E-Mail) || "N/A";
const Straße =
  (Benutzer &&
    Benutzer.Abrechnung &&
    Benutzer.Rechnungsadresse &&
    Benutzer.Rechnungsadresse.Straße) ||
  "N / A";
konstanter Zustand =
  (Benutzer &&
    Benutzer.Abrechnung &&
    Benutzer.Rechnungsadresse &&
    Benutzer.Rechnungsadresse.Bundesstaat) ||
  "N / A";

// Tun ✅
const email = Benutzer?.email ?? "N/A";
const street = Benutzer?.Rechnung?.Adresse?.Straße ?? "N/A";
const street = Benutzer?.Abrechnung?.Adresse?.Bundesstaat ?? "N/A";

4. Parallelität

Rückrufe vermeiden

Rückrufe sind verwirrend und können dazu führen, dass Ihr Code zu tief verschachtelt wird. Verwenden Sie Promises anstelle von Rückrufen.

// Nicht ❌
getUser(Funktion (err, Benutzer) {
  getProfile(Benutzer, Funktion (err, Profil) {
    getAccount(Profil, Funktion (err, Konto) {
      getReports(Konto, Funktion (Fehler, Berichte) {
        sendStatistics(Berichte, Funktion (Fehler) {
          Konsole.Fehler(Fehler);
        });
      });
    });
  });
});

// Tun ✅
getUser()
  .then(Profil abrufen)
  .dann(Konto abrufen)
  .then(getReports)
  .then(sendStatistics)
  .catch((err) => console.error(err));

// oder mit Async/Await ✅✅

asynchrone Funktion sendUserStatistics() {
  versuchen {
    const Benutzer = warte auf getUser();
    const profile = warte auf getProfile(Benutzer);
    const Konto = warte auf getAccount(Profil);
    const Berichte = warte auf getReports(Konto);
    gibt sendStatistics(Berichte) zurück;
  } fangen (e) {
    Konsole.Fehler(Fehler);
  }
}

5. Fehlerbehandlung

Umgang mit ausgelösten Fehlern und abgelehnten Versprechen

/ Nicht ❌
versuchen {
  // Möglicher fehlerhafter Code
} fangen (e) {
  konsole.log(e);
}

// Tun ✅
versuchen {
  // Möglicher fehlerhafter Code
} fangen (e) {
  // Befolgen Sie die am häufigsten (oder alle) zutreffenden Angaben:
  // 1- Geeigneter als console.log
  konsole.fehler(e);

  // 2- Benutzer ggf. benachrichtigen
  Fehlerbenutzeralarm(e);

  // 3- Dem Server melden
  Fehler an Server melden(e);

  // 4- Verwenden Sie einen benutzerdefinierten Fehlerhandler
  wirf einen neuen CustomError(e);
}

6. Anmerkungen

Nur Geschäftslogik kommentieren

Lesbarer Code erspart Ihnen übermäßiges Kommentieren. Daher sollten Sie nur komplexe Logik kommentieren.

// Nicht ❌
Funktion generateHash(str) {
  // Hash-Variable
  lass hash = 0;

  //Länge des Strings ermitteln
  lass Länge = str.Länge;

  // Wenn der String leer ist, returnieren Sie
  wenn (!Länge) {
    Hash zurückgeben;
  }

  // Durchlaufe alle Zeichen im String
  für (sei i = 0; i < Länge; i++) {
    // Zeichencode abrufen.
    const char = str.charCodeAt(i);

    // Erstelle den Hash
    Hash = (Hash << 5) – Hash + Zeichen;

    // In 32-Bit-Integer konvertieren
    Hash &= Hash;
  }
}

// Tun ✅
Funktion generateHash(str) {
  lass hash = 0;
  lass Länge = str.Länge;
  wenn (!Länge) {
    Hash zurückgeben;
  }

  für (sei i = 0; i < Länge; i++) {
    const char = str.charCodeAt(i);
    Hash = (Hash << 5) – Hash + Zeichen;
    hash = hash & hash; // In 32-Bit-Ganzzahl konvertieren
  }
  Hash zurückgeben;
}

Verwenden Sie die Versionskontrolle

Es ist nicht notwendig, Kommentare zu früheren Versionen im Code zu speichern. Wenn Sie dies überprüfen möchten, können Sie einfach mit „git log“ suchen. .

// Nicht ❌
/**
 * 21.07.2021: Sonderfall behoben
 * 15.07.2021: Verbesserte Leistung
 * 10.07.2021: Mehrere Benutzertypen verarbeitet
 */
Funktion generateCanonicalLink(Benutzer) {
  // const session = getUserSession(Benutzer)
  const session = Benutzer.getSession();
  // ...
}

// Tun ✅
Funktion generateCanonicalLink(Benutzer) {
  const session = Benutzer.getSession();
  // ...
}

Ok, schreiben Sie Ihren schönen Code! 🌈

Zusammenfassen

Dies ist das Ende dieses Artikels zum Schreiben von sauberem JavaScript-Code. Weitere Informationen zum Schreiben von sauberem JavaScript-Code finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die verwandten Artikel weiter unten. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • JS-Popup-Fenster-Codesammlung (detaillierte Anordnung)
  • Eine detaillierte Erklärung des authentischen JS-Codes mit regulären Ausdrücken zur Überprüfung von E-Mail-Adressen
  • JavaScript-Code zum Abrufen des aktuellen Zeitstempels
  • JS-Klassenkapselung und Implementierungscode
  • Ein sehr guter JS-Paging-Effektcode, den es zu studieren lohnt
  • js-Code zur Realisierung des 60-Sekunden-Countdowns beim Klicken auf die Schaltfläche
  • Bestimmen Sie, ob eine Funktion oder Variable in JavaScript vorhanden ist
  • Detaillierte Erläuterung der Variablenpromotion und Funktionspromotion in JavaScript

<<:  Führen Sie die folgenden Schritte aus, um die Anmeldung durch Gesichtserkennung in Ubuntu zu implementieren

>>:  Grundsätze und Nutzungsdetails für MySQL 8.0-Benutzer- und Rollenverwaltung

Artikel empfehlen

So löschen Sie den MySQL-Dienst vollständig (bereinigen Sie die Registrierung)

Vorwort Beim Installieren der ausführbaren Datei ...

Der JavaScript-Artikel zeigt Ihnen, wie Sie mit Webformularen spielen

1. Einleitung Zuvor haben wir die schnelle Entwic...

Einige Tipps zur Beschleunigung der Entwicklung von WeChat-Miniprogrammen

1. Erstellen Sie eine Seite mit app.json Gemäß un...

Webpack erstellt ein Gerüst zum Verpacken von TypeScript-Code

Erstellen eines Ordners Verzeichnisstruktur: daba...

Installieren Sie mehrere PHP-Versionen für Nginx unter Linux

Wenn wir die LNPM-Serverumgebung installieren und...

CSS3 zum Erzielen eines dynamischen Hintergrundverlaufseffekts

Beim Erlernen von CSS3 geht es mehr darum, sich m...

Einführung in Jenkins und wie man Jenkins mit Docker bereitstellt

1. Verwandte Konzepte 1.1 Jenkins-Konzepte: Jenki...

Detaillierte Erklärung des Flex-Layouts in CSS

Flex-Layout wird auch elastisches Layout genannt....

Details zur React Routing Link-Konfiguration

1. Link zum Attribut (1) Platzieren Sie den Routi...

So verwenden Sie worker_threads zum Erstellen neuer Threads in nodejs

Einführung Wie im vorherigen Artikel erwähnt, gib...

Detaillierte Erläuterung der 4 gängigen Datenquellen in Spark SQL

Allgemeine Lade-/Schreibmethoden Optionen manuell...

So verwenden Sie HTML+CSS zum Erstellen einer TG-Vision-Homepage

Dieses Mal verwenden wir HTML+CSS-Layout, um eine...