ebody: Parameter für Methoden in Klassen prüfen

Hallo,

in verschiedenen Klassen für unterschiedliche Methoden überprüfe ich den/die Parameter mit try/catch.

Es wird geprüft, ob es denn auch ein Objekt ist, ob dieses Keys enthält und diese Values oder ob es ein Array ist u.a. Der Code für diese Prüfungen ist oft sehr ähnlich und würde diesen gerne in einer Klasse oder Funktion sammeln, um aus all den unterschiedlichen Klassen und Methoden darauf zugreifen zu können.

class Data{

 readArray(arr){
   // rufe hier die passenden Prüfungen für den Parameter arr aus der Klasse oder Funktion ... auf
 }

}

Wie handhabt man so etwas am besten?

Eine Klasse erstellen, um aus den anderen Klassen Methoden darauf zu zugreifen? Wenn ja, wie greift man aus einer Klasse auf eine andere zu, wenn diese keine Elternklasse ist?

Gruß ebody

  1. 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
  2. Tach!

    in verschiedenen Klassen für unterschiedliche Methoden überprüfe ich den/die Parameter mit try/catch.

    Hat diese Prüfung etwas mit den konkreten Klassen zu tun? Sprich, brauchst du ein this? Wenn nicht, dann schreib einfach eine Funktion.

    dedlfix.