2012-05-08 23 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中定义,并且序列化格式为二进制格式。