MB: Fragen zu der Methode der JavaScript Programmierung / Funktionssteuerung

Hallo Community,

wie im titel schon genannt habe ich fragen zu der Methodik der JavaScript Programmierung. es geht vorrangig um Scope. N Beispiel, Mir gehts um das Prinzip.

function konstruktor ( parameter1, ... ) {
  // public 
  this.parameter1 = parameter1;
  // Private
  var parameter2;

  // setter
  this.setParameter( parameter ) {
    this.parameter1 = parameter
  // getter
  this.getParameter( ) {
    return parameter1
  }
}

Ich habe mehrere Übergabeparameter die ich in dem Ursprugszustand verwenden will und Übergabeparameter mit denen ich modfiziert arbeite.

  • Entweder deklariere ich alle zuarbeitenden variable als global. dann muss ich mich nich stressen, bezogen auf die übergabe. Jedoch ist das ungern gesehen z.B.: Überschreibungsgefahr, oder Zugriffe

  • Oder aber ich mach alles private also lokal, dann habe ich den return und übergabeparamterer stress.

Ich verwende beides. Die Parameter die ich nur wenige male Bruche deklariere ich als global und umgekehrt. Bestimmt gibt regeln die das Problem aufgreifen. Ich möchte gern andere und bessere methoden kennen lernen die sich mit diesem Problem beschäftigen und anders lösen.

Ich habe Folgende Augangssituation: Beispiel eine folge von funktionen die sich verschachtelt aufrufen und was ausgeben.

var o = [...];
var a = functionA( O );
var b = functionA( a );
var c = functionA( b );
var d = functionA( c );
return d;

Ich könnte das ganze in ein funktion basteln jedoch würden dann die kapselung und ene gwisse ordnung fehlen. Ich möchte gerne wissen wie es am sinnvollsten ist diese funktion zu steuern.

herzlichste Grüße MB

  1. Hi,

    var o = [...];
    var a = functionA( O );
    var b = functionA( a );
    var c = functionA( b );
    var d = functionA( c );
    return d;
    

    du kannst eine Schleife in der functionA machen ;-)

    --
    Viele Grüße aus LA
    ralphi
    "Nicht alles was einfach ist, ist genial, aber alles was genial ist, ist einfach" - Albert E.
    1. Hi ralphi,

      du kannst eine Schleife in der functionA machen ;-)

      schon, nur ich befürchte aber das dann die struktur unübersichtlicher würde. außerderm würd sich das bei zwei, drei, vier funktionsaufrufen nicht lohnen oder?

      function konstruktor() {
        
        var o = [...]
        var a = fnc1( o )
        var b = fnc2( a )
        
        function fnc1( o ) {
          ...
          return o;
      
        function fnc2( o ) {
          ...
          return o;
      }
      

      der ablauf der Prozedur kann aber auch anders vertlaufen. da bringt mir die Schleife herzlich wenig. hätte ich aber auch dazusagen sollen. sorry

      grüße MB

  2. Moin!

    • Entweder deklariere ich alle zuarbeitenden variable als global. dann muss ich mich nich stressen, bezogen auf die übergabe. Jedoch ist das ungern gesehen z.B.: Überschreibungsgefahr, oder Zugriffe

    • Oder aber ich mach alles private also lokal, dann habe ich den return und übergabeparamterer stress.

    Ich verwende beides. Die Parameter die ich nur wenige male Bruche deklariere ich als global und umgekehrt. Bestimmt gibt regeln die das Problem aufgreifen. Ich möchte gern andere und bessere methoden kennen lernen die sich mit diesem Problem beschäftigen und anders lösen.

    So ist das eben, wenn eine Programmierspache über den eigentlichen Zweck hinauswächst und Designfehler (globale Variablen ohne explizite Definition) mitgeschleppt werden.

    In der Regel ist es so:

    • Globale Variablen sollten nur in gut begründeten Ausnahmefällen verwendet werden.
    • Muss mehr als ein Parameter übergeben werden und/oder ist die Anzahl der Parameter unbestimmt, dann übergib Arrays oder Objekte
    • Returns mit mehr als einem Parameter erfolgen als Array oder Objekt.
    var o = [...];
    var a = functionA( O );
    var b = functionA( a );
    var c = functionA( b );
    var d = functionA( c );
    return d;
    

    Spagetticode will keiner haben.

    var d = [...]; 
    for (var i=0; i < 4; i++) {
       d = functionA( d );
    }
    return d;
    

    Jörg Reinholz

    1. Hallo Jörg,

      In der Regel ist es so:

      • Globale Variablen sollten nur in gut begründeten Ausnahmefällen verwendet werden.
      • Muss mehr als ein Parameter übergeben werden und/oder ist die Anzahl der Parameter unbestimmt, dann übergib Arrays oder Objekte
      • Returns mit mehr als einem Parameter erfolgen als Array oder Objekt.

      Na dann lieg ich ja richtig :-)

      Funktionen in einer for-schleife aufzurufen hatte Ralphi schon erklärt. ich habe ihm erklärt dass diese prozedur auch anders hätte verlaufen können: von a,b,c,d kann auch d,b,a,c werden. jede Funktion ist aber in sich abgeschlossen. veränderte prozeduren können in keine schleifen gefasst werden oder? aber die funktionen kann ich so definieren das Sie allgemein gültig sind und ihren nutzen erfüllen.

      schönen Anend, mb

    2. Lieber Jörg,

      So ist das eben, wenn eine Programmierspache über den eigentlichen Zweck hinauswächst und Designfehler (globale Variablen ohne explizite Definition) mitgeschleppt werden.

      nö.

      Liebe Grüße,

      Felix Riesterer.

  3. Lieber MB,

    function konstruktor ( parameter1, ... ) {
      // public 
      this.parameter1 = parameter1;
      // Private
      var parameter2;
    
      // setter
      this.setParameter( parameter ) {
        this.parameter1 = parameter
      // getter
      this.getParameter( ) {
        return parameter1
      }
    }
    

    Dein Beispiel gefällt mir konzeptionell noch nicht. Wozu sollte ich einen Getter oder Setter für eine öffentliche Eigenschaft benötigen? Für eine private dagegen schon.

    Ich habe mehrere Übergabeparameter die ich in dem Ursprugszustand verwenden will und Übergabeparameter mit denen ich modfiziert arbeite.

    Na, dann mach doch in der Funktion Kopien von Deinen Parametern. Bei primitiven Werten (Strings, Zahlen und Bool-Werten) ist das problemlos, bei Objekten (auch Arrays zählen dazu!) braucht es das Anfertigen eines Klons.

    • Entweder deklariere ich alle zuarbeitenden variable als global. dann muss ich mich nich stressen, bezogen auf die übergabe. Jedoch ist das ungern gesehen z.B.: Überschreibungsgefahr, oder Zugriffe

    Wiebitte? Was für ein Unsinn! Du hast doch Deinen Konstruktor! Wozu da noch globale Variablen?

    • Oder aber ich mach alles private also lokal, dann habe ich den return und übergabeparamterer stress.

    Nein, Du hast nur dann "Stress", wenn Du Dir nicht genügend klar machst, was Du da aus Sicht Deiner Objektierung wie anlegen musst.

    Ich verwende beides.

    Wahrscheinlich ein Designfehler. Aber das sagt nur meine Glaskugel.

    Ich möchte gern andere und bessere methoden kennen lernen die sich mit diesem Problem beschäftigen und anders lösen.

    Dann erkläre genauer, was Du da tust und zeige echten Code! Dann kann man Dir auch besser raten.

    Ich habe Folgende Augangssituation: Beispiel eine folge von funktionen die sich verschachtelt aufrufen und was ausgeben.

    Bitte ein echtes Beispiel ohne Abstraktion. Dann kann man sich besser vorstellen, was Du eigentlich erreichen willst, denn das ergibt sich nicht immer aus der vermeintlichen Problembeschreibung und schon gar nicht aus dem Codebeispiel.

    var o = [...];
    var a = functionA( O );
    var b = functionA( a );
    var c = functionA( b );
    var d = functionA( c );
    return d;
    

    Das riecht sehr nach Designfehler.

    Ich könnte das ganze in ein funktion basteln jedoch würden dann die kapselung und ene gwisse ordnung fehlen.

    Was genau willst Du eigentlich tun?

    Ich möchte gerne wissen wie es am sinnvollsten ist diese funktion zu steuern.

    s.o.

    Liebe Grüße,

    Felix Riesterer.

    1. Lieber Felix,

      Dein Beispiel gefällt mir konzeptionell noch nicht. Wozu sollte ich einen Getter oder Setter für eine öffentliche Eigenschaft benötigen? Für eine private dagegen schon.

      is nur ne einleitung. sry wenns net klar geworden ist.

      Na, dann mach doch in der Funktion Kopien von Deinen Parametern. Bei primitiven Werten (Strings, Zahlen und Bool-Werten) ist das problemlos, bei Objekten (auch Arrays zählen dazu!) braucht es das Anfertigen eines Klons.

      jo ok. Strings sind doch ne art Array mit chars also Objekt und kein primitiv oder? Und Klonen ist mir neu oder meinst du new. konstruktoren sind ja auch objekte die erzeugt werden müssen.

      Ich verwende beides.

      Wahrscheinlich ein Designfehler. Aber das sagt nur meine Glaskugel.

      Das ist ganz richtig und definitiv so. Deine Glaskugel will ich auch haben xD.

      Dann erkläre genauer, was Du da tust und zeige echten Code! Dann kann man Dir auch besser raten.

      sorry 300 zeilen lang und es werden mehr und muss auch implementiert werden. wenn ich ihn fertig habe da lass ich dich teilhaben ;-) und schicke dir ne PN.

      Bitte ein echtes Beispiel ohne Abstraktion. Dann kann man sich besser vorstellen, was Du eigentlich erreichen willst, denn das ergibt sich nicht immer aus der vermeintlichen Problembeschreibung und schon gar nicht aus dem Codebeispiel.

      Ok, verständlich. Herzlichen Danke und ich melde mich bei dir. frühstens in der Woche.

      Herzlichste Grüße, MB

      1. Liebe(r) MB,

        ich glaube, Du hast mich falsch verstanden...

        wenn ich ihn fertig habe da lass ich dich teilhaben ;-) und schicke dir ne PN.

        Darum ging es mir nicht. Dein Projekt selbst ist für mich nicht von Interesse. Nur die gestellte Aufgabe und wie man sie technisch lösen kann, ist für mich von Interesse.

        is nur ne einleitung. sry wenns net klar geworden ist.

        Wenn etwas nicht klar beschrieben ist, dann ist sowohl das Verfassen des Postings für den Verfasser, als auch das Lesen des Postings für alle Leser eine Zeitverschwendung. Das kannst Du vermeiden.

        jo ok. Strings sind doch ne art Array mit chars also Objekt und kein primitiv oder?

        Nicht in JavaScript:

        var a = "Hallo Welt!";
        var b = a;
        a = "nix los hier...";
        alert(b); // Hallo Welt!
        

        Obiger Code demonstriert, dass Strings intern als primitive Werte gehandelt werden. In der Variable wird eine Kopie des Wertes aus a abgelegt. Deshalb ändert sich der Wert in b nicht, wenn a einen anderen Wert erhält.

        Natürlich sind a und b jeweils ein Objekt vom Typ String, aber wie man am Ende sehen kann, ändert sich der Wert in b nicht, da a und b auf verschiedene Objekte zeigen. Bei primitiven Objekten (ja, in JavaScript ist alles ein Objekt) kann man dieses Verhalten beobachten, nicht jedoch bei non-primitives:

        var a = { key: "value" };
        var b = a;
        a.key = "empty!";
        alert(b.key); // empty!
        
        var c = [42];
        var d = c;
        c.push("Hallo Welt!");
        alert(d); // 42,Hallo Welt!
        

        Obiger Code zeigt, dass das "Umkopieren" in eine andere Variable keine Kopie erzeugt, denn wenn man den Inhalt der ursprünglichen Variable (hier a und c) verändert, verändert sich der Inhalt der Kopie-Variablen (hier b und d) mit. Beim "Umkopieren" werden hier keine Kopien der Objekte selbst erzeugt, sondern nur eine Referenz auf das selbe Objekt in die Kopie-Variable abgelegt. Das erklärt, warum sich Änderungen am Original auch in der (vermeintlichen) Kopie niederschlagen.

        Und Klonen ist mir neu oder meinst du new. konstruktoren sind ja auch objekte die erzeugt werden müssen.

        Nein. Wieder ein Beispiel:

        var a = { key: "value" };
        var b = {}; // neues Objekt, ginge auch mit new Object()
        
        // clone a
        for (var k in a) {
            b[k] = a[k];
        }
        
        a.key = "empty!";
        alert(b.key); // value
        
        var c = [42];
        var d = [];
        
        // clone c
        for (var i = 0; i < c.length; i++) {
            d[i] = c[i];
        }
        
        c.push("Hallo Welt!");
        alert(d); // 42
        

        Hier kann man sehen, welche Mühen aufgewandt werden müssen, damit echte neue Objekte in den Kopie-Variablen stehen. Das ist mit "Klonen" gemeint. Mittels einer for-in-Schleife kann man "öffentliche" Eigenschaften und Methoden umkopieren (Vorsicht, wenn diese keine Primitiven sind, dann muss man diese auch wieder erst klonen!), die nicht als interne Eigenschaft oder Methode angelegt sind. Würde ich die for-in-Schleife auf das Array in Variable c anwenden, bekäme ich "length" als Eigenschaft nicht umkopiert! Die "key"-Eigenschaft in dem Objekt der Variable a dagegen wird umkopiert. Wenn Du hier Probleme bekommst, dann willst Du nach "hasOwnProperty" suchen und Dich weiterbilden.

        sorry 300 zeilen lang und es werden mehr und muss auch implementiert werden.

        Wo ist das Problem so etwas zu hosten? Du kennst wohl Tools wie jsFiddle nicht? Dort könnte man Deinen Code testen und Dir zeigen, was eventuell problematisch ist.

        Ok, verständlich. Herzlichen Danke und ich melde mich bei dir. frühstens in der Woche.

        Bitte melde Dich hier im Forum. Ich bin nicht Dein persönlicher Betreuer geworden, nur weil ich hier eine Antwort gepostet habe. Auch andere können Dir hier weiterhelfen.

        Liebe Grüße,

        Felix Riesterer.

        1. Lieber Felix,

          missverständnis sorry. und Ok ist klar geworden.

          ich kenne das clonen verfahren. nur war mir der Begriff clone unklar.

          Wo ist das Problem so etwas zu hosten? Du kennst wohl Tools wie jsFiddle nicht? Dort könnte man Deinen Code testen und Dir zeigen, was eventuell problematisch ist.

          Ich kenne jsFiddle ja. aber ich wusste weniger das die sich auch damit befassen

          Bitte melde Dich hier im Forum.

          das werde alle mal tun.

          besten Dank.

          herzliche grüße mb