Ankündigung

Einklappen
Keine Ankündigung bisher.

Factory-Design: Konkrete Klasse abhängig von Item-ID

Einklappen

Neue Werbung 2019

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

  • Factory-Design: Konkrete Klasse abhängig von Item-ID

    Hallo zusammen,

    folgendes Problem versuche ich gerade zu lösen, vielleicht hat jemand einen guten Rat oder kann mir sagen, ob ich mit dem Ansatz in die falsche Richtung laufe:
    • Ich habe verschiedene Angebote in einer Datenbank, die von Unternehmen bereitgestellt werden (jedes Unternehmen kann mehrere Angebote einstellen).
    • Es gibt eine Tabelle mit Angeboten und eine Tabelle mit Unternehmen, verknüpft durch eine beiderseits vorhandene Spalte id_unternehmen.
    • Ein Unternehmen kann unterschiedlichen Typs sein, z.B. kann es sehr klein sein (1 Mitarbeiter) oder ein Mittelständler (z.B. 500 Mitarbeiter) oder ein großer Konzern (z.B. 20.000 Mitarbeiter). Abhängig vom konkreten Unternehmenstyp gibt es ein leicht abweichendes Verhalten, deshalb existiert für jeden Unternehmenstyp eine eigene Klasse, die jeweils von einer Basisklasse "Unternehmen" erbt. Die Instanzierung geschieht über eine Factory-Klasse, die anhand der ID des Unternehmens den Typ ermittelt. Abhängig vom Typ wird dann die passende Klasse instanziert bzw. zurückgegeben:


    PHP-Code:
    class UnternehmenFactory {
        public static function 
    make($id_unternehmen$connection) {
            
    $sql "
                    SELECT
                        typ
                    FROM unternehmen
                    WHERE
                        id_unternehmen = :id_unternehmen"
    ;

            
    // DB-Abfrage...

            
    switch ($unternehmenstyp) {
            case 
    "mini":
                
    $unternehmen = new Einzelunternehmen();
                break;
            case 
    "medium":
                
    $unternehmen = new Mittelstaendler();
                break;
            case 
    "maxi":
                
    $unternehmen = new Konzern();
                break;
            }
            
    $unternehmen->setId($id_unternehmen);
            return 
    $unternehmen;
        }


    Wenn ich nun ein konkretes Stellenangebot vorliegen habe, möchte ich anhand der darin gespeicherten id_unternehmen nun das konkrete Unternehmensobjekt erhalten, d.h. die passende Unternehmensklasse instanzieren - mittels o.g. Factory-Klasse. Ist das Vorgehen der Factory generell ok, also einen Zwischenschritt mit DB-Abfrage zu unternehmen, der den Unternehmenstyp ermittelt?

    Bis hierhin funktioniert erst einmal alles problemlos; problematisch wird das Ganze nun aber im Zusammenspiel mit dem verwendeten Framework: Symfony2 mit Doctrine als ORM. Ich habe beide DB-Entitys mittels Annotations korrekt miteinander verknüpft (@ORM\OneToMany, @ORM\ManyToOne), allerdings muss ich in der ManyToOne-Annotation ja die bei der Instanzierung zu verwendende Klasse angeben. Eigentlich müsste hier stehen UnternehmenFactory::make($id_unternehmen, $connection), dies ist aber in Doctrine offenbar nicht so ohne Weiteres möglich.

    Hat jemand eine Anregung für mich oder einen Tipp, wie ich Doctrine die Nutzung der Factory beibringe?

    Beste Grüße
    Dominik

  • #2
    Ich denke, du hast hier ein ungünstiges Design. Eine Unternehmensform wie Einzelunternehmen ist nur eine Spezialisierung eines Unternehmens. Du erhälst also immer eine Basisklasse Unternehmen und diese wird von den unterschiedlichen Formen erweitern. Ob das so ist, ist hier leider nicht ersichtlich.

    Ich bin ausserdem weder Profi in noch Fan von ORM bzw Doctrine. Eventuell hilft dir dies weiter: http://stackoverflow.com/questions/2...oone-relations
    [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

    Kommentar


    • #3
      Danke dir für die schnelle Antwort!

      Du hast natürlich Recht - Einzelunternehmen, Mittelständler oder Konzern sind tatsächlich nur Spezialisierungen eines allgemeinen Unternehmens - da sich hieraus aber, wie beschrieben, unterschiedliches Verhalten innerhalb der Business-Logik ergibt, macht es m.E. Sinn, dieses spezifische Verhalten in Unterklassen unterzubringen, d.h. dort Methoden/Attribute zu überschreiben, ggf. Attribute zu ergänzen usw. Oder würdest du es anders lösen?

      Meine Frage ist halt zum einen, ob ich die Factory richtig gebaut habe (nämlich im eigentlichen Sinne des Entwurfsmusters) bzw. - falls sich jemand auftreiben lässt, der Plan von Symfony bzw. Doctrine hat - ob man dem ORM sagen kann, dass er bei der Herstellung von Assoziationen zwischen Entitys eine Factory statt einer konkreten Klasse benutzen soll.

      Kommentar


      • #4
        Ich würde die Logik die sich ändert auslagern und nicht in der Klasse selbst halten. Je nach Art würde ich dann die entsprechenden Schritte für diese Art einleiten.
        Zitat von derwunner
        "Ein FISI ist auf gut-deutsch der Netzwerker. Das heißt Du gehst rauß zum Kunden oder auf die Straße und verlegst Leitungen" - derwunner 2015

        Kommentar


        • #5
          Zitat von oops Beitrag anzeigen
          Danke dir für die schnelle Antwort!
          Du hast natürlich Recht - Einzelunternehmen, Mittelständler oder Konzern sind tatsächlich nur Spezialisierungen eines allgemeinen Unternehmens - da sich hieraus aber, wie beschrieben, unterschiedliches Verhalten innerhalb der Business-Logik ergibt, macht es m.E. Sinn, dieses spezifische Verhalten in Unterklassen unterzubringen, d.h. dort Methoden/Attribute zu überschreiben, ggf. Attribute zu ergänzen usw. Oder würdest du es anders lösen?
          Das würde ich anders lösen. Du speicherst ja sicher in der Unternehmenstabelle mittels einem Identflag was es für ein Unternehmen ist. Wenn innerhalb deiner Geschäftslogik nun ein Unternehmen aufgerufen wird, kontrollierst du anhand des Flags um was für ein Unternhemen es sich handelt und bringst impliziet Logik hinein. Dafür gibt es verschiedenste Ansätze und Möglichkeiten.

          Zitat von oops Beitrag anzeigen
          Danke dir für die schnelle Antwort!
          Meine Frage ist halt zum einen, ob ich die Factory richtig gebaut habe (nämlich im eigentlichen Sinne des Entwurfsmusters) bzw. - falls sich jemand auftreiben lässt, der Plan von Symfony bzw. Doctrine hat - ob man dem ORM sagen kann, dass er bei der Herstellung von Assoziationen zwischen Entitys eine Factory statt einer konkreten Klasse benutzen soll.
          Na ja in einer Factory sollten keine SQL Abfragen etc. auftauchen, dass ist dann eigentlich wieder Sache eines DAO, oder Service. Kontrolllogiken können dann durchaus in eine Factory rein gepackt werden. In deinem Fall ist eine Factory aber absolut nicht notwendig und eher fehl am Platz.
          Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
          [URL]http://www.lit-web.de[/URL]

          Kommentar


          • #6
            Hallöchen,

            dafür gibt es doch das Inheritance Mapping (Doctrine).

            Viele Grüße,
            lotti
            [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

            Kommentar

            Lädt...
            X