von Java zu Javascript: das Objektmodell

8

Ich versuche eine Anwendung, die ich in Java geschrieben habe, in Javascript zu portieren (eigentlich mit coffeescript).

Jetzt fühle ich mich verloren. Was schlagen Sie vor, um Klasseneigenschaften zu erstellen? Soll ich Getter / Setter verwenden? Ich mag das nicht:

%Vor%

, weil ich nicht existierende Eigenschaften verwenden könnte, und es wäre leicht, etwas zu mispellieren.

Wie kann ich Javascript ein bisschen mehr wie Java, mit privaten, öffentlichen Endeigenschaften usw. bekommen? Irgendwelche Vorschläge?

    
luca 23.08.2011, 07:47
quelle

8 Antworten

8

Wenn Sie Ihren Java-Code einfach in JavaScript übersetzen, werden Sie ständig gegen das Objektmodell von JavaScript ankämpfen, das prototypbasiert und nicht klassenbasiert ist. Es gibt keine privaten Eigenschaften für Objekte, keine endgültigen Eigenschaften, es sei denn, Sie verwenden eine ES5-kompatible -Engine (Sie haben nicht erwähnt, was Sie tun sollten ZIEL-Laufzeitumgebung ist; Browser verwenden ES5-kompatibel nicht, es wird noch ein paar Jahre dauern), überhaupt keine Klassen .

Stattdessen empfehle ich Ihnen, sich gründlich darüber zu informieren, wie die Objektorientierung tatsächlich in JavaScript funktioniert, und dann Ihre Anwendung so zu erstellen, dass sie vollständig versteht, wie JavaScript das tut. Das ist nicht trivial, aber lohnend.

Einige Artikel, die nützlich sein könnten. Ich beginne mit Schließungen, weil das Verständnis von Schließungen für das Schreiben von JavaScript absolut unerlässlich ist und die meisten "privaten Mitglieder" -Lösungen auf Schließungen angewiesen sind. Dann beziehe ich mich auf ein paar Artikel von Douglas Crockford. Crockford muss gelesen werden, wenn Sie in JavaScript arbeiten, selbst wenn Sie mit einigen seiner Schlussfolgerungen nicht einverstanden sind. Dann weise ich auf ein paar Artikel hin, die sich speziell mit klassenähnlichen Dingen beschäftigen.

Adressieren Sie einige Ihrer spezifischen Fragen:

  

Was schlagen Sie vor, um Klasseneigenschaften zu erstellen? Soll ich Getter / Setter verwenden? Ich mag das nicht:

     

myObj.prop = "hello"

     

, weil ich nicht existierende Eigenschaften verwenden könnte, und es wäre leicht, etwas zu mispellieren.

Ich tue es nicht, ich bevorzuge die Verwendung von TDD , um sicherzustellen, dass es, wenn ich einen Tippfehler habe, dazu kommt im Test aufgedeckt. (Ein guter Code-Completing-Editor wird auch hier hilfreich sein, obwohl wirklich gute JavaScript-Code-Completing-Editoren sind dünn vor Ort.) Aber Sie haben recht, dass Getter und Setter im Java-Sinne (Methoden wie getFoo und setFoo ) würde es offensichtlicher machen, wenn Sie eine Eigenschaft erstellen oder auf diese zugreifen, die Sie nicht im Voraus definiert haben (zB durch einen Tippfehler), indem Sie einen Laufzeitfehler verursachen , eine Funktion aufrufen, die nicht existiert. (Ich sage "im Java-Sinne", weil JavaScript ab ES5 eine andere Art von "Gettern" und "Setter" hat Das ist transparent und würde damit nicht helfen.) Das ist ein Argument dafür, sie zu benutzen. Wenn Sie dies tun, können Sie sich mithilfe des Closure-Compilers von Google für Release-Versionen umsehen, da diese inline eingebunden werden.

>
  

Wie kann ich Javascript ein bisschen mehr wie Java erhalten, mit privatem ...

Ich habe Crockfords Artikel über private Mitglieder verlinkt, und meinen eigenen, der andere Wege aufführt. Die grundlegende Erklärung des Crockford-Modells lautet: Sie verwenden eine Variable in dem Kontext, der durch den Aufruf Ihrer Konstruktorfunktion erstellt wird, und einer Funktion, die in diesem Kontext (einem Closure) erstellt wird und nicht auf eine Objekteigenschaft, sondern auf sie. p> %Vor%

bar ist keine Objekteigenschaft, aber die im Kontext definierten Funktionen haben einen dauerhaften Bezug darauf. Das ist völlig in Ordnung, wenn Sie eine kleinere Anzahl von Foo -Objekten haben. Wenn Sie Tausende von Foo -Objekten haben möchten, sollten Sie dies noch einmal überdenken, denn jedes Foo -Objekt hat seine eigenen zwei Funktionen (wirklich echt anders Function Instanzen) für Foo_getBar und Foo_setBar .

Sie sehen häufig das oben geschriebene so:

%Vor%

Ja, es ist kürzer, aber jetzt haben die Funktionen keine Namen, und wenn Sie Ihren Funktionen Namen geben, hilft Ihre Werkzeuge helfen Ihnen .

  

Wie kann ich Javascript ein bisschen mehr wie Java bekommen, mit ...öffentliche endgültige Eigenschaften

Sie können einen Java-Getter ohne Setter definieren. Oder wenn Ihre Zielumgebung ES5-konform ist (auch wenn die Browser noch nicht sind, wird es noch ein paar Jahre dauern), könnten Sie das neue Object.defineProperty Funktion, mit der Sie Eigenschaften festlegen können, die nicht beschrieben werden können.

