Hat Dart nützliche Funktionen für Webprogrammierer?


33

http://www.dartlang.org/

Ich habe die Seite sehr kurz durchgesehen und bin neugierig geworden. Gibt es irgendwelche Vorteile bei der Verwendung von Dart? Ist es nur ein Ersatz für JavaScript?

Es sieht aus wie einfacher Java. Da die Sprache bei der Arbeit ziemlich viel C # schreibt, fühlt sie sich sehr ähnlich an, wie ich es gewohnt bin, sodass das Erlernen der Syntax ein Kinderspiel ist. Hat jemand irgendwelche Meinungen oder Erfahrungen mit der Sprache?

(Im Vergleich zu CoffeeScript (= ich mache keine Ruby-Syntax) kommt mir die Syntax besser bekannt vor).


18
Doug Crockfords Kommentar ist amüsant: "Also, ich habe lange nachgedacht ... wenn ich ein sauberes Blatt Papier nehmen und eine neue Sprache schreiben könnte, die die Güte von Javascript bewahrt ... wäre ich nicht aufgetaucht mit so etwas wie Dart. "
MebAlone

2
@MebAlone Ho-ho-ho, wie aufschlussreich. Was für ein Witz, dass Crockford ist. Weisheitsrisse über Weisheit.
Funkybro

11
@MebAlone Die Dart-Sprachdesigner haben nicht versucht , eine neue Sprache zu entwickeln, die alle Vorteile von JavaScript bewahrt . Sie versuchten, eine klassenbasierte, objektorientierte Sprache für den Browser zu entwickeln.
MarkJ

1
Was Is there any advantages of using Dart?bedeutet Vorteil gegenüber was und wie gemessen ? Es gibt eine Reihe von Sprachen, die mit JavaScript kompiliert werden können. Die meisten von ihnen machen etwas viel besser als Dart. Einige machen die meisten Dinge besser als Dart. Wenn Sie beispielsweise C # ausführen, könnte ScriptSharp für Sie interessant sein. Unter all den Sprachen, die sich mit JavaScript kompilieren lassen, wäre dies bei weitem nicht meine erste Wahl, aber für Sie wäre es ein sehr einfacher Übergang, der möglicherweise sogar die problemlose Portierung von vorhandenem Code ermöglicht.
back2dos

1
@MebAlone Douglas ist ein bisschen in Konflikt. Beschwerdeführende Entwickler akzeptieren keine neuen Ideen, sagen aber, dass Dart 2012 schlecht ist, wenn es erst vor zwei Tagen veröffentlicht wurde. Sie haben angekündigt, dass es vor 2 Jahren kommen würde. Da sich Dart mit einigen Dingen befasst, mit denen Douglas in JS unzufrieden ist (kein Konstruktor funktioniert mit "lose hängenden" Prototypen). Während er die Dinge behält, die er mag (wie Verschlüsse). In mehreren Präsentationen habe ich gesehen, wie er Prototypen lobte und dann die Syntax von Konstruktorfunktionen kritisierte (er hat Recht). Dann "löst" es ein Modulmuster, das die Existenz eines Prototyps völlig ignoriert.
HMR

Antworten:


65

Danke für deine Frage! Voller Haftungsausschluss, ich arbeite im Dart-Team.

Der wahrscheinlich beste Vorteil, den Dart heute hat, ist, dass er C # -, Java-, C ++ - und den meisten JavaScript-Entwicklern vertraut ist. Viele Entwickler haben eine Reihe von Erwartungen an ihre Sprache (klassenbasiertes OO, lexikalischer Bereich, vertraute Syntax) und ihre Tools (Code-Vervollständigung, Refactoring, Code-Navigation, Debugging), die Dart erfüllen und übertreffen möchte.

