2017-10-23 1 views
0

Ich schreibe ein Programm, das das Adaptermuster für eine Handvoll APIs verwenden wird. Ziel ist es, Daten aus jeder API kombinieren und aggregieren zu können. Das Problem ist, nicht jede API hat die gleiche Funktionalität. Zum Beispiel:Adapter Muster mit verschiedenen Fähigkeiten für jeden adptetee

API A

  • Liste alle Märkte
  • Liste spezifischer Marktpreis
  • Liste Aufträge

API B

  • Liste spezifischer Marktpreis
  • Liste Markt 24-Std.-high/low

Beachten Sie, wie API B die 24-Std.-Preis Höhen und Tiefen zu bekommen ist in der Lage, aber eine API kann nicht. In der Zwischenzeit kann API A alle verfügbaren Märkte auflisten, API B hingegen nicht.

Was ist der ideale Weg, um ein solches Szenario anzugehen?

  • Ich habe darüber nachgedacht, eine FLAGS Enumeration hat, die einzelnen Funktionen des API auflistet, aber das fühlt sich an wie auf Umwege, Dinge zu tun und erfordert eine Menge zusätzlichen Code für die Überprüfung und so weiter.
  • Ich habe für jede Fähigkeit, die die API verarbeiten kann, separate Adapter in Betracht gezogen, aber das könnte eine große Menge an Vererbung an dem Punkt erfordern, an dem jede API mehr als 5 Schnittstellen für die Aktionen verwendete.

Mein Ziel ist es, das Programm leicht zu anderen APIs in der Zukunft erweiterbar. Wenn das mein Ziel ist, wie soll ich das angehen? (Ich verwende C#, wenn das wichtig ist)

+0

Haben API A und API B einige gemeinsame Funktionen und eine von ihnen hat mehr als die andere oder sie sind völlig und völlig anders. – msoliman

+0

@msoliman Die APIs stammen alle aus verschiedenen Diensten, und das Ziel besteht darin, die empfangenen Daten zu analysieren, so dass sie immer im selben Format vorliegen. Es wird immer eine "gemeinsame" Funktionalität in dem Sinne geben, dass ein Teil davon das gleiche Ergebnis erzeugt, nachdem es geparst wurde (z. B. das aktuelle Volumen und den Preis eines bestimmten Marktes erhalten). Jede API hat jedoch auch ihre eigenen einzigartigen Funktionen (z. B. kann eine API Kontostände und Echtzeit-Bestelllisten abrufen, andere dagegen nicht). – w0ffen

+0

Ich würde separate __Adapter__ für jeden __Adaptee__ empfehlen. Der Zweck des Adapters besteht lediglich darin, die bereitgestellte Schnittstelle mit der erforderlichen Schnittstelle zu verbinden, und es ist im Allgemeinen ein Patch (der Name suggeriert selbst), wenn wir die bereitgestellte Schnittstelle (API) nicht kontrollieren können. Ich gehe davon aus, dass Ihre Adaptes nicht austauschbar sind, da ihre bereitgestellten Schnittstellen unterschiedlich sind. –

Antwort

0

Schlanke Schnittstellen sind hier dein Freund.

Verwenden Sie Ihre Beispiele:

public interface IListAllMarkets 
{ 
    List<Market> GetAllMarkets(); 
} 
public interface IListMarketPrice 
{ 
    List<MarketPrice> GetMarketPrices(); 
} 
public interface IListOrders 
{ 
    List<Order> GetOrders(); 
} 
public interface IHighLow 
{ 
    List<HighLow> GetHighLows(); 
} 

// then the class that handles the apis 

public class MyReusableClass : IListAllMarkets, 
           IListMarketPrice, 
           IListOrders, 
           IHighLow 
{ 
    private readonly ApiA _apiA = new ApiA(); 
    private readonly ApiB _apiB = new ApiB(); 

    public List<Market> GetAllMarkets() 
    { 
     return _apiA.ListAllMarkets() ; 
    } 

    public List<MarketPrice> GetMarketPrices() 
    { 
     // pretending that the business logic is try apiA first then fallback to apiB 
     var prices = _apiA.ListSpecificMarketPrices(); 
     if (prices.Count == 0) 
     { 
      prices = _apiB.ListSpecificMarketPrices(); 
     } 
     return prices; 
    } 

    public List<Order> GetOrders() 
    { 
     return _apiA.ListAllOrders(); 
    } 

    public List<HighLow> GetHighLows() 
    { 
     return _apiB.ListMarket24HourJHighsLows(); 
    } 
} 

Nachdem wir nun den Code aus dem Weg bekam, würde ich vorschlagen, dass wir die Dinge in eine vermeiden Annäherung „Wie kann ich dieses Muster verwenden X zu lösen?“, Statt Dinge aus einer Perspektive von "Ich habe dieses Problem X? Wie kann ich X lösen? Gibt es ein Muster, das kann mir helfen, es zu lösen?"

Verwandte Themen