Frage

I verwendet (vor, dass PHP) eine Menge von Web-Programmierung in Rails zu tun, bevor ich das Studium der Computertechnik gestartet.

Seitdem ich habe eine Menge Schularbeit in C durchgeführt, und einige persönliche Dinge in Objective-C (Mac Sachen). Ich habe gelernt, Liebe statische Typisierung.

Aber jetzt habe ich eine professionelle Web-Entwicklung (freiberuflich) zu tun und habe Rails wieder abgeholt. Ich finde es wirklich ärgerlich, nicht-semantische Typ-Überprüfung Tests zu schreiben. Ich war kostenlos diejenigen bekommen von C und Objective-C-Compiler. Ich baut geliebt schlagen und mit dem System all meinen Code überprüfen, um zu sehen, dass A B nennen kann, kann B eine obskure Bibliothek C nennen, usw. Alles, was ich die Semantik war Test zu tun hatte. Aber mit Rails, ich bin der Compiler. :(

Hat jemand diesen gleichen Weg beschritten? Sind meine einzigen Optionen für Web-Entwicklung ASP.NET MVC mit C # und Java + x Rahmen? Suche nach ein paar Vorschläge, oder sogar eine gewisse Sympathie ...: P

Durch die Art und Weise, mache ich einen speziellen Hinweis auf Rails statt Rubin, weil ich nicht Rubys Dynamik für einfache Sachen wie scripting Geist oder was nicht. Aber da Rails auf so viele Edelsteine ??abhängen und da fügt man in der Regel eine Reihe von anderen Edelsteinen, die dynamische Typisierung wird ein Problem.

Danke!

Bearbeiten

folgte ich auf pst Vorschlag und in Scala sah. Beim Lesen des Buches Programming in Scala, geschrieben von der Sprache des Schöpfers, Martin Odersky, kam ich quer durch dieses Stück Text, dass meine Bedenken in vielerlei Hinsicht zum Ausdruck bringt und ein bisschen mehr. Sehr interessant zu lesen.

Entnommen Seite 52 von Martin Odersky der Programmierung in Scala:

Scala ist statisch typisiert

Ein statisches Typsystem klassifiziert Variablen und Ausdrücke nach die Arten von Werten, die sie halten und berechnen. Scala zeichnet sich als ein Sprache mit einem sehr fortgeschrittenen statischen Typ-System. Ausgehend von einem System von verschachtelte Klassentypen ähnlich wie Java, ermöglicht es Ihnen, zu parametrisieren Typen mit Generika, kombinieren Typen mit Kreuzungen und zu verstecken Details Typen mit abstrakten Typen. diese geben ein starkes Fundament für den Bau und Ihre eigene Art zu komponieren, so dass Sie können Schnittstellen entwickeln, die auf die sind gleichzeitig sicher und flexibel zu nutzen.

Wenn Sie wie die dynamischen Sprachen wie Perl, Python, Ruby oder Groovy, Sie könnte es ein wenig seltsam, dass Scala statisches Typsystem aufgeführt als eine seiner Stärken. Nach dem alle, das Fehlen eines statischen Typ System wird von einigen als zitiert Hauptvorteil der dynamischen Sprachen. Die häufigsten Argumente gegen statische Typen sind, dass sie machen Programme zu ausführlich, verhindern Programmierer von sich selbst auszudrücken wie sie wollen, und unmöglich machen bestimmte Muster von dynamischen Änderungen von Softwaresystemen.

Doch oft sind diese Argumente nicht gehen gegen die Idee der statischen Typen in allgemeinen, sondern gegen bestimmte Art Systeme, die auch wahrgenommen werden verbose oder zu unflexibel. Zum Beispiel Alan Kay, der Erfinder des die Sprache Smalltalk, hat einmal gesagt: „Ich bin nicht gegen die Typen, aber ich weiß nicht weiß jeder Art systemsthat sind kein kompletter Schmerz, so still wie ich dynamische Tippen.“

Wir hoffen, dass Sie in diesem Buch zu überzeugen, Typ-System, dass Scala ist noch lange nicht wobei ein „vollständiger Schmerz.“ In der Tat, es Adressen schön zwei der üblichen Bedenken über statische Typisierung: Ausführlichkeit durch Art vermieden Inferenz und Flexibilität gewonnen durch Musterabgleich und mehrere neue Wege zu schreiben und zu komponieren Typen. Mit diesen Hindernissen aus dem Weg, die klassischen Vorteile des statischen Typs Systeme können besser gewürdigt werden. Zu den wichtigsten dieser Vorteile sind überprüfbare Eigenschaften Programm Abstraktionen, Safe Refactoring und besser Dokumentation.

prüfbare Eigenschaften

Statische Typ syStielen kann die beweisen Fehlen bestimmter Laufzeitfehler. Zum Beispiel können sie beweisen, Eigenschaften wie: booleans sind nie auf ganze Zahlen hinzugefügt; private Variablen sind nicht von außerhalb ihrer zugegriffen Klasse; Funktionen werden zu der angelegten richtige Anzahl der Argumente; nur Strings werden je zu einem Satz hinzugefügt von Strings.

Andere Arten von Fehlern werden nicht erkannt von den heutigen statischen Typ-Systemen. Zum So werden sie in der Regel nicht erkennen Nichtabschlußfunktionen, array begrenze Verletzungen oder Teilungen durch Null. Sie werden auch nicht erkennen, dass Ihr Programm entspricht nicht sein Spezifikation (vorausgesetzt, es ist ein spec, das ist!). Statische Typsysteme Daher wurden von einigen entlassen als nicht sehr nützlich sein. Das Argument da eine solche Art Systeme geht, dass nur einfache Fehler erkennen, während Unit-Tests bieten umfangreichere Abdeckung, warum die Mühe mit statischen Typen überhaupt?

Wir glauben, dass diese Argumente verpassen Der Punkt. Obwohl ein statischer Typ System sicher nicht Einheit ersetzen Tests, kann es die Anzahl der reduzieren Unit-Tests benötigt durch die Pflege des Nehmens einige Eigenschaften würden, die sonst Notwendigkeit geprüft werden. Ebenso Einheit Testen kann nicht statische Typisierung ersetzen. Denn als Edsger Dijkstra sagte, Testen kann nur das Vorhandensein beweisen Fehler, nie ihre Abwesenheit. so ist die garantiert, dass statische Typisierung gibt kann einfach sein, aber sie sind real Garantien für eine Form keine Menge von Tests liefern können.

Sicher Refactorings

Ein statisches Typsystem liefert ein Sicherheitsnetz, das Sie Änderungen vornehmen können auf eine Code-Basis mit einem hohen Grad an Vertrauen. Betrachten wir zum Beispiel ein Refactoring fügt hinzu, dass eine zusätzliche Parameter auf ein Verfahren. In einer statisch typisierte Sprache können Sie die Änderung tun, Wieder kompilieren Ihr System und einfach fix Alle Leitungen, die einen Typ Fehler verursachen. Sobald Sie mit diesem fertig sind, Sie sind sicher, dass alle Orte gefunden zu haben, dass Bedarf geändert werden. Das gleiche gilt für viele andere einfache Refactorings wie Ändern eines Methodennamen oder Verschieben Methoden von einer Klasse zu einer anderen. Im alle Fälle eine statische Typprüfung wird bietet genügend Sicherheit, dass die neuen System funktioniert genauso wie das alte.

Dokumentation

Statische Typen sind Programmdokumentation die vom Compiler geprüft Richtigkeit. Im Gegensatz zu einem normalen Kommentar, eine Art Anmerkung kann nie heraus Datum (zumindest nicht, wenn die Quelldatei dass es enthält kürzlich verabschiedete eine hat Compiler). Außerdem Compiler und integrierte Entwicklungsumgebungen kann die Verwendung von Typ Anmerkungen machen eine bessere Kontexthilfe. Zum B. eine integrierte Entwicklungs Umwelt können alle Anzeige Mitglieder für eine Auswahl verfügbar von Bestimmung der statischen Typ der auf dem Ausdruck ist die Auswahl gemacht und aufzublicken alle Mitglieder dass Art.

War es hilfreich?

Lösung

Dies ist einer meiner „gripes“ über dynamische Sprachen. Ich möchte für die Semantik Test keine Fehler geben ;-) Das wird gesagt, ein guter Rahmen / Aufbau Prüfung ist wirklich ein Muss in allen nicht-trivialen Situationen und guten Code-Abdeckung und getestet Anforderungen ist / sind wichtig.

