2009-09-15 141 views
1

常见情况:我有一个使用其他库的库。例如,一个使用numpy的数学库(我们称之为foo)。 FOO的暴露或隐藏依赖对象?

功能可以:

  • 返回一个numpy的对象(无论是纯的或遗传的重新实现)
  • 返回列表
  • 返回一个Foo实现的对象行为类似numpy的(执行委托)

的三种解决方案,也可以重新表述为:

  • foo通过内部使用的对象,清楚地说明它的库依赖性也是一个API依赖性(因为它返回的对象服从numpy库的接口)
  • foo利用了部分对象的公共子集的语言基础。
  • foo完全隐藏了它在内部使用的内容。底层库没有任何内容从foo库转义到客户端代码。

我们当然是在一个利弊情景。透明或不透明?与底层工具的强大耦合与否?我知道演习,但我正在做这个选择,我想在做出决定之前分享意见。建议,想法,个人经验,不胜感激。

回答

2

我会考虑的主要问题是你的库会返回多少numpy对象?如果它普遍存在,我会直接返回一个numpy,因为你与numpy紧密联系在一起,所以你不妨明确表示它。另外它可能会使它更容易使用其他基于numpy的库。另一方面,如果你只有几个返回numpy的方法,我会选择像对象或列表那样的numpy,可能是像对象那样的numpy。

+0

+1:不浪费时间包装或隐藏任何东西。只要返回其他库的对象。 – 2009-09-15 00:57:59

+0

S.洛特:我不知道。它看起来很有吸引力,但如果其他图书馆搞砸了怎么办?如果您稍后想要更好地改变它,该怎么办?如果你想腌制它,你不想腌制图书馆的物品,但你自己?根据我的经验,我很少看到图书馆返回其他图书馆的对象。图书馆倾向于全面包装下面的内容。 – 2009-09-15 01:03:08

+1

如果其他磁带库拧紧,则将其暴露出来 - 您暴露了螺丝 - 使调试成为可能*。大多数Python库都建立在他们仅仅通过的其他库上。看看urllib2如何依赖于其他东西。你不能隐藏别人的“搞砸”。这是(a)不可能的,(b)仅仅在问题上分层问题。 – 2009-09-15 01:32:21

3

由于你谈论的是返回值,这不是真的关于“内部对象” - 你应该记录你返回的对象将支持的接口(没关系,如果这是numpy.array或其他;-)的子集。我建议不要返回一个对你的内部可变属性的引用,并记录mutators间接地改变你自己的对象(而不是记录它好得多) - 这会导致路上太强大的耦合。

如果你在谈论实际的内部对象,我会推荐Law of Demeter - 如果客户端编码为a.b.c.d.e.f(),那么简单的阅读,那么有些东西是非常错误的(“只有一个点”可能有时是极端的, “四个都是正确的”)。再次,问题在于强大的耦合 - 使您无法在不破坏一百万个客户端的情况下以较小的方式更改您的内部实现......!

+0

嗯,是的。我不恰当地谈论内部物体。我指的是“依赖对象”。 – 2009-09-15 09:51:55