Ankündigung

Einklappen
Keine Ankündigung bisher.

setter mit Vorbedingung vs. public

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • setter mit Vorbedingung vs. public

    Angenommen, ich habe eine Klasse C mit einer Eigenschaft $p. Diese Eigenschaft soll nur über einen setter definiert werden können. Dazu soll es eine Vorbedingung geben, dass $p ein int sein muss. Dann würde das folgendermaßen aussehen:
    PHP-Code:
    class C
    {
       private 
    $p;
       
    /**
        * @param int $p
        */
       
    function setP($p)
       {
          
    $this->$p;
       }

    Jetzt habe ich mir die Frage gestellt, wozu ich diesen setter überhaupt noch benötige. Ich mache statt dessen einfach nur das hier:
    PHP-Code:
    class C
    {
       public 
    $p// int

    Statt dem setter mit der Vorbedingung definiere ich diese Vorbedingung direkt bei der Eigenschaft.

    Läuft doch aufs Gleiche hinaus, oder?

  • #2
    Setter können halt Sachen noch validieren/anpassen:
    PHP-Code:
    /**
     * @param string $foo
     */
    public function setFoo($foo)
    {
        
    $this->foo = (string)$foo;

    So werden alle Werte in einen String konvertiert (sollte das nicht funktionieren, dann gibt es nen Fehler) und du kannst sicher sein, dass du einen String vor dir hast.
    Bei public hast du vollen Zugriff auf die Variable und dann hast du keine Volle garantie dafür.

    Außerdem kann heute jede gute IDE Setter via Alt+Einfg generieren, also ist die Tipparbeit kein wirkliches Gegenargument für Setter

    LG
    https://github.com/Ma27
    Javascript Logic is funny:
    [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

    Kommentar


    • #3
      Zitat von veryhot Beitrag anzeigen
      Angenommen, ich habe eine Klasse C mit einer Eigenschaft $p. Diese Eigenschaft soll nur über einen setter definiert werden können. Dazu soll es eine Vorbedingung geben, dass $p ein int sein muss. Dann würde das folgendermaßen aussehen:
      PHP-Code:
      class C
      {
         private 
      $p;
         
      /**
          * @param int $p
          */
         
      function setP($p)
         {
            
      $this->$p;
         }

      Jetzt habe ich mir die Frage gestellt, wozu ich diesen setter überhaupt noch benötige. Ich mache statt dessen einfach nur das hier:
      PHP-Code:
      class C
      {
         public 
      $p// int

      Statt dem setter mit der Vorbedingung definiere ich diese Vorbedingung direkt bei der Eigenschaft.

      Läuft doch aufs Gleiche hinaus, oder?
      Ich sehe keine Vorbedingung direkt bei der Eigenschaft, nur ein Kommentar.
      Weder die erste noch die zweite Variante sichern ab, das dein $p ein integer ist. Das musst du schon selber tun, z.B. so:
      PHP-Code:
      class C
      {
         private 
      $p;
         function 
      setP($p)
         {
           if(
      filter_var($pFILTER_VALIDATE_INT)) 
             {
                
      $this->= (int)$p;
                return 
      $this;
             }
             return 
      false;
         }

      Mit dieser Variante kannst du das Method-Chaining nutzen oder auch nur den Returnwert prüfen.

      Kommentar


      • #4
        Setter können halt Sachen noch validieren
        nur ein Kommentar
        Vorbedingungen sind in PHP (und vielen anderen Programmiersprachen) nur Kommentare. Und bei den Vorbedingungen geht es genau darum, NICHT in der Methode zu validieren, sondern die Verantwortung dem Client (jenem Objekt, das die Methode aufruft) zu übergeben, dass die Daten korrekt übergeben werden.

        Kommentar


        • #5
          Du hast nach dem Sinn gefragt und einem Deiner Eingangssätze
          Zitat von veryhot
          Dazu soll es eine Vorbedingung geben, dass $p ein int sein muss.
          nach zu urteilen, ist das was jspit sagt genau das, was Du wissen solltest.

          Allerdings wie Du ja geschrieben hast in Bezug auf einen Integer, bspw. so:
          PHP-Code:
          class {

              private 
          $p;


              public function 
          setP$p ) {

                  if ( 
          is_int($p) ) {

                      
          $this->$p;

                  }

                  return 
          $this;

              }


          Zitat von veryhot
          Und bei den Vorbedingungen geht es genau darum, NICHT in der Methode zu validieren, sondern die Verantwortung dem Client (jenem Objekt, das die Methode aufruft) zu übergeben, dass die Daten korrekt übergeben werden.
          Wenn Du das so siehst, erübrigt sich Deine komplette Frage!
          Aber mal ganz ehrlich, sind das nicht Basics, die ein Fortgeschrittener selbst kennen sollte?!
          Competence-Center -> Enjoy the Informatrix
          PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

          Kommentar


          • #6
            Zitat von Arne Drews Beitrag anzeigen
            Allerdings wie Du ja geschrieben hast in Bezug auf einen Integer, bspw. so:
            Das ist ein Beispiel wie man es nicht machen sollte! Damit sind Bugs praktisch vorprogrammiert...

            Kommentar


            • #7
              Worauf ich hinaus will, ist eigentlich die Frage, ob es jetzt offiziell als guter Stil gilt, wenn man in so einem Fall eine public Eigenschaft hat. Denn eigentlich ist das verpönt.

              Kommentar


              • #8
                Zitat von erc
                Das ist ein Beispiel wie man es nicht machen sollte! Damit sind Bugs praktisch vorprogrammiert...
                Joa, das hat natürlich keine Praxis-Tauglichkeit, sondern sollte nur erklärend da sein... herrjeh, nächstes mal poste ich ein komplettes Framework...
                Competence-Center -> Enjoy the Informatrix
                PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                Kommentar


                • #9
                  Zitat von erc Beitrag anzeigen
                  Das ist ein Beispiel wie man es nicht machen sollte! Damit sind Bugs praktisch vorprogrammiert...
                  Verstehe ich dich richtig?

                  PHP-Code:
                  $obj -> set('123'); 
                  liefert weder Warnung noch Error, tut nicht was erwartet wird und jeder Benutzer wird in den Glauben gelassen es ist alles in Ordnung.

                  Kommentar


                  • #10
                    Zitat von Arne Drews Beitrag anzeigen
                    Joa, das hat natürlich keine Praxis-Tauglichkeit, sondern sollte nur erklärend da sein... herrjeh, nächstes mal poste ich ein komplettes Framework...
                    Ist ja ok... aber hier lesen ebend auch Anfänger mit die die Tücken dieses Schnipsels nicht einschätzen können.

                    Zitat von jspit Beitrag anzeigen
                    Verstehe ich dich richtig?
                    Ja.

                    Kommentar


                    • #11
                      liefert weder Warnung noch Error, tut nicht was erwartet wird und jeder Benutzer wird in den Glauben gelassen es ist alles in Ordnung.
                      Ja, wenn du mit Vorbedingungen arbeitest, musst du das folgendermaßen machen (hier mit der anfänglichen setter-Methode):
                      PHP-Code:
                      if(!is_int($p))
                         throw new 
                      Exception('p');
                      $c->setP($p); 
                      Der Client muss kontrollieren.

                      Kommentar


                      • #12
                        Zitat von veryhot Beitrag anzeigen
                        Ja, wenn du mit Vorbedingungen arbeitest, musst du das folgendermaßen machen (hier mit der anfänglichen setter-Methode):
                        PHP-Code:
                        if(!is_int($p))
                           throw new 
                        Exception('p');
                        $c->setP($p); 
                        Der Client muss kontrollieren.
                        Wenn viel mit C programmiert wird ist es verständlich, in PHP empfinde ich strenge Typvorgaben (von Skalaren) und den damit verbundenen Verzicht eines impliziten Typecastings (sprich hier z.B. kein String als Parameter möglich) wie im letzten Beispiel eher als Gängelei. Es sei denn, es gibt gute Gründe dafür.

                        Kommentar

                        Lädt...
                        X