Wenn Sie die statische Typisierung Pfad auf der JVM nach unten gehen wollen, um (ich habe), würde ich sehr empfehlen, sich unter Scala . Von Ruby, es ist weit weniger schmerzhaft (und tatsächlich viel Spaß auf unterschiedliche Weise) als auf Java gehen. Sie erhalten zu „halten“ die Dinge, die man für selbstverständlich - ein Ausdruck-basierte Syntax, Verschlüsse, die Fähigkeit, wegzulassen Arten an vielen Stellen (nicht so offen wie Rubin, aber man bekommt Kompilierung Typüberprüfung ;-), alles (*) - ist-an-Objekt OO, Accessormethoden vereinigt, die Fähigkeit zu konstruieren DSLs leicht und Zucker - und die Vorteile eine statisch typisierten Sprache mit lokaler Typinferenz, pattern-Matching bekommen, ein relativ reichen Sammlung Rahmen und anständige Integration mit Java (einschließlich der zahlreichen Web-Frameworks gibt es einige Scala spezifischen Rahmenbedingungen sowie dem Einfluss der Scala Sprache).

C # 3.0 / 4.0 (und NET3.5 +) ist nicht zu schäbig entweder (aber vermeiden C # 2.0, das nun hoffentlich ist ein Relikt), mit der Einführung von LINQ / Verschlüsse, Grund Typinferenz und andere schöne Sprache kennzeichnet ich es „akzeptabel“ für die meisten Aufgaben (nehmen Sie eine Vermutung finden, wie ich Java als Sprache bewerten würde ;-). Allerdings ist C # eine CLR-Zielsprache (es ist / war eine .NET-Scala-Port, aber ich bin nicht sicher, ob der Status - es ist nicht die Hauptzielplattform allerdings ist).

