nadine: OOP: Unterschied Eigenschaften und Parameter

Guten Tag zusammen,

ich habe ursprünglich gelernt objektorientiert zu programmieren und auch in PHP versuche ich dies schon seit einiger Zeit umzusetzen.
Doch irgendwie habe ich mir heute über ein Thema Gedanken gemacht, welches ich sonst immer nach Gefühl erledige.
Wann sollten Werte Parameter einer Methode sein und wann Eigenschaften der Klasse?

Grundsätzlich ist mir klar, dass ich Eigenschaften kapseln und vererben kann, Parameter einer Methode natürlich nicht, ebenso kenne ich die Regeln der Modellierung von Klassen.

Durch Referenzen und Kapselung sind doch Parameter im Grunde theoretisch nie nötig, oder? Zudem kommt, dass die Werte, die ich in einer Methode benötige, zu 90% auch Eigenschaften der Klasse sein können.

Hat jemand vielleicht ein konkretes Beispiel wo der Unterschied zwischen Eigenschaft und Parameter deutlich wird?

Danke und Grüße!
Nadine

  1. hi,

    Durch Referenzen und Kapselung sind doch Parameter im Grunde theoretisch nie nötig, oder?

    Wenn du ein Objekt Auto hast, welches natürlich eine Konstruktor-Methode besitzt - wie legst du dann bitte ein neues Auto-Objekt mit der Karosseriefarbe "rot" an, ohne "rot" als Parameter an die Konstruktor-Methode zu übergeben ...?

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. Hi,

    Durch Referenzen und Kapselung sind doch Parameter im Grunde theoretisch nie nötig, oder? Zudem kommt, dass die Werte, die ich in einer Methode benötige, zu 90% auch Eigenschaften der Klasse sein können.

    na ja, aber bedenke die Konsequenzen. Eine Faustregel sollte sein: Alles was von außen kommt und in der Methode benötigt wird, sollte als Parameter an die Methode übergeben werden. Überlege dir mal, was ein fremder Programmierer mit deinem Code anfängt. Er sieht eine Methode verarbeiteXYZ() ohne Parameter und will die jetzt aufrufen. Woher soll er wissen, dass er die von der Methode benötigten Daten _vorher_ in die Eigenschaften legen muss? Willst du das jedes Mal in den Kommentar schreiben?

    MfG
    Rouven

    --
    -------------------
    "I wish it need not have happened in my time" - "So do I, and so do all who live to see such times. But that is not for them to decide. All we have to decide is what to do with the time that is given us."  --  J.R.R. Tolkien: "The Lord Of The Rings: The Fellowship Of The Ring"
  3. Hallo,

    gerade flyweights leben von Parametern, da sie auf so wenig Eigenschaften wie möglich setzen.

    gruss

    --
    Swiss Army Chainsaw
    Terrorific!
    VI VI VI - the editor of the beast!
  4. Hallo Nadine.

    Wann sollten Werte Parameter einer Methode sein und wann Eigenschaften der Klasse?

    Ich handhabe dies üblicherweise so, dass ich nur in der Klasse häufig wieder verwendete Objekte oder Werte als Eigenschaften der Klasse anlege. Hier hinzu gesellen sich dann noch optionale (!) Flags oder Werte, welche in der Klasse vorhandene Standardwerte bei Bedarf überschreiben können.

    Hat jemand vielleicht ein konkretes Beispiel wo der Unterschied zwischen Eigenschaft und Parameter deutlich wird?

    Beispiel DOM:

    $obj_doc = new DOMDocument;  
    $obj_doc->formatOutput = true; # Optional, mit dem Objekt lässt sich auch ohne problemlos arbeiten
    

    Gegenbeispiel:

    $obj_doc = new DOMDocument;  
    $obj_xpath = new DOMXPath($obj_doc); # Zwingend erforderlich, da man sonst nicht mit XPath arbeiten kann.
    

    Einen schönen Donnerstag noch.

    Gruß, Mathias

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
    [HTML Design Constraints: Logical Markup]
  5. Hallo Nadine,

    Hat jemand vielleicht ein konkretes Beispiel wo der Unterschied zwischen Eigenschaft und Parameter deutlich wird?

    Ich glaube, ich weiß, worauf du hinaus willst.

    Angenommen, du hast folgenden Code (im Beispiel Java):

      
    public class Raumschiff {  
      
      /**  
       * Geschwindigkeit in Metern pro Sekunde  
       */  
      public int speed = 0;  
      
      // weitere Variablen und Methoden  
      
    }
    

    Nun könnte jemand einfach daherkommen und einem Raumschiff die Geschwindigkeit von 400.000.000 Metern pro Sekunde zuweisen (Achtung: das ist schneller als die Lichtgeschwindigkeit).

    Das möchtest du eigentlich gar nicht haben, aber du hast den Fehler zu spät gemerkt. Nun möchtest du die Klasse umschreiben, sodass das Schiff maximal Lichtgeschwindigkeit erreichen kann. Schon bekommst du mit der oberen Variante Probleme, da du nun immer in jeder eigenen Methode, die auf speed zugreift, die Variable speed auf Inkonsistenz überprüfen musst.

    Mit einem Getter und einem Setter wäre das nicht passiert. Der Code wäre dann nämlich der folgende:

      
    public class Raumschiff {  
      
      /**  
       * Geschwindigkeit in Metern pro Sekunde  
       */  
      private int speed = 0;  
      
      /**  
       * Lichtgeschwindigkeit in Metern pro Sekunde  
       */  
      public static final int LIGHTSPEED = 299792458;  
      
      public int getSpeed() {  
        return speed;  
      }  
      
      public void setSpeed(int speed) {  
        if (speed > LIGHTSPEED || -speed > LIGHTSPEED) {  
          this.speed = speed;  
        }  
      }  
      
      // weitere Variablen und Methoden  
      
    }
    

    Solche Fälle kann man im Voraus nur schwer sehen, und genau deshalb sollte man IMHO alle Eigenschaften einer Klasse als privat deklarieren. Zugegriffen wird dann mittels Methoden und Parametern.

    Es gibt IMHO nur wenige Situationen, in denen öffentliche Eigenschaften nützlich sind, dazu zählen beispielsweise Klassen, die nur dazu da sind, um Daten zu speichern.

    Grüße

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
    1. Moin!

      public class Raumschiff {

      /**
         * Geschwindigkeit in Metern pro Sekunde
         */
        public int speed = 0;

      // weitere Variablen und Methoden

      }

      
      >   
      > Nun könnte jemand einfach daherkommen und einem Raumschiff die Geschwindigkeit von 400.000.000 Metern pro Sekunde zuweisen (Achtung: das ist schneller als die Lichtgeschwindigkeit).  
        
      Dein Beispiel ist recht schlau gewählt, aber in eine vollkommen andere Richtung.  
        
      Beschleunigung des Raumschiffs ist gut.  
      Angenommen, man möchte das Raumschiff um 200 km/s beschleunigen. Was ist schlauer zu programmieren?  
        
      Erst die gewünschte Änderung der Geschwindigkeit an die Eigenschaft übergeben:  
      $raumschiff->beschleunigung\_um = 200;  
      Und dann die komplexen Operationen zum Beschleunigen ausführen:  
      $raumschiff->ab\_dafuer();  
        
      Oder lieber alles in eins packen:  
      $raumschiff->picard\_energie(200);  
        
      Natürlich kann man sich getter und setter für alle Eigenschaften schreiben. Man sollte es sogar, der Direktzugriff auf Eigenschaften einer Klasse ist ja eher böse.  
        
      Und mit so einem setter kann man die Zuweisung von 200 an $raumschiff->beschleunigung\_um dann natürlich abfangen und in den Aufruf von ab\_dafuer() münden lassen. Nur ist das vom Prinzip her dann doch eher genau, wie der parametrische Aufruf von picard\_energie(200).  
        
       - Sven Rautenberg
      
      -- 
      "Love your nation - respect the others."
      
  6. Hallo nadine,

    Also irgendwie musst Du zwischen Objekten Information austauschen. Dazu wirst Du Methodenparameter benötigen. Zustandslose Objekte kann man natürlich theoretisch verwenden, in (fast) rein  objektorientierten Spachen wirst Du allerdings wieder Objekte mit Zustand brauchen, um Datenstrukturen darzustellen. Du kommst also um beides nicht herum.

    In manchen Fällen kann man natürlich einen Zustand immer wieder per Parameter übergeben oder in einer Objekteigenschaft speichern. Normalerweise sollte man letzteres tun, wenn es sich um eine Eigenschaft des Dings oder abstrakten Konstruktes handelt, das ein Objekt repräsentiert und sonst nicht.

    Allgemeingültige Regeln für den Softwareentwurf gibt es aber nunmal nicht und man kann nur grobe Richtungen vorgeben und ansonsten Vor- und Nachteile am konkreten Fall diskutieren.

    Hat jemand vielleicht ein konkretes Beispiel wo der Unterschied zwischen Eigenschaft und Parameter deutlich wird?

    Schwierig, wenn man nicht weiß, was Dich genau verwirrt. Versuch doch mal ein Beispiel zu geben, bei dem Du beide Varianten für autauschbar hältst.

    Grüße

    Daniel