Frage

Ich habe angefangen, scheint die ganze Unit-Test / Test-Driven zu schauen in die Entwicklung Idee, und je mehr ich darüber nachdenke, desto mehr wird es eine ähnliche Rolle wie statische Typprüfung zu füllen. Beiden Techniken bieten eine Compiler-, reaktionsschnelle Kontrolle für bestimmte Arten von Fehlern in Ihrem Programm. Allerdings korrigieren Sie mich, wenn ich falsch liege, aber es scheint, dass eine Unit-Test-Suite mit voller Deckung testet statischen Typ aller Überprüfung würde würde testen, und dann einige. Oder formulierte eine andere Art und Weise, statische Typüberprüfungen nur einen Teil des Weges gehen zu „beweisen“, dass Ihr Programm korrekt ist, während Unit-Tests lassen Sie „beweisen“, so viel wie Sie (zu einem gewissen Grad) wollen.

Also, gibt es keinen Grund, eine Sprache mit statischer Typüberprüfung zu verwenden, wenn Sie Unit-Tests als auch verwenden? Eine ähnliche Frage wurde gefragt, hier , aber ich würde gerne mehr ins Detail erhalten . Welche spezifischen Vorteile, wenn überhaupt, nicht statische Typprüfung hat über Unit-Tests? Einige Themen wie Compiler-Optimierungen und Intellisense in den Sinn kommen, aber es gibt auch andere Lösungen für diese Probleme? Gibt es noch andere Vorteile / Nachteile Ich habe nicht gedacht?

War es hilfreich?

Lösung

Ich würde denken, dass automatisierte Unit-Tests werden wichtig , um dynamische Sprachen eingegeben, aber das bedeutet nicht, es statischen Typen im Kontext Überprüfung ersetzen würde, die Sie anwenden. In der Tat könnte unter Verwendung es tatsächlich sein, einige von denen, die dynamische Typisierung verwenden, weil sie nicht wollen den Ärger der Konstantenart Sicherheitskontrollen.

Die Vorteile dynamisch typisierten Sprachen bieten über statische typisierten Sprachen weit über Tests gehen, und gibt Sicherheit ist nur ein Aspekt. Programmierung Stile und Designunterschiede über dynamische und statische typisierten Sprachen unterscheiden sich auch stark.

Außerdem Unit-Tests, die auch geschrieben werden energisch Art Sicherheit erzwingen würde bedeuten, dass die Software nicht dynamisch schließlich eingegeben werden, oder das Design angewendet werden, sollten in einer statisch typisierten Sprache geschrieben werden, nicht eine dynamische.

Andere Tipps

Es gibt eine unveränderliche Tatsache über Software-Qualität.

  

Wenn es nicht kompilieren kann, kann es nicht versenden

In dieser Regel statisch typisierten Sprachen dynamisch typisierten Sprachen gewinnen.

Ok, ja diese Regel ist nicht unveränderlich. Web Apps können Schiff ohne Kompilierung (vielen Test Web-Apps Ich habe im Einsatz, die nicht kompilieren). Aber was ist im Grunde wahr ist

  

Je früher Sie einen Fehler zu fangen, desto günstiger ist es zu beheben

Eine statisch typisierte Sprache wird die realen Fehler vermeiden, an einen der frühestmöglichen Momente in dem Software-Entwicklungszyklus geschieht. Eine dynamische Sprache nicht. Unit Testing, wenn Sie gründlich zu einer Super-menschlichen Ebene sind, kann an die Stelle einer statisch typisierte Sprache.

Aber warum die Mühe? Es gibt eine Menge unglaublich intelligent Leute da draußen ein ganze Fehlerprüfung System für Sie in Form eines Compiler zu schreiben. Wenn Sie sich Sorgen um immer früher Fehler eine statisch typisierte Sprache.

Bitte nehmen Sie nicht diesen Beitrag als Bashing von dynamischen Sprachen. Ich benutze dynamische Sprachen täglich und lieben sie. Sie sind unglaublich ausdrucksstark und flexibel und ermöglichen eine unglaublich program.s jedoch im Falle einer vorzeitigen Fehler fanscinating berichten sie verlieren statisch typisierten Sprachen.

Für jedes vernünftige Größe Projekt, können Sie erklären einfach nicht für alle Situationen mit Unit-Tests nur.

