jan: Funktion/Methode ohne Datenkapselung

Wenn ich eine Funktion erstelle, kann diese Funktion ja nicht auf variablen des aufrufenden Programm zugreifen. Da ich meinen Code übersichtlicher gestalten will wollte ich nun den Code in verschiedene "Methoden" unterteilen. Leider können diese dann ja nicht auf die variablen des aufrufenden Programm zugreifen. Variablen übergeben und zurückgeben wäre zu umständlich. gibt es noch ne andere Möglichkeit wie ich das lösen könnte?

  1. Hi,

    Wenn ich eine Funktion erstelle, kann diese Funktion ja nicht auf variablen des aufrufenden Programm zugreifen.

    doch. Du solltest die globalen Variablen allerdings auf ein Minimum reduzieren, also z.B. in Objekten organisieren.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. doch. Du solltest die globalen Variablen allerdings auf ein Minimum reduzieren, also z.B. in Objekten organisieren.

      hi, danke schonmal für die antwort. kannst du mir noch kurz sagen, warum die variablen auf ein minimum reduziert werden sollten?

      1. Hi,

        hi, danke schonmal für die antwort. kannst du mir noch kurz sagen, warum die variablen auf ein minimum reduziert werden sollten?

        globale Variablen sind schlechte Datenkapselung. Globale Objekte kapseln dies wenigstens ;-) Und ganz pragmatisch betrachtet: Es ist leichter, in jeder Funktion ein oder zwei Objekte aus dem globalen Scope zu holen und dessen Member und Methoden zu verwenden, als ständig dutzende von Variablen bereitzustellen.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo,

    Gibt es noch ne andere Möglichkeit wie ich das lösen könnte?

    Entweder die Variablen in der Funktion als global definieren, oder mit KONSTANTEN arbeiten, sofern möglich, oder die Variablen in einem Array sammeln, dann musst Du nur "eine Variable" (das Array) übergeben.
    Mehr fällt mir dazu ad hoc nicht ein.

    netten Tag
    ^da Powl

    --
    ===============================
    powl.hat-gar-keine-homepage.de/
  3. echo $begrüßung;

    Da ich meinen Code übersichtlicher gestalten will wollte ich nun den Code in verschiedene "Methoden" unterteilen.

    Das ist ein sehr löbliches Anliegen.

    Leider können diese dann ja nicht auf die variablen des aufrufenden Programm zugreifen.

    Das allerdings widerspricht dem Sinn einer Funktion. Eine Funktion sollte eine spezielle Aufgabe kapseln, ohne von der Umgebung, in der sie läuft, etwas wissen zu müssen. Nur so kann man sie bei Bedarf auch einmal woanders einsetzen.

    Wenn sie stattdessen beispielsweise ihre Aufgabe erfüllt, indem sie immer auf die globale Variable $a zugreift, du sie aber in einem anderen Script auf Variable $b anwenden willst, hast du den Salat.

    Es ist auch nicht sehr übersichtlich, wenn eine Funktion Nebenwirkungen hat, die man nicht bei ihrem Aufruf sieht.

    $x = 23;
      $y = 42;
      funktionsaufruf();

    Welchen Wert hat nun $x? Auf den ersten Blick würde man meinen, er sei immer noch 23. Dass er innerhalb funktionsaufruf() geändert wird ist nicht zu erkennen.

    $x = 23;
      $y = 42;
      $x = funktionsaufruf($x, $y);

    Hier sieht man, dass $x geändert wird und dazu sein bisheriger Wert und der von $y herangezogen wird.

    Variablen übergeben und zurückgeben wäre zu umständlich. gibt es noch ne andere Möglichkeit wie ich das lösen könnte?

    Dein Anliegen ist es, mehr Übersicht in deinen Scriptcode zu bringen. Wenn du dabei die Funktionalitäten nicht klar abgrenzen kannst, so dass sich von globalen Werten unabhängige Funktionen ergeben, so würde ich auf die Funktionen verzichten. Stattdessen könntest du den Quelltext durch Leerzeilen und Kommentare bzw. -blöcke optisch auflockern. Besonders dann ist das zu empfehlen, wenn es sich um mehr oder weniger "Geradeaus"-Scripte handelt, die wenig oder kaum entscheidungsabhängig verzweigen.

    Zwei Beispiele:

    1. ein kleines klassisches EVA-Prinzip

    • Entgegennahme von Suchkriterien
    • Abfragen der Datensätze die den Kriterien entsprechen
    • Abfrage erfolgreich?
        - ja:
          - solange Datensätze vorhanden sind
            - Ausgabe eines Datensatzes
        - sonst: Tröstmeldung

    2. Ausgabe von bestimmten Artikeln soll anders aussehen

    • Entgegennahme von Suchkriterien
    • Abfragen der Datensätze die den Kriterien entsprechen
    • Abfrage erfolgreich?
        - ja:
          - solange Datensätze vorhanden sind
            - Wenn Sonderangebot:
              - Ausgabe eines Datensatzes, Hervorhebung als Sonderangebot
            - Wenn Topseller:
              - Ausgabe eines Datensatzes, Hervorhebung als Topseller
            - sonst:
              - Ausgabe eines Datensatzes
        - sonst: Tröstmeldung

    Für Beispiel 1 sehe ich den Einsatz einer Funktion zur "Ausgabe eines Datensatzes" nicht unbedingt als gerechtfertigt an. Beispiel 2 wird schon komplexer. Hier finde ich einen Funktionseinsatz schon eher angebracht.

    echo "$verabschiedung $name";