2012-05-08 3 views
1

APIのXMLレスポンスを構築するライブラリを構築しようとしています。私の問題を説明するのを助けるために、2つのサンプルAPIの応答があります。最初はメニューを表示し、2番目はテキストを表示します。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ライブラリがありますか? (私はDjangoのモデルシリアライゼーション、またはDjango-Tastypieの削除版のように思っています)。

答えて

1

残念ながら、残念ながら、私は物事のPython側についてはコメントできません。

個人的には、このデザインは非常に受け入れやすいと思います。

が1つあります。これらのメッセージはシリアル化され、デシリアライズされます。これらのクラスを使用するドメインコードは、1つを作成し、必要なデータで満たし、そのシリアル化された表現を別のコンポーネントに渡します。実際のシリアライゼーションが発生すると、クラス自体はすべての必須データが設定されているかどうかをチェックします。

クラスは、試験に優しいです。メッセージを作成し、いくつかの値を入力し、XMLシリアル化されたバージョンをチェックするだけです。テストでは、期待値と実際の出力の両方をスキーマチェックします。これらのテストは、プロトコル全体の仕様です。

デザインが素敵流暢APIに自分自身を貸す:参照目的のために

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

は、マーティン・レディがAPI design for C++で述べたプロトコルやファイルフォーマットのために、またはから変換する一つの成分を持っているために、シリアライズされた表現私はこれがまさにこれらのクラスの目的だと思います。

シリアライズされた表現が(XML形式からバイナリ形式に)変更された場合、簡単に表現を切り替えることができます。フォーマットを受け入れる第2のctorを提供するか、またはその変更を予期してSerializationFormat列挙型を導入します。

私は、XMLスキーマComplexTypeをとり、そこから一致するPythonクラスを生成するPythonモジュールを簡単に想像することができます。いったん私はAltova XML Spyを使用してC#でこれらのクラスを生成しようとしました。しかし、これはランタイムDLLを参照し、別のDLLを使用してちょうどのオーバーヘッドのように見えた。これは本質的にprotobufの仕組みであり、XMLスキーマComplexTypeは外部DSLで定義され、直列化形式はバイナリ形式で定義されています。