Die Richtung von Java in "C ++ Design and Evolution"

Vorwort

Es scheint, dass es viele Leute gibt, die sagen, dass Java alt und vom Standpunkt der "Imadoki" -Sprache nicht cool ist. Andererseits ist meine Behauptung [^ 1] von Heisei, dass "Nein, Java strebt in erster Linie ein großartiges Medium an, also ist das in Ordnung", C ++ - Design. Und Evolution “ist die Basis für lose Poesie.

[^ 1]: Ich denke nur

Warum "C ++ Design and Evolution"?

Es versteht sich von selbst, dass Java von C ++ beeinflusst wird. Und natürlich hat Java einige Möglichkeiten von C ++ und einige nicht. Wenn wir "C ++ Design and Evolution" lesen, das in seinen eigenen Worten erzählt, wie Strausstrap C ++ hergestellt hat, können wir auch sehen, wie Java den aktuellen Pfad gewählt hat. Überlegen. Abgesehen davon sollte "Design and Evolution of C ++" von jedem Programmierer gelesen werden, der Programmiersprachen liebt, nachdem er die Bewusstseinsbarriere überwunden hat, dass "jede Sprache sich bewegen kann", unabhängig davon, ob C ++ ausgeführt werden kann. Ich denke, es ist ein gutes Buch.

Das Problem ist, dass neue Produkte nicht mehr verfügbar sind. Beim Schreiben dieses Artikels habe ich ihn zum ersten Mal seit einiger Zeit aus der Bibliothek ausgeliehen und gelesen ...

Die Richtung von Java in "C ++ Design and Evolution"

Sofern nicht anders angegeben, stammen die folgenden Anführungszeichen aus "C ++ Design and Evolution".

Klassen und Schnittstellen

Wie Sie alle wissen, verfügt Java über Klassen, abstrakte Klassen und Schnittstellen, aber ich bin sicher, dass einige von Ihnen sich Sorgen über die Verwendung der einzelnen Klassen machen, insbesondere über abstrakte Klassen und Schnittstellen.

Funktionsdefinitionen werden normalerweise "außerhalb" (außerhalb der Klassendeklaration) angegeben. Das heißt, die Klassendeklaration (...) ist rein wie eine Schnittstellenspezifikation.

In Java ist dies Klasse und Schnittstelle, nicht wahr? Man kann sagen, dass die Schnittstelle nur so vorbereitet wurde, dass sie den Spezifikationen der Schnittstelle entspricht.

C ++ - Benutzern wurde nicht korrekt erklärt, dass abgeleitete Klassen verwendet werden, um die Schnittstelle von der Implementierung zu trennen. Ich habe versucht, es zu erklären, aber es schien nicht den Zweck zu vermitteln. Vielleicht liegt der Hauptgrund für diesen Fehler darin, dass sich viele (die meisten?) C ++ - Programmierer und andere an C ++ interessierte Programmierer in Klassendeklarationen ausdrücken, die Schnittstellen angeben - eine der Implementierungen von Objekten. Ich hätte nie gedacht, dass ich einen Club schreiben könnte und dass ich das tun müsste. Wenn can als Muss missverstanden wird und der Ausdruck "immer" (Implementierung) in der Klassendeklaration geschrieben ist, verschwinden die Vorteile der abgeleiteten Klasse, die ich zu erklären versuchte. Natürlich.

Ja, Sie können die Implementierung auch in die Schnittstelle schreiben. Dies ist eine abstrakte Klasse.

Ich bin nicht sicher, ob das Java-Klassensystem tatsächlich in Übereinstimmung mit der Idee von Strawstrap entworfen wurde, aber wenn ja, wäre es besser, mit Schnittstelle zu entwerfen und mit Klasse, abstrakte Klasse zu implementieren. Ich denke, es ist möglich zu glauben, dass es keinen besonderen Bedarf gab. Java scheint sich jedoch dafür entschieden zu haben, den Teil, den C ++ als Ergebnis hatte, als abstrakte Klasse zu verwenden. "Der Ausdruck - ein Teil der Implementierung des Objekts - kann in die Klassendeklaration geschrieben werden, die die Schnittstelle angibt." Scheint zu sein. Ich denke, es gab eine Option, keine abstrakte Klasse zu haben, aber Java hat es gewagt.

Warum C ++ auf C basiert

Es gibt mehrere Gründe, warum wir keinen großen Unterschied zu C gemacht haben. Die Integration der Eignung von C für die Systemprogrammierung in die Fähigkeit von Simula, Programme zu organisieren, war eine große Herausforderung. Das Hinzufügen wichtiger Funktionen anderer Sprachen nacheinander hätte sich in eine "Einkaufslisten" -Sprache verwandelt und eine nicht fokussierte Sprache erzeugt.

Wenn wir die implementierten Technologien von C und Simula von Anfang an ignoriert hätten, hätte die Reife von C mit Klassen und C ++ länger gedauert.

Ich denke, dies sind wahrscheinlich Geschichten zur Sprachimplementierung, aber selbst in Bezug auf Sprachspezifikationen wäre es für die Verbreitung von großer Bedeutung gewesen, nicht zu ändern, was bereits vorhanden ist.

Syntax

