Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Konstruktor und Fehleingaben

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Konstruktor und Fehleingaben

    Hallo zusammen,

    dieses Problem ist mir heute zum erstmal über den Weg gelaufen und ich hoffe ihr habt da einen Tipp.
    Im Konstruktor sollte nach Möglichkeit, aufgrund von konventionen nur eine Instanzvaribalen Zuweisung stattfinden.
    Nun jabe ich aber den Fall, dass bestimmte Parameter nicht richtig sind oder keinen Sinn ergeben und und und.
    Ich könnte derartige sachen zwar im Konstruktor prüfen, dafür ist dieser aber meiner Meinung nach nicht da.
    Ich gebe euch mal ein Beispiel:
    PHP-Code:
    class copyPath
    {
       private 
    $myFromPath "";
       private 
    $myToPath    "";
       public function 
    __construct($pathTo$pathFrom)
       {
          
    $this->myFromPath $pathFrom;
          
    $this->myToPath    $pathTo;
       }
       public function 
    copy(){...}
    }

    [...]
    $oCopyPath = new copyPath("C:/whatecer/to","C:/whatecer/from");
    $cCopyPath->copy();
    [...] 
    Es wäre ja wunderschön wenn bereits vor aufruf jeglicher Funktionen der Klasse copyPath geprüft wird, ob das zu kopierende Verzeichnis existiert...
    klar man könnte das in copy() prüfen...das halte ich aber wiederum für banane, da dass objekt nur dann Sinn macht, wenn man copy ausführen kann.
    Ich weiß das Beispiel ist ein wenig stull, aber ich denke ihr versteht worauf ich hinaus will.
    Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen


  • #2
    Wieso nicht in copy() prüfen? Wenn das kopieren nicht klappt einfach versuchen den Pfad anzulegen und dann nochmal versuchen zu kopieren, wenn das auch scheitert return FALSE.

    EDIT:

    Oder eben eine Fehlermeldung werfen, oder einfach eine Ausgabe die dem Nutzer sagt das was schief ging

    Die, meiner Meinung nach, schönste Lösung mit einem if-Statement:

    PHP-Code:

    if(!$class->copy())
    {
        echo 
    "Datei konnte nicht kopiert werden, prüfen Sie den Pfad und ggf. die Schreibberechtigung von PHP in diesem Verzeichnis.";

    - Laravel

    Kommentar


    • #3
      PHP-Code:
      class copyPath
      {
         private 
      $myFromPath '';
         private 
      $myToPath    '';

         public function 
      __construct($pathTo$pathFrom)
         {
            
      $this->setFromPath($pathFrom);
            
      $this->setToPath($pathTo);
         }

         public function 
      copy(){...}

         protected function 
      setFromPath($path)
         {
            
      $this->validatePath($path);

            
      $this->myFromPath $path;
         }

         protected function 
      setToPath($path)
         {
            
      $this->validatePath($path);

            
      $this->myToPath $path;
         }

         protected function 
      validatePath($path)
         {
            
      // deine Prüfungen hier durchführen und ggf. Exception werfen
         
      }
      }

      [...]
      try
      {
         
      $oCopyPath = new copyPath('C:/whatecer/to','C:/whatecer/from');
         
      $cCopyPath->copy();
      }
      catch(
      Exception $e)
      {
         
      // ...
      }

      [...] 
      ungetestet geschrieben, Sichtbarkeit der Funktionen liegt in deinem Ermessen

      Kommentar


      • #4
        Zitat von tera3yte Beitrag anzeigen
        Die, meiner Meinung nach, schönste Lösung mit einem if-Statement:

        PHP-Code:

        if(!$class->copy())
        {
            echo 
        "Datei konnte nicht kopiert werden, prüfen Sie den Pfad und ggf. die Schreibberechtigung von PHP in diesem Verzeichnis.";

        Ich lehne mich mal weit aus dem Fenster und sage: Eine Exception wäre weitaus "schöner". Dieses inkonsistente "Funktion X wirft eine Exception, Funktion Y gibt im Erfolgsfall true, im Fehlerfall false zurück und Funktion Z gibt im Erfolgsfall alles mögliche - auch gerne mal 0 - im Fehlerfall aber false zurück" mag ich gar nicht. Was böses, böses passiert? Wirf 'ne Exception! Sollte für alles und jedes in PHP gelten. Insbesondere auch für die Funktionen, die aufgrund banaler Ereignisse Fehler generieren statt Exceptions.

        Kommentar


        • #5
          Exceptions nicht für alles, aber für fehlerhafte Parameter im Konstruktor, welche zwingend für die Funktion der Klasse notwendig sind.

          vereinfachtes Beispiel:
          PHP-Code:
            public function __construct($tplFileName) {
              if(!
          is_readable($tplFileName)) {
                  throw new 
          Exception("Error: Template-File '".$tplFileName."' is not readable");
              }
              
          // : 
          PHP-Klassen auf github

          Kommentar


          • #6
            Danke an euch.

            Exceptions hatte ich auch schon im Sinn...jedoch war mich nicht bewusst ob sowas in den Konstruktor gehört (rein Stil technisch betrachtet)
            Aber danke für die Befürwortung meiner bevorzugten Variante

            Gruß
            Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

            Kommentar


            • #7
              Musst du ja auch nicht im Konstruktor machen, pack die Prüfung samt Exception in die separate validatePath Methode und ruf diese dann vom Konstruktor aus auf. Dann kannst du mit einer Methode beliebig viele Pfade prüfen/validieren.

              Kommentar


              • #8
                Wobei die Klasse meines Erachtens eine etwas sehr abstrakte Sache modelliert. Ich finde es etwas fragwürdig, ob das Kopieren einer Datei an sich ein Ding ist, das als Instanz Sinn ergibt. Du hast da zum Beispiel überall Probleme mit state beziehungsweise TOCTOU. Du kannst prüfen, ob die Pfade beim Erstellen existieren und lesbar sind und dergleichen, aber das garantiert dir zum Beispiel noch nicht, dass das auch dann noch der Fall ist, wenn du tatsächlich mit dem Objekt irgendwas mit Seiteneffekt auslöst. (Zum Beispiel, wenn du dann wirklich die Kopie durchführen willst.) Das kann ja theoretisch wesentlich später geschehen. Das heißt, durch entsprechende Prüfungen beim Zuweisen von Werten hast du wenig gewonnen. Das garantiert dir im Grunde nichts. (Schadet aber auch nicht.) Wichtig ist, dass du prüfst, wenn du die Aktion dann tatsächlich ausführst.

                Kommentar

                Lädt...
                X