学习编写可重用的库

时间:2009-10-05 09:03:43

标签: python

我们需要编写简单的脚本来操纵负载均衡器的配置(即,从池中排出节点,启用或禁用流量规则)。负载均衡器有一个SOAP API(通过一堆WSDL文件定义),这是非常全面的,但使用它是非常低级别的,具有大量的手动错误检查和列表操作。它不倾向于生成可重用,健壮的代码。

我想编写一个Python库来处理与SOAP接口交互的细节,但我真的不知道从哪里开始;我所有的编码经验都是为特定的工作编写一次性的单片程序。这对于小型工作来说很好,但它并没有帮助我或我的同事 - 我们每次都用不同数量的辐条重新发明轮子:〜)

API已经提供了getPoolNames()和getDrainingNodes()等方法,但它们使用起来有点尴尬。大多数都会获取一个节点列表并返回另一个列表,因此(比如说)确定启用了哪些虚拟服务器涉及到这种情况:

names = conn.getVirtualServerNames()
enabled = conn.getEnabled(names)
for i in range(0, len(names)):
    if (enabled[i]):
        print names[i]
conn.setEnabled(['www.example.com'], [0])

这样的事情:

lb = LoadBalancer('hostname')
for name in [vs.name for vs in lb.virtualServers() if vs.isEnabled()]:
    print name
www = lb.virtualServer('www.example.com').disable()

更像Pythonic和(恕我直言)。

我有很多事情我不确定:如何处理错误,如何处理20多个WSDL文件(每个文件的SOAPpy / suds实例?)以及从API方法转换为多少样板文件我需要做的方法。

这是更广泛问题的一个例子(如何学习编写库而不是一次性脚本)所以我不想要回答这些具体问题 - 他们在那里展示我的想法并说明我的问题。我认识到当前我做事的方式有一些代码气味(一次性,不可重用的代码),但我不知道如何解决它。如何在更抽象的层面上解决问题?你如何“学习”软件设计?

3 个答案:

答案 0 :(得分:4)

“我真的不知道从哪里开始”

显然是假的。你提供了一个很好的例子。只是做更多。就这么简单。

“有很多我不确定的事情:如何处理错误,如何处理20多个WSDL文件(每个文件的SOAPpy / suds实例?)以及API方法的样板转换量根据我的方法,我需要这样做。“

  1. 通过引发异常处理错误。这就够了。请记住,您仍将使用API​​库创建高级脚本。

  2. 20多个WSDL文件?现在就选择一些东西。不要过度工程。设计API - 就像你的例子一样 - 为你想做的事情设计。随着时间的推移,WSDL和实例的数量将变得清晰。 One,Ten,Twenty对您的API库的用户并不重要。这对维护者来说很重要。关注用户。

  3. Boilerplate翻译?尽可能少。关注您使用实际脚本的这些接口的哪些部分。翻译你需要的东西,仅此而已。

  4. API不是固定的,浇铸在混凝土中,永远是美丽和快乐的东西。它只是一个模块(在你的情况下,一个软件包可能会更好),它做了一些有用的东西。

    它将经历不断的变化和演变。

    不要过度使用第一个版本。构建适用于一个用例的有用的东西。然后添加用例。

    “但如果我意识到我做错了怎么办?”这是不可避免的,你总能达到这一点。现在不要担心。

    编写API库最重要的是编写单元测试,(a)演示 如何工作;(b)证明它确实有效。

答案 1 :(得分:1)

Joshua Bloch对API设计有一个很好的presentation(从而导致了图书馆设计)。这非常值得一看。 IIRC它以Java为中心,但原则适用于任何语言。

答案 2 :(得分:0)

如果你不害怕C ++,那么有一本关于这个主题的优秀书籍叫做“大规模C ++软件设计”。

本书将引导您通过引入“物理”和“逻辑”设计来设计库的步骤。 例如,您将学会展平组件的层次结构,限制组件之间的依赖关系,以创建抽象级别。

这本书真的是关于软件设计的书恕我直言。