Hier sind einige Dinge, die mir an der Sprache gefallen:

  1. Optionale statische Typen. Wenn ich Prototypen erstelle oder nur kleine Skripte schreibe, verwende ich nicht viele statische Typen. Ich brauche sie einfach nicht und ich möchte mich nicht mit der Zeremonie festsetzen. Einige dieser Skripte entwickeln sich jedoch zu größeren Programmen. Da die Skripte skaliert werden, möchte ich eher Klassen und statische Typanmerkungen.

  2. Unschuldig bis zum Beweis der Schuld. Dart ist bemüht, die Situationen zu minimieren, die zu einem Fehler beim Kompilieren führen. Viele Bedingungen in Dart sind Warnungen, die Ihr Programm nicht daran hindern, ausgeführt zu werden. Warum? Im Einklang mit der Mode der Webentwicklung ist es unerlässlich, den Entwicklern die Möglichkeit zu geben, ein wenig Code auszuprobieren, erneut zu laden und zu sehen, was passiert. Der Entwickler sollte nicht erst nachweisen müssen, dass das gesamte Programm korrekt ist, bevor er nur eine Ecke des Codes testet.

  3. Lexikalischer Umfang. Das ist großartig, wenn Sie nicht daran gewöhnt sind. Einfach ausgedrückt, wird die Sichtbarkeit von Variablen und sogar diese durch die Programmstruktur definiert. Dies eliminiert eine Klasse von Rätseln in der traditionellen Webprogrammierung. Es ist nicht erforderlich, Funktionen neu zu binden, um dies an das zu halten , was Sie denken oder erwarten.

  4. Echte Klassen, die in die Sprache eingebrannt sind. Es ist klar, dass die meisten Entwickler in Klassen arbeiten möchten, da die meisten Webentwicklungs-Frameworks eine Lösung bieten. Eine "Klasse" aus Framework A ist jedoch in der herkömmlichen Webentwicklung nicht mit Framework B kompatibel. Dart verwendet natürlich Klassen.

  5. Funktionen auf oberster Ebene. Ein schmerzlicher Teil von Java ist, dass alles in eine Klasse eingeteilt werden muss. Dies ist etwas künstlich, insbesondere wenn Sie einige Dienstprogrammfunktionen definieren möchten. In Dart können Sie Funktionen auf oberster Ebene außerhalb jeder Klasse definieren. Dadurch fühlt sich die Bibliothekszusammensetzung natürlicher an.

  6. Klassen haben implizite Schnittstellen. Der Wegfall expliziter Schnittstellen vereinfacht die Sprache. IDuck muss nicht mehr überall definiert werden. Jetzt brauchen Sie nur noch eine Klasse Duck. Da jede Klasse eine implizite Schnittstelle hat, können Sie eine erstellenMockDuck implements Duck

  7. Benannte Konstruktoren. Sie können Konstruktornamen vergeben, was die Lesbarkeit erheblich verbessert. Beispielsweise:var duck = new Duck.fromJson(someJsonString)

  8. Fabrikbauer. Das Fabrikmuster ist ziemlich verbreitet und es ist schön zu sehen, dass es in die Sprache eingebrannt ist. Ein Factory-Konstruktor kann einen Singleton, ein Objekt aus einem Cache oder ein Objekt eines Untertyps zurückgeben.

  9. Isolate. Vorbei sind die Zeiten, in denen sich Threads den veränderlichen Status teilen (eine fehleranfällige Technik). Ein Dart-Isolat ist ein isolierter Speicherheap, der in einem separaten Prozess oder Thread ausgeführt werden kann. Isolate kommunizieren, indem sie Nachrichten über Ports senden. Isolate arbeiten in der Dart VM und können in HTML5-Apps für Web-Worker kompiliert werden.

  10. Dart kompiliert zu JavaScript. Dies ist von entscheidender Bedeutung, da JavaScript die Verkehrssprache des Webs ist. Dart-Apps sollten im modernen Web laufen.

  11. Starkes Werkzeug. Das Dart-Projekt enthält auch einen Editor. Hier finden Sie Code-Vervollständigung, Refactoring, Schnellkorrekturen, Code-Navigation, Debugging und mehr. Außerdem hat IntelliJ ein Dart-Plugin.

  12. Bibliotheken. Sie können Dart-Code in Bibliotheken organisieren, um den Namensraum und die Wiederverwendbarkeit zu vereinfachen. Ihr Code kann eine Bibliothek importieren und Bibliotheken können erneut exportiert werden.

  13. String-Interpolation. Dies ist nur eine nette Funktion, die es einfach macht, eine Zeichenfolge zu erstellen:var msg = "Hello $friend!";

  14. noSuchMethod Dart ist eine dynamische Sprache, mit der Sie beliebige Methodenaufrufe bearbeiten können noSuchMethod().

  15. Generika. Wenn Sie "Dies ist eine Liste von Äpfeln" sagen können, erhalten Ihre Werkzeuge viel mehr Informationen, um Ihnen zu helfen und mögliche Fehler frühzeitig zu erkennen. Zum Glück sind Darts Generika einfacher als das, was Sie wahrscheinlich gewohnt sind.

  16. Bedienerüberladung. Dartklassen können Verhalten für Operatoren wie +oder definieren -. Zum Beispiel könnten Sie Code wie schreiben new Point(1,1) + new Point(2,2).

