Ankündigung

Einklappen
Keine Ankündigung bisher.

Exception werfen bei "unfertiger" Methode

Einklappen

Neue Werbung 2019

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

  • Exception werfen bei "unfertiger" Methode

    Hallo zusammen,

    ich habe eine kleine Frage. Ich habe eine Klasse, in der ich eine Methode habe, die von einer anderen Methode darin abhängig ist. Sprich: Es muss zuerst die andere Methode aufgerufen werden, damit die Attribute, ... befüllt werden, sodass die davon abhängige Methode aufgerufen werden kann. Das wirkt auf mich wie schlechtes Design. Soll ich eine Exception werfen, wenn die Methode, die von der anderen abhängig ist, zuerst aufgerufen wird. Denn diese braucht zuerst die befüllte Attribute, und kann beim alleinigen Aufruf nix machen, oder passt das so. Hoffe ich war verständlich.

  • #2
    Vermutung: Falsches Klassendesign.

    Magst du etwas Konzeptcode zeigen?

    Kommentar


    • #3
      Gerne, gerne. Ich arbeite an einem kleinen "Datei-Finder". Anbei ein kurzer Umriss ( Bei Bedarf gerne mehr).

      PHP-Code:
      class Finder{
          public 
      $file;
           public 
      $filePath;

         function 
      createFilePath($fileName){
          
      //aus übergabeparameter wird ein pfad erzeugt. Methode baut bei übergabe der datei z.B.
          //createFilePath('MeinA') - Source/A/MeinA, ... usw. den Pfad zusammen und returned diesen, zusätzlich
          //wird der name der datei in dem attribute $file gespeichert
          
      }

         function 
      determineCategory($getFromUrl){
           
      //determineCategory zieht parameter aus Url, reinigt diesen und übergibt diesen createFilePath
           //speichert zurückgegebenen pfad von createFilePath in attribute $filePath. Diese methode ist notwendig,
           //da sie selektieren muss. Z.B. existiert zurückgegebener dateipfad nicht, dann ruf createFilePath('DateiWennDateiNichtExistiert') auf.
         
      }

         function 
      getFile(){
            include 
      $filePath;
            return new 
      $file;
         }

      Hoffe war klar genug. Mich stört eben diese getFile - Methode, da diese bei alleinigem aufruf noch nichts machen kann und von beiden andern methoden abhängig ist.

      Kommentar


      • #4
        Ne, verstehe ich nicht wirklich. Was ist der "Core-Concern" dieses Interfaces?

        Finder: ok
        createFilePath: was hat das mit "Finden" zu tun?
        determineCategory: was hat das mit "Finden" und "createFilePath" zu tun?
        getFile: mit ist auch hier der Kontext nicht klar. "Finden" impliziert für mich die Ausgabe eines Ergebnisses. Dort hätte getFile() auch sinn gemacht.

        Habe ich da was falsch interpretiert? Bin (zu) früh hoch heute

        Kommentar


        • #5
          Kommt drauf an, welches Verhalten du erzwingen willst. Leere Methoden sind erstmal nichts ungewöhnliches und erfordern keine Exception. Die Ableitung darf/kann eigenen Code implementieren (für was auch immer die Methode auch gut sein soll), muss aber nicht.
          Willst du eine Implementierung erzwingen, solltest du auf abstract setzen oder ein Interface benutzen (oder beides in Kombination).
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            Denke beide Antworten gehen an der Frage vorbei. Ich denke nicht das es um Vererbung geht (oder leere Methoden), sondern darum, dass das Objekt erstmal unvollständig initialisiert wird. Sprich bevor er $FinderObjekt->getFile() aufrufen kann, muss davor IMMER $FinderObjekt->createFilePath(...) aufgerufen werden, weil getFile() sonst ja nicht weiß woher es die Datei holen soll.

            Kommentar


            • #7
              Genau, davon spreche ich ja. Also am einfachsten wäre das durch eine Aufspaltung der Zuständigkeiten zu erreichen:

              PHP-Code:
              $factory = new FinderFactory();
              $path $factory->createPath(...);
              $file $path->getFile(...); 

              Kommentar


              • #8
                Zitat von Tropi Beitrag anzeigen
                Ich denke nicht das es um Vererbung geht (oder leere Methoden), sondern darum, dass das Objekt erstmal unvollständig initialisiert wird.
                Ja! Und nicht mehr. Und wir sind hier im Einsteiger-Forum.

                Die Konstruktor-Methode dient dazu ein Objekt zu initialisieren. Alle Informationen, welche unbedingt notwendig sind damit dieses Objekt arbeiten kann, sollten den Konstruktor mitgegeben werden und nicht per Setter oder anders.

                Wie du im Konstruktor dein Objekt initialisierst ist dir überlassen. So kannst du auch wenn gewünscht die Arbeit in mehrere private Methoden aufteilen. Private deshalb, damit von aussen kein Zugriff möglich ist.

                Dafür mal ein Beispiel, welches an deiner Codevorgabe angelehnt ist (ohne das ich den Sinn deiner Klasse begreife):
                PHP-Code:
                class Finder{
                    public 
                $file;
                    public 
                $filePath;

                   public function 
                __construct($fileName,$getFromUrl){
                     
                //init class
                     
                $this->createFilePath($fileName);

                     
                $this->determineCategory($getFromUrl);
                     
                     
                //ev. exception werfen, wenn etwas voll daneben geht.
                   


                   public function 
                getFile(){
                      include 
                $filePath;
                      return new 
                $file;
                   }

                   private function 
                createFilePath($fileName){
                    
                //aus übergabeparameter wird ein pfad erzeugt. Methode baut bei übergabe der datei z.B.
                    //createFilePath('MeinA') - Source/A/MeinA, ... usw. den Pfad zusammen und returned diesen, zusätzlich
                    //wird der name der datei in dem attribute $file gespeichert
                    
                }

                   private function 
                determineCategory($getFromUrl){
                     
                //determineCategory zieht parameter aus Url, reinigt diesen und übergibt diesen createFilePath
                     //speichert zurückgegebenen pfad von createFilePath in attribute $filePath. Diese methode ist notwendig,
                     //da sie selektieren muss. Z.B. existiert zurückgegebener dateipfad nicht, dann ruf createFilePath('DateiWennDateiNichtExistiert') auf.
                   
                }


                }

                //Objekt erstellen
                $myFinder = new finder('filename','url'); 
                LG jspit

                Kommentar


                • #9
                  Herzlichen Dank, jetzt hab ich's. Manchmal hat man echt 'n brett vorm Kopf -.-

                  Kommentar

                  Lädt...
                  X