Aber mein Hauptaugenmerk liegt darauf, die Sprache und Umgebung zu akzeptieren, in der Sie arbeiten. Lernen Sie es gut und Sie werden feststellen, dass andere Muster als in Java gelten. Beide sind großartige Sprachen (ich benutze sie beide sehr oft), aber sie arbeiten anders und führen zu verschiedenen Lösungen.

    
T.J. Crowder 23.08.2011, 08:04
quelle
3

Sie können Modulmuster verwenden, um private Eigenschaften und öffentliche Zugriffsmechanismen als eins zu definieren mehr Option.

    
pcjuzer 23.08.2011 08:02
quelle
2

Dies beantwortet nicht direkt Ihre Frage, aber ich würde die Idee aufgeben, die JavaScript-App wie Java zu machen. Sie sind wirklich verschiedene Sprachen (trotz einiger Ähnlichkeiten in der Syntax und in ihrem Namen). Als generelle Aussage macht es Sinn, die Idiome der Zielsprache beim Portieren zu übernehmen.

    
Willie Wheeler 23.08.2011 07:55
quelle
1

Derzeit gibt es viele Möglichkeiten für Sie, Sie können die Dojo-Bibliothek überprüfen. Im Dojo können Sie meist wie Java-Programmierung programmieren

  1. Klasse
    Javascript hat kein Klassensystem wie Java, dojo stellt dojo.declare zur Verfügung, um eine Funktionalität zu definieren, um dies zu simulieren. Überprüfen Sie diese Seite . Es gibt Feldvariable, Konstruktormethode, Erweiterung von anderer Klasse.
Ivan 23.08.2011 07:52
quelle
1

JavaScript hat ein Feature, dass Konstruktorfunktionen jedes Objekt zurückgeben können (nicht notwendig dies ). Ihre Konstruktorfunktion könnte also nur ein Proxy-Objekt zurückgeben, das nur Zugriff auf die öffentlichen Methoden Ihrer Klasse erlaubt. Mit dieser Methode können Sie ein real geschütztes Mitglied erstellen, genau wie in Java (mit Vererbung, super () - Aufruf, etc.)

Ich habe eine kleine Bibliothek erstellt, um diese Methode zu optimieren: Ссылка

    
slobo 26.11.2012 02:26
quelle
0

Dojo ist eine Option. Ich persönlich bevorzuge Prototype . Es hat auch ein Framework und eine API zum Erstellen von Klassen und zum Verwenden von Vererbung auf eine "java-ish" Weise. Sehen Sie sich die Methode Class.create in der API an. Ich habe es für mehrere Webapps verwendet, an denen ich gearbeitet habe.

    
pap 23.08.2011 08:01
quelle
0

Ich stimme hauptsächlich mit @Willie Wheeler überein, dass Sie nicht zu sehr versuchen sollten, Ihre App wie Java zu machen - es gibt Möglichkeiten, JavaScript zu verwenden, um Dinge wie private Mitglieder usw. zu erstellen - Douglas Crockford und andere haben über diese Art von Dingen geschrieben.

    
tinyd 23.08.2011 08:03
quelle
0

Ich bin der Autor des CoffeeScript-Buchs von PragProg. Im Moment benutze ich CoffeeScript als meine primäre Sprache; Ich habe während des CoffeeScript-Lernens fließend JavaScript gelernt. Aber vorher war meine beste Sprache Java.

Ich weiß also, was du durchmachst. Java verfügt über sehr gute Best Practices, die Ihnen eine klare Vorstellung davon geben, was guter Code ist: saubere Kapselung, feinkörnige Ausnahmen, gründliche JavaDocs und GOF-Entwurfsmuster überall. Wenn Sie zu JavaScript wechseln, geht das direkt aus dem Fenster. Es gibt wenige "Best Practices" und eher ein vages Gefühl von "das ist elegant". Wenn Sie anfangen, Bugs zu sehen, ist das unglaublich frustrierend - es gibt keine Fehler bei der Kompilierung und viel weniger, weniger präzise Laufzeitfehler. Es ist wie ohne Netz zu spielen. Und während CoffeeScript etwas syntaktischen Zucker hinzufügt, der Java-Programmierern (vor allem Klassen) bekannt vorkommt, ist es wirklich kein kleiner Sprung.

Hier ist mein Rat: Lernen Sie, guten KaffeeScript / JavaScript-Code zu schreiben. Der Versuch, es wie Java aussehen zu lassen, ist der Weg zum Wahnsinn (und glauben Sie mir, viele haben es versucht; siehe: JS-Code von Google). Guter JS-Code ist minimalistischer. Verwenden Sie nicht get / set Methoden; Verwenden Sie Ausnahmen sparsam; und verwende keine Klassen oder Designmuster für alles. JS ist letztlich eine ausdrucksstärkere Sprache als Java und CoffeeScript sogar noch mehr. Sobald Sie sich an das Gefühl der Gefahr gewöhnt haben, werden Sie es mögen.

Eine Anmerkung: JavaScripter sind im Großen und Ganzen schrecklich, wenn es um das Testen geht. Es gibt viele gute JS-Test-Frameworks, aber robuste Tests sind viel seltener als in der Java-Welt. In dieser Hinsicht gibt es etwas, das JavaScripters von Java-Programmierern lernen können. Die Verwendung von TDD wäre auch ein guter Weg, um Ihre Bedenken zu lindern, wie einfach es ist, Fehler zu machen, die sonst nicht erfasst würden, bis ein bestimmter Teil Ihrer Anwendung ausgeführt wird.

    
Trevor Burnham 23.08.2011 16:33
quelle

Tags und Links