Rolf B: Parameter für Methoden in Klassen prüfen

Beitrag lesen

Hallo ebody,

schau Dir mal Traits an.

Sorry, war bei PHP. Traits gibt's in JS nicht.

Mach eine Art statische Klasse, sprich, ein mehr oder weniger globales Objekt, auf dem diese gemeinsamen Methoden definiert sind. Die rufst Du dann wie Funktionen auf, d.h. ohen Nutzung von this in diesen Methoden.

class Data {
   read(arr) {
      Validator.isArray(arr, "number");
   }
}

const Validator = {
   isArray(arr, elementType) {
      if (!Array.isArray(arr)) throw new TypeError(...);
      if (!elementType) return;
      for (let i=0; i<arr.length; i++)
         if (typeof arr[i] != elementType)
            throw new TypeError(...)
   }
}

Den Validator importierst Du - vorzugsweise als ES6-Modul. Und davon hast Du 2 Versionen, Test und Produktion. Auf dem Testserver schreibst Du umfangreiche Prüfungen hinein. In der Produktion enthält jede Methode nur ein return;, damit gewinnst Du im Test Sicherheit und auf der echten Seite Geschwindigkeit.

Ein throw TypeError ist für solche Prüfungen dann sinnvoll, wenn sie nur durch Programmierfehler auftreten können. Man sollte aber nicht zu großzügig mit try/catch umgehen, denn der Aufbau einer try-Umgebung kostet Zeit. Das muss man planen; es ist durchaus legitim, wenn man mit einem throw über etliche Aufrufebenen 'rausfliegt,

In Java - so scheußlich es zumeist auch ist - gibt's eine gute Sache: man darf nur einen throw XyzException benutzen wenn man die Methode als "throws XyzException" deklariert, und wenn ich eine solche Methode aufrufe, dann muss ich entweder diese Exception fangen oder meine eigene Methode ebenfalls als "throws TypeError" deklarieren. Sowas fehlt in vielen anderen Sprachen, auch in JavaScript.

Du könntest Dir aber ggf. viel Arbeit sparen, wenn Du auf TypeScript umsteigst. Das ist getyptes JavaScript, da lehnt der Transpiler schon viele potenzielle Fehler ab, die Du dann nicht mehr prüfen musst.

Rolf

--
sumpsi - posui - obstruxi