Das Typensystem bereits erzwingt eine Vielzahl solcher Sicherheitsfunktionen. Das ist im Wesentlichen, was es für ist.
Für ein sehr einfaches Beispiel verhindert es, dass Sie einen Float als int behandeln. Das ist ein Aspekt der Sicherheit - es garantiert, dass sich der Typ, an dem Sie arbeiten, wie erwartet verhält. Es garantiert, dass nur String-Methoden für eine Zeichenfolge aufgerufen werden. Die Montage verfügt beispielsweise nicht über diese Schutzfunktion.
Es ist auch die Aufgabe des Typsystems, sicherzustellen, dass Sie keine privaten Funktionen einer Klasse aufrufen. Das ist ein weiteres Sicherheitsmerkmal.
Javas Typensystem ist zu schwach, um viele interessante Einschränkungen wirksam durchzusetzen, aber in vielen anderen Sprachen (einschließlich C++) kann das Typsystem verwendet werden, um weit umfangreichere Regeln zu erzwingen.
In C++ bietet die Metaprogrammierung von Vorlagen viele Tools zum Verhindern von "schlechtem" Code. Beispiel:
class myclass : boost::noncopyable {
...
};
erzwingt zur Kompilierzeit, dass die Klasse nicht kopiert werden kann. Im Folgenden wird produzieren Fehler kompilieren:
myclass m;
myclass m2(m); // copy construction isn't allowed
myclass m3;
m3 = m; // assignment also not allowed
Ebenso wir zur Compile-Zeit sicherstellen kann, dass eine Template-Funktion wird nur auf Typen genannt, die bestimmte Kriterien erfüllen (sagen wir, sie Random-Access-Iteratoren sein muss, während bilinear diejenigen sind nicht erlaubt, oder sie müssen POD-Typen sein, oder sie dürfen keine Integer-Typen sein (char, short, int, long), aber alle anderen Typen sollten legal sein
Ein Lehrbuchbeispiel für Template-Metaprogrammierung in C++ implementiert eine Bibliothek zum Berechnen von physikalischen Einheiten.Es ermöglicht Ihnen, einen Wert vom Typ "Meter" mit einem anderen Wert des gleichen Typs zu multiplizieren und automatisch bestimmt, dass das Ergebnis vom Typ "Quadratmeter" sein muss Geben Sie als Typ "Meile" einen Wert vom Typ "Stunde" ein und erhalten Sie eine Einheit vom Typ "Meilen pro Stunde".
Noch einmal, eine Sicherheitsfunktion, die verhindert, dass Sie Ihre Typen durcheinander bringen und versehentlich Ihre Einheiten durcheinander bringen. Sie erhalten einen Kompilierungsfehler, wenn Sie einen Wert berechnen und versuchen, ihn dem falschen Typ zuzuordnen. Versuchen Sie, z. B. Liter durch meters^2
zu teilen und das Ergebnis einem Wert von beispielsweise Kilogramm zuzuweisen, wird zu einem Kompilierungsfehler führen.
Das meiste davon erfordert einige manuelle Arbeit, aber die Sprache gibt Ihnen die Werkzeuge, die Sie brauchen, um die gewünschten Typ-Checks zu erstellen. Einige davon könnten besser direkt in der Sprache unterstützt werden, aber die kreativeren Prüfungen müssten in jedem Fall manuell implementiert werden.
Dies wird auch in Podcast 58 (http://blog.stackoverflow.com/2009/06/podcast-58/) beschrieben – Brian
es ist im Grunde, was ein Typ System * ist *. Ohne das Typsystem könnte jede Variable wie jede andere behandelt werden. Sie könnten auf den Speicher außerhalb der Grenzen zugreifen, indem Sie z. B. einen Int als Doppel behandeln. Das würde Sie den Wert der 4 Bytes nach dem Ende des int erhalten. Oder vorzeichenlose Ganzzahlen verhindern, dass Sie signierte Werte versehentlich speichern. (Obwohl die Art, wie sie es still konvertieren, nicht ideal ist) – jalf
Richtig, aber es scheint, als ob es eine höhere Ebene von Eigenschaften gibt, die wir im Typsystem erzwingen können, die wenig damit zu tun hat, wie wir die Datendarstellung manipulieren.Ich denke, dass ich das Typsystem weiter in die Geschäftslogik einbinden werde. –