【问题标题】:Api/plugins for open source libraries?开源库的 API/插件?
【发布时间】:2010-05-01 12:54:33
【问题描述】:

每当我使用开源库时,例如。 Doctrine 我总是最终编写一个类(所谓的 Facade)来使用 Doctrine 库。

所以下次我想创建一个用户时,我只需输入:

 $fields = array('name' => 'peter', 'email' => 'peter@gmail.com');
 Doctrine_Facade::create_entity($entity, $fields);

然后它使用提供的信息创建一个实体。

所以我猜,所有编码人员都会创建自己的“外观”。

我想知道使用开源 Facades 下载并与开源库交互的情况如何?这是罕见的原因,我还没有看到任何这些。在某些框架中,我看到它们称为插件,例如。 twitter api 或 facebook api 的插件。

所以每当你下载一个库时,你应该在网上搜索插件/外观,还是尝试自己编写代码更好?我只是觉得大家最好不要重新发明轮子。

谢谢。

【问题讨论】:

    标签: php design-patterns api oop


    【解决方案1】:

    让我们说这不仅仅是关于工厂,让我们说,你真的经常为你使用的库编写 Facades。重点是什么?你为什么这样做?关键是,您以特定方式使用该库。如果您编写的 Facade 是通用的,并且每个人都倾向于编写类似的东西,那么 Facade 肯定会成为图书馆的一部分。所以它不是以及为什么要编写它的原因是,您以一种非常特定的方式使用它,这是特定于您的库应用程序的。因此,您从库的抽象过渡到应用程序的抽象。这可以从您的应用程序中消除该库的大部分复杂性,但它也限制了您使用该库的方式。所以,如果你理解我的观点,你可能会相信,发布每个 Facade 以某种方式使用库是没有意义的。但是,有时,当我们谈论一个有影响力的大库时,它与其他一些库组合在一起,构成了可以广泛使用的抽象,可能会创建新的库。

    【讨论】:

      【解决方案2】:

      Facade 的目的是 (quoting)

      • 为子系统中的一组接口提供统一接口。 Facade 定义了一个更高级别的接口,使子系统更易于使用。
      • 用更简单的接口封装复杂的子系统。

      虽然可以说以上内容适用于您的示例,但对我来说更像是AbstractFactory。您可能希望将其重命名为没有 Doctrine 部分的 EntityFactory,因为它在内部使用 Doctrine 是一个实现细节。对于 Factory 面向公众的 API,这无关紧要。也许您想稍后从 Doctrine 更改为 Propel,然后您只需要更改类中的代码,而不是 API。

      您可能还对Gateway pattern 感兴趣。

      但要回答您的问题,这是否是一种常见的方法:是的,我认为是的。抽象使代码更容易理解和维护。但是由于门面/网关的 API(无论适用)通常由应用程序的功能决定,因此很少可以重用,所以我怀疑您会在网络上找到现成的门面/网关。

      【讨论】:

        猜你喜欢
        • 2013-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-30
        相关资源
        最近更新 更多