Каков лучший дизайн для этого API в этом случае? - PullRequest
4 голосов
/ 31 августа 2010

Я создаю API, который публикует данное сообщение на разных платформах (Twitter, FaceBook ...).

Проблема в том, что для каждой платформы я могу изменить упаковщик, который позволяет мне публиковатьсообщение.Например, в C # я могу опубликовать сообщение в твиттере, используя API yedda или CsharpTwitt API, для FaceBook я буду использовать другие API ...

Следовательно, я должен иметь возможность использовать различные оболочки дляопубликовать сообщение для каждой платформы.alt text

Пока что я использую этот дизайн, но ясно, что будет слишком сложно, если я добавлю больше API с большим количеством оболочек.

Я думаю, что это общая проблема дизайнаи мне интересно

  1. Использую ли я наилучший подход для получения хорошо спроектированного API?
  2. В противном случае, какой дизайн лучше всего подходит для такой ситуации?
  3. Какой шаблон дизайна применим здесь?

Ответы [ 3 ]

3 голосов
/ 31 августа 2010

Мне нравится этот подход, потому что таким образом вы можете вставлять зависимости в любую оболочку, какую пожелаете, и изменять ее одной строкой кода.

Например

Bind<Yedda>().To<ITwitter>();
Bind<FBWrapper>().To<IFacebook>();

А теперь по всему кодуITwitter на самом деле сопоставляется с Yedda оболочкой.

Внедрение зависимостей может быть чем-то стоящим.

1 голос
/ 31 августа 2010

вы можете использовать абстрактную фабрику, если вы создаете разные оболочки сообщений.

abstrcat class Abstractfactory{
       IBridge Create(int type);
}
class Platrofrm1facroty:Abstractfactory
{  
  //type m.b. for Wrapper1 to wrapperN 
  IBridge Create(int type);
}
class Twitterfacroty:Abstractfactory
{  
  //type m.b. for Yedda or CshartTwitt
  IBridge Create(int type);
}
0 голосов
/ 19 октября 2013

Я не знаком с C #, но могу предложить вам немного кода на Python в надежде, что идеи внутри могут быть полезны.

Я начну с кода клиента, чтобы показать, как используется API:

# Client code
myapi = MyAPI()
# then call different methods :
message = "Some status"
# send to all platforms
myapi.broadcast(message)
# or
myapi.send_facebook(message) # send to fb only
myapi.send_twitter(message) # send to twitter only
# or
myapi.send("facebook",message) # another way of doing the same thing

Теперь реализация:

# actual APIs
import FacebookAPI1 
import FacebookAPI2
...
import TwitterAPI1
import TwitterAPI2
...
# your individual wrappers, one for each API you want to use
# they all expose a send method
class FacebookAPI1Wrapper:
    def send(self,message):
        #use FacebookAPI1 functions

class FacebookAPI2Wrapper:
    def send(self,message):
        #use FacebookAPI2 functions

class TwitterAPI1Wrapper:
    def send(self,message):
        #use TwitterAPI1 functions

class TwitterAPI2Wrapper:
    def send(self,message):
        #use TwitterAPI2 functions

# Your API, this is the only class the client code needs.
class MyAPI:
      def __init__(self):
            # you decide internally what wrappers to use
            self.fb_api = FacebookAPI1Wrapper()                
            self.twitter_api = TwitterAPI2Wrapper()
            # No need for an intermediate level here I guess (Twitter and Platform_1 in your examples)
            # like : self.fb_api = Facebook() where Facebook chooses what wrapper to use internally (FacebookAPIWrapper)
            # it would just add unnecessary level of inderection.
            ... # other plateforms
            # hash-table-like structure, keys are plateform names, values are objects
            # this attribute is useful for the exposed send method where the first argument is a string
            # representing the name of the plateform the client wants to send a message to 
            self.plateforms = {"facebook" : self.fb_api,
                               "twitter"  : self.twitter_api
                               ...        : ...
                               }

      def broadcast(self,message):
            for plateform in self.plateforms.values() : #.values() will return the objects stored in the hash-table
                  plateform.send_message(message)

      def send_facebook(self,message):
            self.fb_api.send(message)

      def send_twitter(self,message):
            self.twitter_api.send(message)

      #...

      def send(self,plateform_name,message):
            # a simple hash table lookup
            platform = self.platforms.get(plateform_name)
            plateform.send(message)

Внутреннее изменение кода (кода реализации) не нарушит код клиента, если вы сохраняете тот же интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...