2012-05-08 65 views
1

我想建立一個庫,將建立一個API的XML響應。爲了幫助說明我的問題,以下是2個示例API響應。第一個顯示菜單,第二個顯示文本。Python的API包裝設計模式

<CiscoIPPhoneMenu> 
    <Title>Title text goes here</Title> 
    <Prompt>Prompt text goes here</Prompt> 
    <MenuItem> 
    <Name>The name of each menu item</Name> 
    <URL>The URL associated with the menu item</URL> 
    </MenuItem> 
    <SoftKeyItem> 
    <Name>Name of soft key</Name> 
    <URL>URL or URI of soft key</URL> 
    <Position>Position information of the soft key</Position> 
    </SoftKeyItem> 
</CiscoIPPhoneMenu> 

...

<CiscoIPPhoneText> 
    <Title>Title text goes here</Title> 
    <Prompt>The prompt text goes here</Prompt> 
    <Text>The text to be displayed as the message body goes here</Text> 
    <SoftKeyItem> 
    <Name>Name of soft key</Name> 
    <URL>URL or URI of soft key</URL> 
    <Position>Position information of the soft key</Position> 
    <SoftKeyItem> 
</CiscoIPPhoneText> 

好了,所以我的模塊輪廓如下:

class CiscoIPPhone(object): 
    def __init__(self, title=None, prompt=None): 
     self.title = title 
     self.prompt = prompt 

class MenuItem(object): 
    def __init__(self, name, url): 
     self.name = name 
     self.url = url 

class CiscoIPPhoneMenu(CiscoIPPhone): 
    def __init__(self, *args, **kwargs): 
     super(CiscoIPPhoneMenu, self).__init__(*args, **kwargs) 
     self.items = [] 

    def add_menu(self, name, url): 
     self.items.append(MenuItem(name, url)) 

注:爲便於閱讀,我刪除了驗證和消毒這些類處理。

所以我的問題是:

  1. 幾乎輸出這些對象的序列化表示,這樣做是這個算錯了還是不好的做法?
  2. 是否有描述這種API接口類的設計模式?
  3. 是否有一個Python庫可以做類似的優雅編寫(Pythonic)? (我正在考慮像Django模型序列化的精簡版本,或者Django-Tastypie)。

回答

1

最遺憾的是,我不能評論Python的一面。

就我個人而言,我認爲這種設計是非常可以接受的。

有一個地方這些消息序列化和反序列化。使用這些類的域代碼創建一個,使用必要的數據填充它,然後將它(或其序列化表示形式)傳遞到另一個組件。當實際的序列化發生時,類本身會檢查是否已設置所有強制數據。

該課程是易於測試。您只需創建一條消息,填入一些值,然後檢查XML序列化版本。測試模式 - 檢查期望值和實際輸出。這些測試是整個協議的規範

的設計適合於一個不錯流利API

new CiscoIPPhoneMenu() 
    .withTitle("Title text goes here") 
    .withPrompt("Prompt text goes here") 
    ... 

爲了參考的目的,馬丁雷迪在API design for C++指出,對於協議或文件格式,以具有轉換爲或來自一個部件序列化表示。我認爲這正是這些課程的目的。

如果序列化表示發生了變化(例如從XML格式變爲二進制格式),那麼您可以很容易地通過例如切換表示來切換表示。提供一個接受格式的第二個ctor,或者您預期這種更改並引入SerializationFormat枚舉。

我很容易想象一個python模塊,它接受一個XML模式ComplexType並從中生成匹配的python類。一旦我嘗試使用Altova XML Spy在C#中生成這些類,然而這涉及引用一個運行時DLL,並且使用另一個DLL 只是,因爲這看起來太多開銷。這基本上是protobuf的工作方式,其中XML模式ComplexType在外部DSL中定義,並且序列化格式爲二進制格式。