Die C-Syntax, die ich am meisten hasse, ist die Deklarationssyntax. Viele Menschen sind verwirrt, weil es sowohl Präfix- als auch Suffixoperatoren für die Deklaration gibt.

Die negative Reaktion der Benutzer auf diesen Teil der Änderung war sehr stark.

Auch in Java zum Beispiel die Deklaration eines Arrays

String[] values = null;

Obwohl diese Notation empfohlen wird

String values[] = null;

Es ist in Ordnung, der Variablen [] hinzuzufügen Was, wenn

//Auch ohne Leerzeichen
String[]values = null;
//Auch wenn es am Anfang der Variablen bleibt
String []values = null;
//Auch wenn es unheimlich ist
String   []   values = null;
//Auch wenn Sie eine Linie brechen
String values





[] = null;

All dies wird ebenfalls akzeptiert. Ich bin mir wieder sicher, dass es die Wahl gab, nur die erste Notation zuzulassen, Java jedoch nicht. Java hat sich auch dafür entschieden, keine Syntaxänderungen vorzunehmen, die Straustrap in C ++ nicht durchführen konnte.

Nachwort

Außerdem, warum gibt es einen primitiven Typ und er ist nicht so rein wie OOPL? Ich bin sicher, dass es viele Teile gibt, die mich dazu bringen, etwas zu sagen, aber ich bin sicher, dass Java alles weiß und es auswählt. Für immer und ewig stumpf und gemäßigt bleiben.

Ich liebe Java so.

Recommended Posts

Die Richtung von Java in "C ++ Design and Evolution"
Von Java nach C und von C nach Java in Android Studio
Reproduzieren Sie die Java-Enumeration in C #
C # und Java überschreiben Story
Lösen mit Ruby, Perl und Java AtCoder ABC 113 C Referenz
Lesen Sie die Java-Eigenschaftendatei in C #
Beispiel für Codierung und Decodierung in Java
CGI in C und Dart: Einführung (1)
StringBuffer- und StringBuilder-Klasse in Java
Verstehe gleich und hashCode in Java
Mit Java verschlüsseln und mit C # entschlüsseln
Hallo Welt in Java und Gradle
AtCoder ARC 081 C-Hash, der in Ruby, Perl und Java gelöst werden muss
Unterschied zwischen final und Immutable in Java
Verknüpfen Sie Java- und C ++ - Code mit SWIG
Programmieren Sie PDF-Kopf- und Fußzeilen in Java
Lesen und Schreiben von GZIP-Dateien in Java
Unterschied zwischen int und Integer in Java
Diskriminierung von Enum in Java 7 und höher
AtCoder ABC 111 C Hash-Sortierung In Ruby, Perl und Java gelöst
In Bezug auf transiente Modifikatoren und Serialisierung in Java
Erkennen Sie ähnliche Videos in Java und OpenCV Version 2
Partisierung in Java
Java-Entwurfsmuster
Unterschied zwischen next () und nextLine () in Java Scanner
Änderungen in Java 11
Janken in Java
Java-Entwurfsmuster
Erkennen Sie ähnliche Videos in Java und OpenCV Version 3
Hinzufügen, Lesen und Löschen von Excel-Kommentaren mit Java
Überprüfen Sie das statische und öffentliche Verhalten in Java-Methoden
[Java] Verstehe in 10 Minuten! Assoziatives Array und HashMap
Fassen Sie die Unterschiede zwischen C # - und Java-Schrift zusammen
Java und JavaScript
XXE und Java
Java- und Swift-Vergleich (3) Klassenimplementierung / Klassenvererbung / Klassendesign
Unterscheiden Sie in Java zwischen positiven und negativen Zahlen
Java fügt Wasserzeichen in Word-Dokumenten hinzu und entfernt sie
Erkennen Sie ähnliche Videos in Java und OpenCV Version 1
Umfangsrate in Java
Repräsentiert "nächster Tag" und "vorheriger Tag" in Java / Android
Fragen in Java-Ausnahmebehandlung werfen und versuchen-fangen
Laden Sie Notizen in Java auf S3 hoch und laden Sie sie herunter
Analysieren Sie die Datums- und Zeitzeichenfolge, die von der asctime-Funktion der C-Sprache in Java formatiert wurde
Verschlüsseln / Entschlüsseln mit AES256 in PHP und Java
Generieren Sie OffsetDateTime aus Clock und LocalDateTime in Java
FizzBuzz in Java
Konvertieren Sie JSON und YAML in Java (mit Jackson und SnakeYAML)
Versuchte Mastodons Toot- und Streaming-API in Java
Schreiben Sie ABNF in Java und geben Sie die E-Mail-Adresse weiter
Lösen mit Ruby, Perl und Java AtCoder ABC 128 C.
Vektorisieren und bildgeben Sie handgeschriebene numerische MNIST-Bilddaten mit Java
[Java] Unterschied zwischen statischem final und final in Mitgliedsvariablen
In der Abbildung verstandene Java-Klassen und -Instanzen
Java-Join- und Split-Tabellenzellen im Word-Dokument
Dies und das zum Bearbeiten von ini in Java. : inieditor-java
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
Subtrahieren Sie Enum-Konstanten von Zeichenfolgen und Werten in Java zurück