Ich weiß, dass Javascript Enten-Typisierung verwendet, und zuerst dachte ich, dies würde den Polymorphismus im Vergleich zu stark typisierten Sprachen wie C # vereinfachen. Aber jetzt sind meine Funktionen, die Argumente annehmen, übersät mit Dingen wie:
if(myObj.hasSomeProperty())
oder
if(myObj.hasSomeMethod())
oder
if(isNumber(myParam))
etc.
Das ist wirklich hässlich für mich. Ich komme aus einem C # -Hintergrund und finde definierte Schnittstellen viel besser.
Ich frage mich, ob ich fälschlicherweise versuche, Strategien anzuwenden, die in statisch typisierten Sprachen wirksam sind, und ob es eine bessere Möglichkeit gibt, dies in Javascript zu tun.
Ich weiß, ich konnte es einfach nicht überprüfen, aber das Aufspüren von Javascript-Laufzeitfehlern kann ein Albtraum sein, da sie nicht immer dort auftreten, wo der Fehler tatsächlich im Code auftritt.
quelle
Antworten:
Einfach: Suchen Sie nicht immer nach Eigenschaften und Methoden.
In Ruby heißt das, was Sie nennen, "Chicken Typing". In einer dynamisch ententypisierten Sprache vertrauen Sie einfach darauf, dass der Anrufer Ihnen ein geeignetes Objekt übergibt. Es ist die Aufgabe des Anrufers, seine Vertragsseite einzuhalten.
Sie verwechseln hier mehrere orthogonale Tippachsen. Es gibt vier orthogonale Tippachsen:
Da Sie C # erwähnt haben: Es ist meistens statisch typisiert, unterstützt jedoch die dynamische Typisierung durch den Typ
dynamic
. Es ist meistens nominal typisiert, aber anonyme Typen verwenden strukturelle Typisierung, und syntaktische Muster (wie die Syntax des LINQ-Abfrageverständnisses) können als Enten bezeichnet werden -typed oder strukturell typisiert, wird meistens explizit typisiert, unterstützt jedoch die implizite Typisierung für generische Typargumente und lokale Variablen (obwohl der Fall lokaler Variablen im Vergleich zu den meisten anderen Sprachen ziemlich seltsam ist, da Sie den Typ nicht einfach weglassen können, sondern müssen Geben Sie ihm einen expliziten Pseudotypvar
Mit anderen Worten, wenn Sie einen impliziten Typ möchten, müssen Sie dies explizit sagen. Ob C # stark oder schwach typisiert ist oder nicht, hängt davon ab, welche Definition der beiden verwendeten Begriffe Sie verwenden. Beachten Sie jedoch, dass es in C # viele Laufzeitfehler geben kann, insbesondere aufgrund der unsicheren Array-Kovarianz.Das Debuggen ist nicht leicht zu erlernen. Es gibt jedoch Techniken, die das Debuggen vereinfachen, z. B. Saff Squeeze, eine von Kent Beck beschriebene Technik, bei der Tests und Refactoring zum Debuggen verwendet werden:
quelle
IComparer<T>.Compare(T, T)
nur aus der Dokumentation ersichtlich, nicht aus dem Typ. Und wo in der Artjava.util.Collections.binarySearch(java.util.List<T>)
steht, dass die…In der Tat ist die typische Praxis nicht zu überprüfen. Und ja, dies bedeutet, dass Sie Javascript-Fehler erhalten, die an anderer Stelle vom eigentlichen Problem gemeldet werden. In der Praxis ist dies jedoch kein großes Problem.
Wenn ich mit Javascript arbeite, teste ich ständig, was ich schreibe. In den meisten Codes habe ich Unit-Tests, die jedes Mal automatisch ausgeführt werden, wenn ich meinen Editor speichere. Wenn etwas unerwartet schief geht, weiß ich es fast sofort. Ich habe einen sehr kleinen Codebereich, in dem ich möglicherweise den Fehler gemacht habe, da es fast immer das letzte ist, was ich berührt habe, das den Fehler aufweist.
Wenn ich einen Laufzeitfehler erhalte, habe ich zumindest den Stack-Trace, und im Falle eines In-Browser-Fehlers habe ich die Möglichkeit, zu einer beliebigen Ebene des Stack-Trace zu wechseln und die Variablen zu überprüfen. Es ist normalerweise einfach, zurückzuverfolgen, woher der schlechte Wert stammt, und ihn somit auf das ursprüngliche Problem zurückzuführen.
Wenn Sie wie ich sind, als ich hauptsächlich in statisch typisierten Sprachen schrieb, habe ich vor dem Testen größere Codeblöcke geschrieben, und ich hatte keine Übung darin, einen Wert zurückzuverfolgen, von dem er stammt. Das Programmieren in einer Sprache wie Javascript ist anders, Sie müssen unterschiedliche Fähigkeiten anwenden. Ich vermute, dass eine solche Programmierung viel schwieriger erscheint, da dies nicht die Fähigkeiten sind, die Sie in anderen Sprachen wie C # entwickelt haben.
Trotzdem denke ich, dass es für explizite Typen viel zu sagen gibt. Sie eignen sich hervorragend zur Dokumentation und zum frühzeitigen Erkennen von Fehlern. Ich denke, dass wir in Zukunft zunehmend Dinge wie Flow und Typescript übernehmen werden, die dem Javascript die statische Typprüfung hinzufügen.
quelle
Ich denke, Sie tun das Richtige, Sie müssen nur den Stil finden, der für Ihr Auge angenehmer ist. Hier sind ein paar Ideen:
Anstelle von
if(myObj.hasSomeProperty())
Ihnen könnte verwendenif( myobj.prop !== undefined )
. Dies funktioniert übrigens nur im nicht strengen Modus, in dem strengen Modus, den Sie verwenden müsstenif( typeof myobj.prop !== 'undefined' )
.Sie können einige der Typprüfungen an separate Validatoren auslagern. Dies hat den Vorteil, dass die Validierung übersprungen werden kann, sobald die Schnittstellen ausgereift sind, z. B.
if( is_valid( myobject ))
wo mitis_valid
beginntif( !DEBUG ) return true;
.Manchmal ist es sinnvoll, Eingaben in eine kanonische Form zu klonen. In diesem Fall können Sie die verschiedenen Validierungsziele in der Klonfunktion / dem Klonobjekt sammeln. Beispielsweise könnte
my_data = Data( myobj, otherstuff )
derData
Konstruktor im Konstruktor bequem alle verschiedenen Validierungen an einer zentralen Stelle ausführen.Sie könnten eine Bibliothek verwenden, die (gegen eine Leistungsgebühr) Ihre Typüberprüfung in etwas Eleganteres rationalisiert. Auch wenn Sie diesen Weg auf lange Sicht nicht nehmen, finden Sie es vielleicht bequem, Sie reibungslos in Ihren eigenen Stil zu bringen. Einige Beispiele hierfür sind xtype.js , Typprüfung , validator.js usw.
quelle