So ist meine Antwort „nein“, und auch wenn Sie für alle Situationen zu berücksichtigen verwalten, haben Sie besiegt damit den ganzen Zweck eine dynamische Sprache an erster Stelle zu verwenden.

Wenn Sie typsicher programmieren wollen, besser eine typsichere Sprache.

Mit 100% Code Coverage bedeutet nicht, Sie vollständig Ihre Anwendung getestet haben. Betrachten Sie den folgenden Code ein:

if (qty > 3)
{
    applyShippingDiscount();
}
else
{
    chargeFullAmountForShipping();
}

Ich kann 100% Code Coverage, wenn ich in den Werten der Menge pumpe = 1 und Menge = 4

Jetzt ist mein Geschäft Zustand vorstellen, war, dass „... für eine Bestellung von 3 oder mehr Artikel Ich bin ein Rabatt auf die Versandkosten anzuwenden ..“. Dann würde ich brauche Tests zu schreiben, die an den Grenzen gearbeitet. So würde ich Tests entwerfen, wo Menge 2,3 war und 4. Ich habe immer noch 100% Abdeckung, aber was noch wichtiger ist, fand ich einen Fehler in meiner Logik.

Und das ist das Problem, dass ich mit Schwerpunkt auf Codeabdeckung allein habe. Ich denke, dass besten Sie mit einer Situation landen, wo der Entwickler einige erste Tests auf den Geschäftsregeln basierend erstellt. Dann, um die Abdeckung Nummer, die sie verweisen auf ihren Code, wenn Design neue Testfälle zu treiben.

Manifest Typisierung (was ich nehme an, Sie bedeuten) ist eine Form der Spezifikation, ist Unit-Tests wesentlich schwächer, da sie nur Beispiele. Der wesentliche Unterschied besteht darin, dass eine Spezifikation erklärt, was in jedem Fall zu halten hat, während ein Test nur Beispiele abdeckt. Man kann nie sicher sein, dass Ihre Tests alle Randbedingungen abdecken.

Die Menschen neigen auch dazu, den Wert der deklarierten Typen als Dokumentation zu vergessen. Zum Beispiel, wenn eine Java-Methode eine List<String> zurückgibt, dann weiß ich sofort, was ich bekomme, keine Notwendigkeit, lesen Dokumentation, Testfälle oder auch die Methode Code selbst. Ähnliches gilt für Parameter: Wenn der Typ deklariert wird, dann weiß ich, was die Methode erwartet

.

Der Wert der Art der lokalen Variablen zu erklären ist viel geringer, da in gut geschriebenen Code der Umfang der Existenz der Variable sollte klein sein. Sie können immer noch statische Typisierung verwenden, aber: statt den Typ deklarieren Sie den Compiler infer es zulassen. Sprachen wie Scala oder sogar C # erlauben, dies zu tun einfach.

Einige Arten von Tests näher an eine Spezifikation, z.B. Quick Check oder es ist Scala Variante Scalacheck Tests erzeugt auf Spezifikationen basieren, zu versuchen, die wichtigen Grenzen zu erraten.

Ich würde Wort es eine andere Art und Weise - wenn Sie eine nicht haben statisch typisierte Sprache, musste man besser haben sehr gründlich Unit-Tests, wenn Sie mit, dass auf etwas zu tun „echten“ planen Code.

Das heißt, statische Typisierung (oder besser gesagt, explizite Typisierung) hat einige bedeutende Vorteile gegenüber Unit-Tests, die mir es in der Regel machen bevorzugen. Es schafft viel verständlichen APIs und ermöglicht eine schnelle Betrachtung des „Skeletts“ eine Anwendung (dh die Eintrittspunkte für jedes Modul oder Codeabschnitt) in eine Weise, die viel schwieriger, mit einer dynamisch typisierte Sprache ist.

Um es zusammenzufassen: meiner Meinung nach, da solide, gründliche Unit-Tests, die Wahl zwischen einem dynamisch typisierte Sprache und eine statisch typisierte Sprache ist meist eine Geschmackssache. Manche Menschen bevorzugen ein; andere bevorzugen die andere. Verwenden Sie das richtige Werkzeug für den Job. Aber dies bedeutet nicht, dass sie identisch sind - statisch typisierten Sprachen werden immer eine Kante in gewisser Weise haben und dynamisch typisierten Sprachen werden immer eine Kante in bestimmten unterschiedlicher Weise. Unit-Tests gehen einen langen Weg, um die Nachteile der dynamisch typisierten Sprachen zu minimieren, aber sie beseitigen sie nicht vollständig.

