Frage

Es scheint mir, dass die meisten von unschätzbarem Wert, was über eine statische / stark typisierte Programmiersprache ist, dass es Refactoring hilft. Wenn / wenn Sie jede API ändern, dann wird der Compiler wird Ihnen sagen, was diese Änderung gebrochen

Ich kann in einer Runtime / schwach typisierte Sprache das Schreiben von Code vorstellen ... aber ich kann mir nicht vorstellen Refactoring ohne die Hilfe des Compiler, und ich kann mir nicht vorstellen Zehntausende von Zeilen Code ohne Refactoring zu schreiben.

Ist das wahr?

War es hilfreich?

Lösung

Ich glaube, du conflating wenn Typen geprüft werden mit, wie sie geprüft sind. Runtime Typisierung ist nicht unbedingt schwach.

Der Hauptvorteil der statischen Typen ist genau das, was Sie sagen: sie erschöpfend sind. Sie können alle Aufrufstellen mit dem Typ übereinstimmen sicher sein, nur durch den Compiler zu lassen tun, es ist Sache.

Die wichtigste Einschränkung der statischen Typen ist, dass sie in den Zwängen begrenzt sind sie zum Ausdruck bringen können. Dies variiert je nach Sprache, mit den meisten Sprachen relativ einfache Art Systeme mit (C, Java) und andere mit extrem leistungsfähigen Systemen des Typs (Haskell, Cayenne).

Aufgrund dieser Einschränkung Typen auf ihre eigenen sind nicht ausreichend. So sind zum Beispiel in Java-Typen mehr oder weniger eingeschränkte Typnamen Spiel überprüfen. Das bedeutet, die Bedeutung eines Constraint Sie überprüft wollen hat in einem Namensschema von einer Art codiert werden, damit die Fülle von Umwegen und Kesselblech gemeinsam Java-Code. C ++ ist ein wenig besser, dass ein bisschen mehr Ausdrucksvorlagen erlauben, aber kommt nicht in der Nähe, was Sie mit abhängigen Arten tun können. Ich bin mir nicht sicher, was die Nachteile zu den leistungsfähigeren Systemen des Typs sind, obwohl klar muss es einige oder mehr Menschen sein würde, sie in der Industrie werden.

Auch wenn Sie statische Typisierung verwenden, stehen die Chancen, es reicht nicht ausdruck ist alles, was Sie wichtig zu überprüfen, so dass Sie Tests schreiben müssen. Ob statische Typisierung erspart Ihnen Mühe, als es in vorformulierten erfordert, ist eine Debatte, die seit Jahren gewütet hat und dass ich glaube nicht, eine einfache Antwort für alle Situationen hat.

In Bezug auf Ihre zweite Frage:

Wie können wir wieder Faktor sicher in einer Runtime-typisierte Sprache?

Die Antwort ist Tests. Ihre Tests haben alle Fälle abzudecken, die Materie. Tools können Sie in Mess helfen, wie erschöpfend Ihre Tests sind. Coverage Prüfwerkzeuge können Sie, ob Codezeilen wissen von den Tests abgedeckt ist oder nicht. Test Mutation Werkzeuge (Hofnarr, heckle) können Sie wissen lassen, wenn Sie Ihre Tests logisch unvollständig sind. Abnahmetests lassen Sie wissen, was Sie Streichhölzer Anforderungen geschrieben haben, und schließlich Regression und Performance-Tests sicherzustellen, dass jede neue Version des Produkts die Qualität der zuletzt unterhält.

Einer der großen Dinge über die richtige Prüfung an Ort und Stelle, auf aufwendige Art Indirekt vs angewiesen ist, dass das Debuggen wird viel einfacher. Wenn die Tests laufen bekommen Sie bestimmte gescheitert Behauptungen in Tests, die deutlich zum Ausdruck bringen, was sie tun, anstatt stumpfen Compilerfehler Aussagen (man denke C ++ Template-Fehler).

Egal, welche Werkzeuge, die Sie verwenden: das Schreiben von Code Sie sicher sind in Aufwand erfordert. Es wird höchstwahrscheinlich benötigen eine Menge Tests zu schreiben. Wenn die Strafe für Fehler ist sehr hoch, wie Luft- und Raumfahrt oder medizinische Steuerungssoftware, können Sie formale mathematische Methoden verwenden, müssen Sie das Verhalten Ihrer Software zu beweisen, die eine solche Entwicklung extrem teuer macht.

Andere Tipps

Ich bin vollkommen einverstanden mit Ihrem Gefühl. Die sehr Flexibilität, die dynamisch typisierten Sprachen sollen auf gut sein, ist eigentlich das, was der Code macht sehr schwer zu pflegen. Wirklich, ist es so etwas wie ein Programm, das, wenn die Datentypen arbeiten weiterhin in einer nicht trivialen Weise geändert, ohne tatsächlich den Code zu ändern?