Abgesehen davon gibt es noch viel mehr JavaScript-Bibliotheken.

Persönlich glaube ich, dass im Web Platz für viele Sprachen ist. Wenn die App fantastisch ist und in den meisten modernen Browsern ausgeführt wird, ist es mir egal, in welcher Sprache sie geschrieben ist. Solange Sie, der Entwickler, glücklich sind, produktiv arbeiten und im Web starten, ist das alles Worauf es ankommt! :)


Viele moderne Programmiersprachen (Ruby, Scala, Python) enthalten eine Art Mehrfachvererbungsmechanismus, der in JDK8 enthalten ist. Ist das für Dart geplant?
MebAlone

4
+1 zu Punkt 1 - Dynamische Eingabe ist für kleine Skripte (dh "Formularvalidierungs" -Stufe) völlig ausreichend. Alles, was darüber hinausgeht, und ich finde das Sicherheitsnetz des statischen Tippens unverzichtbar.
Funkybro

2
@MebAlone Ich gehe davon aus, dass in naher Zukunft Mixins zu Dart kommen werden.
Seth Ladd

Überraschtes Schnappschießen wurde nicht erwähnt - IMO ist eines der besten Features von Dart.
Mythos

@mythz Snapshots habe ich nicht erwähnt, da sie noch nicht vollständig implementiert sind. Aber ja, sie sind cool!
Seth Ladd

11

Die Sprache fühlt sich sehr ähnlich an, wie ich es gewohnt bin, wenn ich ziemlich viel C # bei der Arbeit schreibe

Das ist ein Punkt bei Dart. Javascript wird als unangenehme Sprache mit wenigen allgemeinen Redewendungen angesehen. In einer Sprache wie Java gibt es oft einen natürlichen Weg, um ein Problem anzugehen. Wenn Sie beispielsweise ein Inventar der Tabelle führen, erstellen Sie in Java oder C # eine Klassentabelle.

Javascript hat keine Klassen, vielleicht möchten Sie Prototypen verwenden, aber sie fühlen sich umständlich an und bieten keine so starken Struktur- und Kapselungswerkzeuge. (Zumindest nicht ohne Stunts.) Vererbung, Komposition usw. sind mit Javascript-Prototypen umständlich. Aus diesem Grund verwenden die meisten Menschen einfache Hash-Maps, um Daten zu speichern. Oder sie verwenden Bibliotheken von Drittanbietern wie Prototypen, die Ihnen eine klassenähnliche Erfahrung bieten.

Bequemlichkeit ist also eine Sache, Struktur die andere. Javascript lässt sich einfach nicht gut skalieren, da es keine Standardmethode zum Strukturieren umfangreicher Apps gibt. Derzeit werden solche Drittanbieter-Bibliotheken jedoch immer beliebter. (Wie backbone.js)

Dart ist etwas, um das zu lösen. Es ist dazu da, Ihnen die strukturelle Bequemlichkeit von Java zu bieten, und darüber hinaus verfügt es nicht über all diese umständlichen JS-Funktionen. (Die meisten davon betrafen schwaches Tippen.)

Die Antwort lautet also ja: Klassen, Vererbung, ...: "traditionelles OOP". (Die meisten realen JS-Webanwendungen verwenden den Callback-basierten Ansatz von jQuery als Hauptstruktur.) Und es gibt eine lose Form der statischen Typisierung, dies ist jedoch nicht das Hauptverkaufsargument.

Übrigens: Vielleicht möchten Sie dieses "interne" Google-Mailing vom 2010: Future of Javascript lesen

Javascript weist grundlegende Mängel auf, die nicht allein durch die Weiterentwicklung der Sprache behoben werden können. Wir werden eine zweigleisige Strategie für die Zukunft von Javascript verfolgen ... Entwickeln Sie eine neue Sprache (Dash) mit dem Ziel, die Dynamik von Javascript beizubehalten, aber ein besseres Leistungsprofil zu haben und Tools für große Projekte zur Verfügung zu stellen. .