Nein.

Aber das ist nicht die wichtigste Frage, die wichtigste Frage ist: es ist egal, dass es nicht

Betrachten Sie den Zweck der statischen Typprüfung: eine Klasse von Codefehlern zu vermeiden (Bugs). Dies hat jedoch im Rahmen der größeren Domäne aller Codefehler abgewogen werden. Das Wichtigste ist, nicht ein Vergleich auf einem schmalen Band aber ein Vergleich über die Tiefe und Breite der Codequalität, einfache korrekten Code zu schreiben, etc. Wenn Sie mit einem Entwicklungsstil / Prozess kommen können, die Ihr Team ermöglicht eine höhere Qualität zu produzieren Code effizienter ohne statische Typprüfung, dann ist es das wert. Dies gilt auch in dem Fall, dass Sie Löcher in Ihren Tests haben, dass statische Typprüfung fangen würde.

Ich nehme an, es könnte, wenn man sehr gründlich ist. Aber warum die Mühe? Wenn die Sprache bereits überprüft, um sicherzustellen, statische Typen korrekt sind, würde es bei der Prüfung sich keinen Punkt (da Sie es kostenlos bekommen).

Auch wenn Sie statisch typisierten Sprachen mit einer IDE verwenden, kann die IDE Sie mit Fehlern und Warnungen liefern, noch bevor zu testen, zu kompilieren. Ich bin nicht sicher, es gibt keine automatisierten Unit-Tests von Anwendungen, die das gleiche tun kann.

Da alle Vorteile der dynamischen, späte Bindung Sprachen, ich nehme an, das ist eine der von Unit-Tests angeboten Werte. Sie werden immer noch sorgfältig und bewusst codieren müssen, aber das ist die # 1 Voraussetzung für jede Art von IMHO Codierung. Die Möglichkeit, klare und einfache Tests schreiben hilft, die Klarheit und Einfachheit des Designs und der Implementierung zu beweisen. Es bietet auch nützliche Hinweise für diejenigen, die später den Code zu sehen. Aber ich glaube nicht, dass ich auf sie zählen würde nicht übereinstimmen Typen zu erfassen. Aber in der Praxis finde ich nicht, dass Typ-Prüfung wirklich viele echte Fehler ohnehin fängt. Es ist einfach nicht eine Art von Fehlern, die ich in echtem Code auftreten finden, wenn Sie eine klare und einfache Art der Programmierung in erster Linie haben.

Für JavaScript aktivieren, würde ich erwarten, dass JSLint fast alle Typprüfung Fragen finden. in erster Linie durch abwechselndes was darauf hindeutet, Stile Codierung Ihre Exposition zu verringern.

Kontrolle Typ hilft erzwingen Verträge zwischen Komponenten in einem System. Unit-Tests (wie der Name schon sagt) überprüfen die interne Logik der Komponenten.

Für eine einzelne Einheit von Code, denke ich Unit-Tests wirklich statische Typprüfung überflüssig machen können. Aber in einem komplexen System, automatisierte Tests können all Vielzahl Möglichkeiten nicht überprüfen, die verschiedenen Komponenten des Systems interagieren könnten. Hierzu wird die Verwendung von Schnittstellen (die sind, in gewissem Sinne eine Art „Vertrag“ zwischen den Komponenten) wird ein nützliches Werkzeug für mögliche Fehler zu reduzieren. Und Schnittstellen erfordern Kompilierung Typüberprüfung.

Ich genieße wirklich in dynamischen Sprachen programmieren, so dass ich bashing sicherlich nicht dynamische Typisierung. Dies ist nur ein Problem, das vor kurzem fiel mir ein. Leider kann ich wirklich keine Erfahrung habe eine dynamische Sprache für ein großes und komplexes System in Verwendung, so würde ich mich interessiert von anderen Leuten zu hören, ob dieses Problem real ist oder nur theoretisch.

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