In der Zwischenzeit können Sie die Art der Variablen überprüfen, übergeben wird und irgendwie fehl, wenn es nicht der erwartete Typen. Sie würden immer noch Sie die Fälle auszurotten, aber zumindest etwas sagen würde, dass Ihr Code auszuführen.

ich denke, Google interne Tools tatsächlich eine Compilation tun und wahrscheinlich geben, um ihre Javascript überprüfen. Ich wünschte, ich hatte diese Werkzeuge.

Um zu beginnen, ich bin einen native Programmierer Perl so auf der einer Seite habe ich noch nie mit dem Netz von statischen Typen programmiert. OTOH Ich habe noch nie mit ihnen programmiert, so kann ich nicht auf ihre Vorteile sprechen. Was kann ich sprechen ist, was sein Refactoring gerne.

Ich finde nicht, den Mangel an statischen Typen ein Problem wrt Refactoring zu sein. Was ich ein Problem finden, ist das Fehlen eines Refactoring Browser . Dynamische Sprachen haben das Problem, dass Sie nicht wirklich wissen, was der Code tatsächlich tun wird, bis Sie sie tatsächlich ausgeführt werden. Perl hat dies mehr als die meisten. Perl hat das zusätzliche Problem, eine sehr komplizierte, fast unparsable, Syntax zu haben. Ergebnis: keine Refactoring-Tools (obwohl sie an diesem sehr schnell arbeiten). Das Endergebnis ist, ich von Hand Refactoring haben. Und das ist es, was bringt Fehler.

Ich habe Tests, sie zu fangen ... in der Regel. Ich selbst finde oft vor einem dampfenden Haufen von ungetestetem und nahe untestable Code mit dem Huhn / Ei Problem, den Code, um Refactoring es zu testen, aber mit ihm zu testen, um es zu Refactoring. Ick. An dieser Stelle muss ich einige sehr dumm, hohe schreiben „wird das Programm Ausgabe das gleiche, wie vor“ Art von Tests, nur um sicherzustellen, dass ich nicht etwas brechen haben.

Statische Typen, wie in Java oder C ++ oder C # in Betracht gezogen, wirklich nur eine kleine Klasse von Programmieraufgaben lösen. Sie garantieren Ihre Schnittstellen Datenbits mit dem richtigen Etikett übergeben werden. Aber nur, weil Sie erhalten eine Sammlung bedeutet nicht, dass Sammlung enthält die Daten, die Sie denken, es tut. Weil Du eine ganze Zahl erhalten, bedeutet nicht, Sie die richtigen integer bekommen. Ihre Methode nimmt ein User-Objekt, wird aber, dass der Benutzer angemeldet?

Classic Beispiel: public static double sqrt(double a) ist die Signatur für die Java Radizierfunktion . Quadratwurzel funktioniert nicht auf negative Zahlen. Wo steht es, dass in der Signatur? Es funktioniert nicht. Noch schlimmer ist, wo sagt es, was diese Funktion auch tut? Die Unterschrift sagt nur, welche Arten es braucht und was er zurückkehrt. Es sagt nichts über das, was passiert dazwischen und das ist, wo der interessante Code lebt. Einige Leute haben versucht, die vollständige API zu erfassen, indem Sie Design by Contract , die kann im Großen und Ganzen als Einbettungslaufzeittests Ihrer Funktion der Eingänge, Ausgänge und Nebenwirkungen (oder deren Fehlen) beschrieben werden ... aber das ist eine andere Show.

Eine API ist weit mehr als nur Funktionssignaturen (wenn es nicht ist, würden Sie nicht alle brauchen diese beschreibende Prosa im Javadocs) und Refactoring ist weit mehr noch als nur die API zu ändern.

Der größte Vorteil Refactoring eine statisch typisierte, statisch kompilierte, nicht-dynamische Sprache gibt, ist die Fähigkeit, Refactoring-Tools zu schreiben ziemlich komplex Refactorings für Sie tun, weil es weiß, wo alle Anrufe an Ihre Methoden sind. Ich bin ziemlich neidisch auf IntelliJ IDEA .

Ich würde sagen, Refactoring hinausgeht, was der Compiler überprüfen kann, auch in statisch typisierten Sprachen. Refactoring ist nur ein Programm interne Struktur zu verändern, ohne das äußeree Verhalten zu beeinflussen. Selbst in dynamischen Sprachen gibt es immer noch Dinge, die Sie erwarten können, passieren und zu testen, benutzen Sie nur ein wenig Unterstützung durch den Compiler verlieren.

Einer der Vorteile der Verwendung von var in C # 3.0 ist, dass Sie können oft die Art ändern, ohne Code zu brechen. Der Typ muss immer noch die gleich aussehen - Eigenschaften mit denselben Namen müssen Methoden mit derselben oder einer ähnlichen Signatur existieren muss noch existieren. Aber man kann wirklich auf eine ganz andere Art ändern, auch ohne so etwas wie ReSharper verwendet wird.

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