Ankündigung

Einklappen
Keine Ankündigung bisher.

Verstädnis Adapter-Pattern

Einklappen

Neue Werbung 2019

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

  • Verstädnis Adapter-Pattern

    Hallo zusammen,

    ich wende seit einiger Zeit das Adapter-Pattern für externe Services an, um im Fall eines Wechsels des Dienstleisters mit möglichst geringem Aufwand diesen austausche zu können. Nun ist das Fall bereits einmal eingetreten und der Austausch hat problemlos geklappt.

    Nun ist der zweite Dienstleister dran und ich merke dass das Adapter-Pattern einen großen Nachteil hat: Es scheint mir nicht für komplexere Services geeignet oder ich verstehe/mache etwas falsch. Dazu würde ich gerne einmal etwas Feedback hören. Was ich eventuell falsch mache oder ob ich richtig mit meiner Annahme bin und welche Alternativen ich ggf habe.

    Hier ein (vereinfachtes) Beispiel:

    PHP-Code:
    interface PaymentProvider
    {
      public function 
    createPayment($price$currency);
    }

    // ---

    class PaymentProviderA implements PaymentProvider
    {
      public function 
    createPayment($price$currency)
      {
        
    // ...
      
    }

    Soweit so einfach. Nun kommt PaymentProviderB dazu, dessen API erwartet jetzt keinen Preis und Währung, sondern Produkt IDs, daraus berechnet er den Warenwert selbst. Zusätzlich lässt sich auch noch ein Gutscheincode eingeben. Das würde ja bedeuten dass ich die `createPayment` Methode erweitern müsste (Beispielcode!):

    PHP-Code:
    interface PaymentProvider
    {
      public function 
    createPayment($price null$currency null$productIds null$code null);
    }

    // ---

    class PaymentProviderA implements PaymentProvider
    {
      public function 
    createPayment($price$currency$productIds null$code null)
      {
        
    // ...
      
    }
    }


    class 
    PaymentProviderB implements PaymentProvider
    {
      public function 
    createPayment($price null$currency null$productIds$code)
      {
        
    // ...
      
    }

    Zu allem übel müsste ich anschließend noch dort wo ich "createPayment(...)" aufrufe, alles umbauen um entsprechend Produkt-IDs zu übergeben statt wie vorher den Preis. Ich muss also so viel umbauen, dass man es auch direkt ohne Adapter-Pattern machen hätte können. Übersehe ich was? Mach ich einen groben Fehler? Ich wäre für jede Hilfe dankbar.

    - Laravel

  • #2
    Ich denke, du musst das schon weiter vorne abstrahieren. Also der Code, der die Parameter für createPayment() erstellt, müsste pro Payment Provider ein anderer und somit Teil des Adapters (oder ein zusätzlicher Layer dazwischen) sein.

    Oder du machst ein Art PaymentRequest-Datenobjekt, das du an createPayment() übergibst, aber zukünftig um weitere Parameter erweitern kannst.

    Kommentar


    • #3
      Also soetwas:

      PHP-Code:
      interface CreatePayment {}

      class 
      CreatePaymentA implements CreatePayment {}
      class 
      CreatePaymentB implements CreatePayment {}

      interface 
      PaymentProvider
      {
        public function 
      createPayment(CreatePayment $data);

      oder

      PHP-Code:
      class CreatePayment
      {
        public static function 
      forPaymentProviderA($price$currency) {}

        public static function 
      forPaymentProviderB($productIds$code) {}
      }

      interface 
      PaymentProvider
      {
        public function 
      createPayment(CreatePayment $data);

      korrekt?

      Das macht ehrlich gesagt ziemlich Sinn und find ich gerade etwas erschreckend dass ich das nicht selbst gesehen habe...
      - Laravel

      Kommentar


      • #4
        Nein, ich hatte wirklich nur ein simples Datenobjekt gemeint, ohne Funktionen.

        PHP-Code:
        class CreatePayment {
            public 
        $price;
            public 
        $currency;
            public 
        $productIds;
            public 
        $code// was für ein code? variablen sollten sprechend benannt sein

        Kommentar


        • #5
          Ich merke schon, ich denke zu Kompliziert. Danke!
          - Laravel

          Kommentar

          Lädt...
          X