Ankündigung

Einklappen
Keine Ankündigung bisher.

Entscheidung finden für Klassendesign

Einklappen

Neue Werbung 2019

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

  • Entscheidung finden für Klassendesign

    Ich hab eine Klasse Filter bei der ich vor habe eingabewerte aus einer liste mit verschiedenen filtern zu behandeln.
    Die Frage die ich mir stelle ist, welche Methoden sinnvoll sind. Dabei geht es um die art, wie die Klasse bzw. das daraus installierte Objekt angesprochen wird.

    Filtern möchte ich CSV-Daten in verschiedenen Variationen.

    $csv ist meine Objektvariable mit der ich per get-Funktion immer einzelne CSV-Zeilen auslese.
    Ab hier möchte ich die Array-Daten dieser an den Filter übergeben.
    Im Filter hab ich z.b. eine Methode Intersect definiert bzw geplant.
    Jetzt ist die Frage:
    übergebe ich das Objekt $csv gleich direkt der Filterklasse und lass mit per get-Filtermethode die Filterergebnisse ( z.b. Intersect ) ausgeben oder soll ich das alles aufteilen in Getter und Setter und erst eine exec-Methode definieren, die den Prozess der Filterung anstößt?

    Übergeben wird der Filterklasse vorerst also $csv und ein Array mit den Spaltennamen, welche zurückgegeben werden sollen. So will ich erreichen, das leere, Spalten oder andere Muster, die aus der Schnittmenge ragen weggeschnitten werden.

    Die Filterklasse soll dann nach und nach mit weiteren Filtermethoden erweitert werden. Da ist auch die Frage, ob eine weitere Aufteilung der Klasse sinnvoll ist oder ob man das Filtern als eine Aufgabe der Klasse allgemein betrachten darf.




    bitcoin.de <- Meine Freelancerwährung

  • #2
    $csv ist meine Objektvariable
    Hast Du kann nicht schon eine Klasse ?

    übergib doch dein CVS (File oder Object) im Constructor, mehr fällt mir bei Deiner Schilderung oben (3 mal gelesen) nicht ein.
    Unter Umständen mag es sinvoll sein ArrayAccess zu implementieren, aber wie gesagt, ich verstehe nur Bahnhof.

    Wenn Du Dich mal von CVS lösen willst und auch bspw yml bearbeiten willst, macht es gesteigerten Sinn den Filter und das Datenobject zu trennen.

    Kommentar


    • #3
      Moin, nach dem ersten Lesen hatte ich "Decorator!" im Kopf.
      Z.B. so

      PHP-Code:
      abstract class Filter {

          
      /**
           * @param DataObject $object
           * @return DataObject
           */
          
      abstract public function execute(DataObject $object);

      }


      class 
      BaseFilter extends Filter {

          
      /**
           * @param DataObject $object
           * @return DataObject
           */
          
      public function execute(DataObject $object) {
              return 
      $object;
          }

      }

      class 
      IntersectFilter extends Filter {

          
      /**
           * @var Filter
           */
          
      private $filter;

          public function 
      __construct(Filter $filter) {
              
      $this->filter $filter;
          }

          
      /**
           * @param DataObject $object
           * @return DataObject
           */
          
      public function execute(DataObject $object) {
              
      $object $this->filter->execute($object);
              
      // if... else... Logik dieses Filters
              
      return $object;
          }

      }

      class 
      LuckyFilter extends Filter {

          
      /**
           * @var Filter
           */
          
      private $filter;

          public function 
      __construct(Filter $filter) {
              
      $this->filter $filter;
          }

          
      /**
           * @param DataObject $object
           * @return DataObject
           */
          
      public function execute(DataObject $object) {
              
      $object $this->filter->execute($object);
              if (
      rand(010) < 8) {
                  
      // $object-> .... Irgendwas machen
              
      }

              return 
      $object;
          }


      Die Konfiguration und der Aufruf der Filter liefe dann so:

      PHP-Code:
      $filter = new BaseFilter();
      $intersectFilter = new IntersectFilter($filter);
      $luckyIntersectFilter = new LuckyFilter($intersectFilter);

      $dataObject = new DataObject();

      $luckyIntersectFilter->execute($dataObject); 
      BaseFilter ist der Filter, der die ursprüngliche Funktionalität bereitstellt - in diesem Fall filtert er gar nicht sondern gibt das Objekt so zurück wie es ist.
      Intersect- und Lucky-Filter sind die Dekoratoren für den BaseFilter und ergänzen ihn jeweils um ihre eigene Filter-Mechanik; z.B. wird beim LuckyFilter eine Zufallszahl geprüft und dadurch entschieden ob etwas gefiltert werden soll oder nicht.
      [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
      [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

      Kommentar


      • #4
        Zitat von Alpha Beitrag anzeigen
        $csv ist meine Objektvariable mit der ich per get-Funktion immer einzelne CSV-Zeilen auslese.
        Ab hier möchte ich die Array-Daten dieser an den Filter übergeben.
        Ja, warum nur immer einzelne CSV-Zeilen verarbeiten und nicht die gesamten CSV-Daten?
        Ich beschreibe mal kurz meine CSV-Klasse. Hoffe es bringt dir einige Anregungen.

        Die Klasse erweitert das SplFileObject, welches sozusagen schon einige Iteratoren mitbringt. Die Klasse hat mehrere Methoden ein Objekt zu erstellen.
        Bei einer großen Anzahl Anwendungen liegt ein CSV-File vor. Der Dateiname wird dem Konstruktor übergeben oder es wird eine der create-Methoden benutzt:
        PHP-Code:
        $csvFileName "checktest.csv";
        $file = new CsvFileObject($csvFileName); 
        Die Klasse verfügt über mehrere Methoden die Daten zu manipulieren und zu selektieren. So u.a.
        • Datenkonvertierung von/nach externen Zeichensätzen wie z.B. CP1252 (Window) nach UTF-8 und umgekehrt
        • Behandlung des Komma/Dezimalpunkt Problems
        • Möglichkeit der Auswahl bestimmter Spalten
        Beispiel:
        PHP-Code:
        $result CsvFileObject::create($csvFileName
          ->
        setExternCharSet("CP1252"
          ->
        setSelectedCols(array(2,0)) 
        Um Ergebnisse zu liefern stehen ebenso mehrere Methoden bereit. So kann das Ergebnis als komplettes Array geliefert werden oder auch nur bestimmte ausgewählte Zeilen.

        Wenn ich in einem Projekt irgend ein Problem mit CSV hatte, habe ich die Klasse hergenommen und entsprechend Bedarf erweitert.

        Kommentar

        Lädt...
        X