Kennen Sie den Begriff "Spaghetti-Code"? Dies ist eine Metapher, die Sie möglicherweise von Nicht-JavaScript-Entwicklern bei der Sprachkritik hören. Es ist Code ohne Struktur. Es wird aus Zeile für Zeile bestehen. Einige können in Funktionen eingeschlossen sein, andere gar nicht. Und wenn Sie Glück haben, werden alle 9.000 Codezeilen in einer Datei gespeichert. Diese "Spaghetti" -Struktur ist wahrscheinlich das Ergebnis einer prozeduralen Programmierung.
Bei der prozeduralen Programmierung werden Funktionen zur Durchführung von Aufgaben verwendet. Wir brauchen Funktionen, aber wir brauchen auch ein Design, mit dem wir arbeiten können. Und während Spaghetti zum Abendessen gut sind, ist es kein Code. Das Gegenmittel ist eine objektorientierte Programmierung. Um die objektorientierte Programmierung zu verstehen, behandeln wir die Gestaltung eines Programms, das Definieren von Klassen und das Erstellen von Objekten.
Stellen wir uns vor, Sie haben die Aufgabe erhalten, einen Antrag für eine Buchhandlung zu stellen. Lassen Sie uns aus Spaß unsere Buchhandlung Amazonia anrufen. Amazonia wird Bücher haben. Es wird Rezensionen für Bücher geben. Und wir wollen Bücher nach Autor suchen. Es wird noch mehr Funktionen geben, die wir in unserer App implementieren möchten, aber das reicht jetzt.
Objektorientierte Programmierung konzentriert sich auf das Erstellen von Objekten. Wie können wir also diese Anforderungen in Objekte umsetzen? Eine Technik besteht darin, eine Liste der Substantive aus unserer Beschreibung zu erstellen und dann die Liste auf die für das Problem relevanten zu verfeinern. In unserem Problem haben wir die folgenden Substantive erwähnt:
Die Anwendung ist ein irrelevantes Substantiv und kann daher verworfen werden. Wir können den Buchladen auch loswerden, weil er der Anwendung ähnelt. Wenn wir mit mehreren Buchhandlungen etwas anfangen müssten, könnten wir es behalten. Wir haben nur noch Bücher, Rezensionen und Autoren. (Autoren wurden pluralisiert, da wir in dieser Anwendung mehrere Autoren haben werden.)
Nun schauen wir uns an, wie wir jede Klasse gestalten werden. Eine Klasse ist ein Bauplan zum Erstellen von Objekten. Die von uns erstellte Buchklasse gibt uns einen Plan für die Erstellung von Buchobjekten.
Ähnlich wie ein Architekt einen Bauplan verwendet, um Häuser zu erstellen. Der Entwurf zeigt die Schlafzimmer, Badezimmer, die Küche und das Wohnzimmer. Mit diesem Bauplan können viele Häuser gebaut werden. Sie müssen jedoch nicht alle gleich sein. Jedes Haus kann z. B. durch Änderung der Farbe, des Fußbodens oder der Einrichtung individuell gestaltet werden.
Schreiben Sie die Klassen, die Sie für ein Einkaufswagenprogramm verwenden würden. Der Einkaufswagen sollte Folgendes tun können:
Um unsere Buchklasse zu gestalten, müssen wir uns überlegen, wofür die Klasse verantwortlich ist und was sie tun soll. Für ein Buch müssen wir den Titel, den Autor und die ISBN kennen. Dies sind unsere Datenattribute.
Einige Dinge, die die Klasse tun muss, müssen den Titel abrufen und festlegen, den Autor abrufen und festlegen und die ISBN abrufen und festlegen. Dies sind die Methoden der Klasse. So sollte unsere Buchklasse angesichts unserer Anforderungen aussehen:
class Book Konstruktor (Titel, Autor, isbn) this.title = title; this.author = Autor; this.isbn = isbn; getTitle () return this.title; setTitle (newTitle) this.title = newTitle; getAuthor () return this.author; setAuthor (newAuthor) this.author = newAuthor; getIsbn () return this.isbn; setIsbn (newIsbn) this.isbn = newIsbn;
Standardmäßig wird der Klassenname groß geschrieben. Der Konstruktor ist eine spezielle Funktion, die die Datenattribute deklariert und initialisiert. Innerhalb der Konstruktorfunktion werden Attribute mithilfe von hinzugefügt diese
Stichwort. Als Nächstes werden alle Methoden der Klasse ohne Trennzeichen aufgelistet.
Methoden, die mit beginnen erhalten
werden als Zugriffsmethoden bezeichnet, da sie einen Wert zurückgeben. Methoden, die mit beginnen einstellen
sind Mutator-Methoden, weil sie einen Wert speichern oder den Wert eines Attributs ändern.
Dies ist das allgemeine Formular zur Definition einer Klasse:
class ClassName Konstruktor (… args) this.attr = arg1; this.attr2 = arg2;… methodOne () … methodTwo () …
Eine Klasse kann auch mit dieser Syntax deklariert werden:
const ClassName = Klasse …
Klassen können auch statische Methoden haben. Eine statische Methode ist eine Methode, die eine Eigenschaft der Klasse ist, nicht das Objekt. Angenommen, wir möchten eine statische Methode für unsere Buchklasse erstellen, um IDs zu generieren. Dies ist die Syntax:
class Book constructor () … statische generateId () …
So rufen Sie die Methode auf:
Book.generateId ();
Eine natürliche Frage wäre, wann und warum Sie eine statische Methode verwenden würden. Ich kann nicht sagen, dass ich einen guten Grund für statische Methoden kenne. Es hängt davon ab, wie Sie Ihre Klasse gestalten. Eine statische Methode könnte als Hilfsmethode für Ihre Objekte verwendet werden, aber dann könnten solche Funktionen in ihrer eigenen Klasse gespeichert werden. Wenn Sie einen guten Anwendungsfall kennen, lassen Sie Ihre Gedanken in den Kommentaren.
Schließlich sollten Sie für die Organisation eine Klasse als Modul speichern. Ein Modul ist nur eine Datei, die Ihren Code enthält. Um aus unserer Buchklasse ein Modul zu machen, fügen wir ein Export
Aussage vor ihm.
Exportklasse Buch …
Um die Book-Klasse in einer anderen Datei zu verwenden, importieren wir sie.
Buch aus Buch importieren
Bei dem die enthält die Werte, die aus dem Modul exportiert wurden, und
aus Buch
ist ein Verweis auf die Datei Book.js.
Definieren Sie eine Klasse für Autoren und Rezensionen.
Die Klasse an sich ist für uns nutzlos, wenn wir nicht etwas damit anfangen. Wir wollen Bücher erstellen. Dazu müssen wir die Klasse instanziieren. Instantiate ist der Fachbegriff für das Erstellen neuer Objekte. Das Objekt, das aus der Klasse erstellt wird, nennen wir eine Instanz. So erstellen wir eine neue Instanz eines Buches:
let book = neues Buch ("Great Expectations", "Charles Dickens", 1234); book.getTitle () // Große Erwartungen
Objekte müssen mit der Instanz instanziiert werden Neu
Operator. Die in das Objekt übergebenen Daten sind die Parameter, die wir in unserem Konstruktor definiert haben. Dies ist die allgemeine Form zum Instanziieren einer Klasse:
Variablenname = neuer Klassenname (… Argumente);
Angenommen, wir möchten unserer Buchklasse Attribute hinzufügen, wie ID, Preis und Anzahl im Bestand. Wir haben jetzt sechs Parameter in unserem Konstruktor, und das ist nicht schön. Es ist nicht nur schlecht anzusehen. Für Entwickler, die die Klasse verwenden, ist dies ein zusätzlicher Aufwand, da sie die Reihenfolge der Argumente kennen müssen. Eine bessere Lösung ist, ein Objekt als Argument zu übergeben. Beispiel:
class Book Konstruktor (Daten) this.id = data.id; this.title = data.title; this.author = data.author; this.isbn = data.isbn; this.units = data.units; this.price = data.price; getTitle () return this.title; …
So instanziieren Sie das Objekt:
let data = id: 1, Titel: "Great Expectations", Autor: "Charles Dickens", isbn: 1234, Einheiten: 10, Preis: 29,95 let book = neues Buch (Daten);
In unserem Beispiel hätten wir auch mit der Anweisung auf den Titel zugreifen können Buchtitel
weil alle Attribute in der Klasse öffentlich sind. Nun fragen Sie sich vielleicht, warum ich all diese Methoden erstellt habe, wenn wir direkt auf die Attribute zugreifen können. War es nur um Ihnen die Syntax zu zeigen? Ja. Ich möchte auch die Vorteile zeigen, wenn Sie Ihren Code auf diese Weise organisieren.
Das Zusammenfassen von verwandtem Code in ein Objekt wird als Einkapselung bezeichnet. Ein Vorteil der Kapselung ist das Verstecken von Daten. Das Ausblenden von Daten bedeutet, dass auf die Attribute eines Objekts nicht außerhalb der Klasse zugegriffen werden kann.
In anderen Sprachen wie Java und Python können private Attribute und private Methoden verwendet werden. Da alle unsere Daten in einer JavaScript-Klasse standardmäßig öffentlich sind, können wir diese Funktion nicht nutzen. Trotzdem sollten wir über Getter und Setter auf unsere Daten zugreifen. Eine Konvention besteht darin, einem Attribut einen Unterstrich voranzustellen _
um zu signalisieren, dass es privat ist.
Erstellen Sie ein Buchobjekt, das ein Autorenobjekt verwendet, um das Autorenattribut festzulegen.
Wir haben gelernt, dass eine Klasse ein Bauplan zum Erstellen von Objekten ist und ein Objekt eine Instanz einer Klasse ist. Der Vorteil des Einbaus von Software in Objekte besteht darin, dass sie eine Programmstruktur bereitstellt und sie leichter handhabbar macht.
Wenn wir ein umfangreiches Programm haben, können wir die Teile unabhängig von anderen Teilen entwickeln und warten. Mit dieser Modularität ist die Wiederverwendbarkeit verbunden. Da unser Code gekapselt ist, können die Objekte in anderen Programmteilen immer wieder verwendet werden. Außerdem haben wir eine Codeeinheit, die überprüfbar ist. Je besser unser Code getestet wird, desto sicherer ist er vor Fehlern.