Kai345: Script-Reorganisation

Grütze .. äh ... Grüße!

Ich bin ein Chaot. Leider sieht mein Javascript auch entsprechend aus, daher will ich nun etwas Struktur in die Sache bringen. Zuerst generell, danach werden die einzelnen Funktionen an sich überprüft und verbessert.

Mein erster Ansatz ist der: Script (Nicht wundern, zur Zeit ist einiges doppelt vorhanden, damit das Script während der Änderungen weiter lauffähig bleibt)

Bevor ich jetzt auf einem falschen Ansatz weitermache und evtl. dann erneut umstrukturieren muß, möchte ich diesen Ansatz _vorher_ zur Kritik und Verbesserung freigeben.

Es geht in erster Linie darum, daß die Daten aus den Objekten DOM und Va quasi überall zur Verfügung stehen müssen. Zur Zeit sind diese Objekte global definiert, gibt es einen anderen, besseren Ansatz (cite Struppi: "globale Variablen sind immer schlecht"). Leider bin ich dazu noch zu sehr Anfänger. Auch alle sonstigen Verbesserungsvorschläge sind willkommen


Kai

--
Der vertuschte Gefahrstoff: Dihydrogenmonoxid
   +---------+
   |   ___   |
---+--|_R_|--+---- Widerstand ist zwecklos
ie:{ fl:( br:< va:) ls:? fo:| rl:? n4:° ss:{ de:] js:| ch:? mo:| zu:|
  1. Hallo,

    Diese Pseudo-Objektorientierung verstehe ich nicht ganz, du rufst Funktionen als Konstruktoren auf, dabei werden sie sowieso nur einmal aufgerufen und der Rückgabewert ist eine globale Variable - das ist nicht sonderlich strukturiert.

    Ich würde mir eine Abstraktion so vorstellen:

    Es gibt ein Quiz-Konstruktor, der instantiiert wird. Das Quiz initialisiert sich dann über eine oder mehrere private Funktionen, die im Konstruktor aufgerufen werden. Das sind sinnigerweise initVars und initDOM, ferner addFormElements, addMyEvents, applyCookieSettings und letztlich Einblenden. Ob du die nötigen Operationen weiterhin so verteilst, lasse ich mal außen vor.

    Die ganzen Variablen des Quizzes kannst du auch hierarchisch ordnen, indem du Objects verwendest:
    this.zusammengehörigeVariablen = {
       variable : "wert",
       variable : "wert",
       ...
    }
    Zum Beispiel bei den Elementobjekten, sodass ein Zugriff über this.DOM.element möglich ist.

    Mir scheinen das krass viele Variablen zu sein. (Ich habe natürlich keine Einsicht in die Komplexität des Scriptes, das ist nur ein Gefühl.) Die lassen sich bestimmt weiter auslagern, sodass sie nicht alle ungeordnete öffentliche Eigenschaften des Quiz-Objektes wären.

    Und wenn ich dutzende Zeilen sehe, die alle nach diesem Muster aufgebaut sind:
    this.bezeichner = document.getElementById("id");
    Ansonsten scheint mir der geplante Aufbau des Quiz-Objektes ganz sinnvoll.

    Letztlich brauchst du dann nur eine globale Variable, nämlich die Quiz-Instanz (die ja auch nicht wirklich global sein muss).

    Mathias

    1. Hallo!

      Diese Pseudo-Objektorientierung verstehe ich nicht ganz, du rufst Funktionen als Konstruktoren auf, dabei werden sie sowieso nur einmal aufgerufen und der Rückgabewert ist eine globale Variable - das ist nicht sonderlich strukturiert.

      Deshalb frage ich ja auch, bevor ich auf diesem Ansatz weiterarbeite. Bin ja leider noch absoluter Anfänger in OOP. Und wenn ich es jetzt schon mal umschreibe, dann will ich natürlich auch als Endresultat ein Script, daß programmiertechnisch einigermaßen up-to-date ist, sonst könnte ich es auch direkt lassen. Nummer 5 würde sagen: "brauche Input".

      Daß ich auch einmal aufgerufene Funktionen als Konstruktor aufrufe, hat allerdings hauptsächlich den Grund, direkt erkennen zu können, wozu eine Variable respektive die Referenz darin dient. So sind alle Variablen, die unter DOM.bezeichner laufen, Referenzen auf Elemente, die ich im Script beeinflussen will und Va.bezeichner werden Variablen, die den Quizablauf betreffen. Ist also sozusagen als logische Gruppierung gedacht.

      Ich würde mir eine Abstraktion so vorstellen:

      Es gibt ein Quiz-Konstruktor, der instantiiert wird. Das Quiz initialisiert sich dann über eine oder mehrere private Funktionen, die im Konstruktor aufgerufen werden. Das sind sinnigerweise initVars und initDOM, ferner addFormElements, addMyEvents, applyCookieSettings und letztlich Einblenden. Ob du die nötigen Operationen weiterhin so verteilst, lasse ich mal außen vor.

      Ich werde diese Idee mal verfolgen, wenn ich es schaffe.

      Die ganzen Variablen des Quizzes kannst du auch hierarchisch ordnen, indem du Objects verwendest:
      this.zusammengehörigeVariablen = {
         variable : "wert",
         variable : "wert",
         ...
      }

      Ist das denn eigentlich außer der Literal-Schreibweise (die ich übrigens sehr mag und in meinem Haupt-Script der Site auch fleißig benutze) etwas anderes als ein Objekt per new zu erzeugen? Ich könnte das für die reinen Variablenzuweisungen durchaus so machen, das hatte ich mir auch schon überlegt, aber z.B. bei der Funktion zur Zuweisung der DOM-Elemente geht es nicht, da scheitert es an der einleitenden if-Abfrage. Aber das läßt sich alles leicht ändern, ich habe ja einen fähigen Editor.

      Mir scheinen das krass viele Variablen zu sein. (Ich habe natürlich keine Einsicht in die Komplexität des Scriptes, das ist nur ein Gefühl.) Die lassen sich bestimmt weiter auslagern, sodass sie nicht alle ungeordnete öffentliche Eigenschaften des Quiz-Objektes wären.

      Ja natürlich, das ist zur Zeit erst mal nur ein ganz grober Stand der Dinge, ich will möglichst noch einige Variable einsparen, aber das kommt erst später dran, wenn ich die einzelnen Funktionen überprüfe/umschreibe/optimiere.

      Die Elementreferenzen brauche ich dahingegen alle, da ich die entsprechenden Elemente je nach Quiz-Ablauf modifiziere (hauptsächlich diabled/enabled und Wertzuweisungen) Das Quiz Ich hab mir dabei gedacht, nur einmal beim Laden alle Elemente einzulesen und dann nur noch mit den Referenzen zu arbeiten.

      Und wenn ich dutzende Zeilen sehe, die alle nach diesem Muster aufgebaut sind:
      this.bezeichner = document.getElementById("id");

      Geht es anders? Ich brauche diese Referenzen.

      Ansonsten scheint mir der geplante Aufbau des Quiz-Objektes ganz sinnvoll.

      Danke, daß du dir das Script angeschaut und mir ein paar Ideen gegeben hast. Ich muß mal schauen, ob ich es hinbekomme.


      Kai

      --
      Der vertuschte Gefahrstoff: Dihydrogenmonoxid
         +---------+
         |   ___   |
      ---+--|_R_|--+---- Widerstand ist zwecklos
      ie:{ fl:( br:< va:) ls:? fo:| rl:? n4:° ss:{ de:] js:| ch:? mo:| zu:|