暴露或隐藏依赖项的对象?

时间:2009-09-15 00:24:28

标签: python

常见场景:我有一个使用其他库的库。例如,使用numpy的数学库(让我们称之为foo)。

foo的功能可以是:

  • 返回一个numpy对象(纯粹的或继承的重新实现)
  • 返回一个列表
  • 返回一个foo实现的对象,其行为类似于numpy(执行委托)

这三种解决方案也可以重申为:

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

我们当然是在利弊情景中。透明还是不透明?与底层工具的强耦合与否?我知道演习,但我正在做这个选择,我想在做出决定前分享意见。非常感谢您的建议,想法和个人经历。

2 个答案:

答案 0 :(得分:3)

既然你在谈论返回值,那不是真正关于“内部对象” - 你应该只记录你返回的对象将支持的接口(如果它是numpy.array的子集或其他什么就可以了; - )。我建议不要返回对你的内部可变属性的引用,并记录mutators工作以间接改变你自己的对象(而不是记录它并不是更好) - 这导致了在路上的方式太强大的耦合。

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

答案 1 :(得分:2)

我想到的主要问题是你的库有多少会返回numpy对象?如果它普遍存在,我将直接返回一个numpy,因为你如此束缚numpy你也可以明确表示。此外,它可能会更容易使用其他基于numpy的库。另一方面,如果你只有一些方法可以返回numpy,我会选择numpy like对象或列表,可能是numpy like对象。