5
Nicht jeder hält Javascript für eine "umständliche Sprache". Es gibt oft einen natürlichen Weg, um ein Problem anzugehen. Allzu oft sind Techniken (funktionale Programmierung, Überladung von Operatoren, Mixins, generische Programmierung) erforderlich, die von Java nicht unterstützt werden. Vererbung, Komposition usw. sind bei Javascript-Prototypen nicht umständlich. Es unterscheidet sich nur von Java und C #, ähnelt jedoch Ruby, LUA und Perl.
Kevin Cline

1
Mmm ... zum ersten Mal höre ich etwas Gutes über Prototypen. Aber wie sehen Sie JS-Prototypen, die Ruby ähneln?
Philip

1
Sie müssen (aus der Java-Welt) öfter raus. Schauen Sie sich die Ruby-Metaprogrammierung an ( ruby-doc.org/docs/ProgrammingRuby/html/ext_ruby.html ) und Sie werden sehen, dass die Namensauflösung für Ruby-Mitglieder der für Javascript-Mitglieder ähnelt (IMO jedoch komplizierter als).
Kevin Cline

jQuery fördert in keiner Form oder Form einen Callback-Ansatz mehr als die DOM-API (die es im Wesentlichen umschließt) oder den Kern, den JS selbst macht oder den Dart haben würde. Prototypen sind der Vererbungsmechanismus, mit dem wir Dinge tun können, die Klassen nicht können. Vergleichen Sie Klassen mit Funktionskonstruktoren, die interne Instanzvariablen und keine Prototypen einschließen. Nicht, dass Ihr Median-Talent-Bean / Getter-Setter, der Java oder C # dev spammt, die geringste Vorstellung davon hat, wofür die Kapselung gut ist, oder dass der durchschnittliche Google-Entwickler die geringste Vorstellung davon hat, wie JavaScript geschrieben wird.
Erik Reppen

@ErikReppen: Wenn Sie jQuery ausschließlich für die DOM-Manipulation verwenden, können Sie Code schreiben, der kaum Rückrufe benötigt, falls Sie ihn mit anderen Frameworks wie backbone.js kombinieren. Das Binden von Ereignissen mit jQuery fördert sehr (anonyme) Rückrufe. backbone.js hat meiner Meinung nach einen strukturierteren Ansatz.
Philip

5

Für mich gibt es die Möglichkeit, meinen Code mit Umfang und Klassen besser als JavaScript zu strukturieren.

Es ähnelt Java und JavaScript und mit dem Dart-Editor hatte ich fast keine Anpassung. Ich fing sofort an zu programmieren.

var ws = new [Moz]WebSocketEs ist ärgerlich, für verschiedene Browser sorgen zu müssen. Dart kompiliert zu JavaScript-Code, der mit gängigen Browsern kompatibel ist.

Meine Herausforderung besteht hauptsächlich in der Anbindung an JavaScript-Code. Ich finde irgendwie Wege, aber es wäre besser, wenn es Teil von Dart ist.


Einverstanden, @Abiola, braucht Dart besseres JavaScript-Interop. Es ist sehr auf dem Radar, ich freue mich darauf, was das Team einfallen lässt.
Seth Ladd

0

Der Java / C # -Ansatz ist definitiv voreingenommen, wenn es darum geht, JS seit Beginn von Web 2.0 auszuschalten. Dies liegt an einer künstlichen (oder sehr realen und notwendigen) Unterscheidung zwischen clientseitigen und serverseitigen Sprachen. Ich denke, dies ist so, dass die serverseitige Sprache die Kontrolle über die Kernproblembereiche von Web-Apps behalten und weniger schwerwiegenden Code (UI-Code) vom Geschäftscode (serverseitig) abgrenzen kann. Ich denke auch, dass Java gerne ein serverseitiger Kernel bleibt, da es den GUI-Krieg mit Applets hauptsächlich aufgrund von Flash und HTML 5 verloren hat. Jetzt haben Sie RedTamarin, ein NodeJS-ähnliches AS3-Projekt, das auf eine pluralistisch gemischte Zukunft von einheitlichen Front- und Backend-Paradigmen anspielt .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.