Da ich Scala erwähnt habe, sollte ich auch F # erwähnen (jetzt eine „offizielle“ .NET-Sprache), die die „Funktionale mit OO“ -Ansatz, um OCaml ist ähnlich nimmt - Scala ist eher umgekehrt, und ich würde es beschreiben als "OO mit Functional". Ich habe Argumente für / gegen F # im Vergleich zu C # w.r.t vom Typ System gehört, aber keine praktische Erfahrung mit F # haben. Sie können oder nicht wie der Paradigmenwechsel.

Happy-Codierung.

Andere Tipps

Wie Sie erwähnen Rails, und da Sie in Scala zu interessieren, sollten Sie auf jeden Fall überprüfen Fahrstuhl . Hier ist ein 2008 Interview mit seinem Schöpfer, und ein 2009 Präsentation (Video), die ich verbinden, weil sie zwar alt, sie Aufzug vergleichen Alternativen in anderen Sprachen.

Wenn Aufzug ist nicht Ihr Ding, sei aber versichert, dass es andere Scala Web sind Frameworks .

Diese Art der Prüfung nicht typischerweise in Rails getan. Statt, indem er zu ärgern, es zu tun, sollten Sie nicht Sorgen um sie. Oder vielleicht einen besseren Job zu erklären, warum Sie denken, es ist ein Problem, da die meisten Rails Programmierer nicht.

Aktualisieren

Die Person, die test_include_with_order_works schrieb sorgt dafür, dass Rails ein Symbol das gleiche wie eine Zeichenfolge in diesem speziellen Fall interpretiert. Das scheint nicht wie etwas, das Sie zu Test haben würde, da Rails bereits zur Verfügung gestellt hat und testeten diese Funktionalität für Sie. Ehrlich gesagt, ich bin ein wenig überrascht, dass jemand selbst darum kümmern würde, ob ein Symbol wie ein String funktioniert. Wir alle wissen, dass es möglich und oft der Fall ist.

Generell denke ich, dass das Rails-Framework Dinge sicherstellen muss, dass Sie dies nicht tun, so dass ihre Umsetzung seiner Konstruktion entsprechen wird. Ich glaube, dass die Arbeitsphilosophie in dynamisch typisierten Sprachen ist, dass Client-Code wird nicht in Parameter übergeben, die die Methoden brechen sie rufen. Wenn sie das tun, bekommen sie keine Verwendung der Verfahren des Aufrufs. Sie müssen nicht Ihre Zeit verschwenden, um sicherzustellen, dass Ihre Methoden Ausnahmen auslösen, wenn zu viele Parameter zur Verfügung gestellt, wenn Ihre Methode kann genauso einfach (und sollten) die zusätzlichen Parameter ignorieren.

Also, ich bin nicht sicher, ob die Beispiele, die Sie wirklich die Notwendigkeit eines nicht-semantische Tests in Rails demonstrieren zur Verfügung gestellt haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top