Ich verstehe das Konzept eines Objekts und als Java-Programmierer habe ich das Gefühl, dass das OO-Paradigma in der Praxis für mich ganz natürlich ist.
Vor kurzem dachte ich jedoch:
Moment mal, was sind die praktischen Vorteile der Verwendung eines Objekts gegenüber der Verwendung einer statischen Klasse (mit ordnungsgemäßer Kapselung und OO-Praktiken)?
Ich könnte mir zwei Vorteile der Verwendung eines Objekts vorstellen (beide sind bedeutsam und leistungsstark):
Polymorphismus: Ermöglicht den dynamischen und flexiblen Austausch von Funktionen zur Laufzeit. Ermöglicht auch das einfache Hinzufügen neuer Funktionsteile und Alternativen zum System. Wenn beispielsweise eine
Car
Klasse für die Arbeit mitEngine
Objekten entwickelt wurde und Sie dem System, das das Auto verwenden kann, eine neue Engine hinzufügen möchten, können Sie eine neueEngine
Unterklasse erstellen und einfach ein Objekt dieser Klasse an dasCar
Objekt übergeben, ohne dies zu müssen etwas ändernCar
. Und Sie können sich zur Laufzeit dafür entscheiden.In der Lage sein, Funktionen weiterzugeben: Sie können ein Objekt dynamisch im System weitergeben.
Aber gibt es weitere Vorteile für Objekte gegenüber statischen Klassen?
Wenn ich einem System neue 'Teile' hinzufüge, erstelle ich häufig eine neue Klasse und instanziiere Objekte daraus.
Aber als ich kürzlich innehielt und darüber nachdachte, wurde mir klar, dass eine statische Klasse an vielen Stellen, an denen ich normalerweise ein Objekt verwende, genauso funktioniert wie ein Objekt.
Zum Beispiel arbeite ich daran, meiner App einen Mechanismus zum Speichern / Laden von Dateien hinzuzufügen.
Bei einem Objekt sieht die aufrufende Codezeile folgendermaßen aus: Thing thing = fileLoader.load(file);
Mit einer statischen Klasse würde es so aussehen: Thing thing = FileLoader.load(file);
Was ist der Unterschied?
Ziemlich oft fällt mir einfach kein Grund ein, ein Objekt zu instanziieren, wenn eine einfache alte statische Klasse genauso handeln würde. In OO-Systemen sind statische Klassen jedoch ziemlich selten. Also muss mir etwas fehlen.
Gibt es weitere Vorteile für andere Objekte als die beiden, die ich aufgelistet habe? Bitte erkläre.
EDIT: Zur Verdeutlichung. Ich finde Objekte sehr nützlich, wenn ich Funktionen austausche oder Daten weitergebe. Zum Beispiel habe ich eine App geschrieben, die Melodien enthält. MelodyGenerator
hatte mehrere Unterklassen, die Melodien unterschiedlich erzeugen, und Objekte dieser Klassen waren austauschbar (Strategiemuster).
Die Melodien waren auch Objekte, da es nützlich ist, sie weiterzugeben. So waren die Akkorde und Skalen.
Aber was ist mit "statischen" Teilen des Systems - die nicht weitergegeben werden? Zum Beispiel - ein Mechanismus zum Speichern von Dateien. Warum sollte ich es in einem Objekt implementieren und nicht in einer statischen Klasse?
FileLoader
gegen eine austauschen müssen, die aus einem Socket liest? Oder ein Mock zum Testen? Oder eine, die eine Zip-Datei öffnet?
System.Math
in .NET ist ein Beispiel für etwas, das als statische Klasse viel sinnvoller ist: Sie müssen es nie austauschen oder verspotten, und keiner der Vorgänge kann logischerweise Teil einer Instanz sein. Ich glaube wirklich nicht, dass Ihr "Spar" -Beispiel zu dieser Rechnung passt.
Thing
?